ASP.NET Шифрование — aspnet_regiis — Ферма

#c# #asp.net #.net #encryption #aspnet-regiis.exe

#c# #asp.net #.net #шифрование #aspnet-regiis.exe

Вопрос:

У нас есть веб-сайт, который использует «NT Authority Network Service».

 Response.Write(WindowsIdentity.GetCurrent().Name); 
  

В настоящее время мы используем следующую команду для шифрования файлов конфигурации.

 aspnet_regiis -pc "NetFrameworkConfigurationKey"
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AuthorityNetwork Service"
aspnet_regiis.exe -pef "connectionStrings" "C:WebAppLocationFolder"
  

Примечание: мы не используем «-exp». Когда мы используем «-exp», это не создает контейнер ключей RSA.

КАК вы можете видеть, мы используем ключ по умолчанию — NetFrameworkConfigurationKey. На нашем веб-сайте есть балансировщик нагрузки. Доступны веб-серверы 1 (W1) и WebServer2 (W2).

Если я буду следовать вышеупомянутым командам, мы будем использовать отдельные ключи для W1 и W2. Однако веб-сайт работает с этим подходом.

Достаточно ли такого подхода? Есть ли у него какие-либо недостатки или дыры в безопасности? Произойдет ли сбой в любом сценарии?

Примечание: Машинный ключ добавлен в наш web.config. Это то же самое в обеих конфигурациях. Однако наши данные configProtectedData отсутствуют в Web.Config. Кроме того, я думаю, что NetFrameworkConfigurationKey будет отличаться на обоих серверах.

Я прочитал следующую статью msdn для шифрования в сценариях веб-фермы. http://msdn.microsoft.com/en-us/library/ff650304.aspx

Ответ №1:

Мне кажется, что вы все сделали правильно. Прежде всего, здесь есть две проблемы:

  1. Обеспечение machineKey одинакового на обоих веб-серверах.
  2. Обеспечение того, чтобы один и тот же закрытый ключ RSA был установлен в контейнере ключей на обоих серверах, чтобы зашифрованная конфигурация могла быть расшифрована каждым сервером.

Это отдельные проблемы: machineKey не имеет отношения к шифрованию / дешифрованию раздела конфигурации, который вы хотите защитить.

Итак, прежде всего aspnet_regiis -pc , команда используется для создания нового контейнера ключей RSA, и причина ее сбоя заключается в том, что указанное вами имя контейнера уже существует, поскольку оно используется по умолчанию. Пара ключей в этом контейнере не экспортируется, поэтому вам нужно создать новый контейнер ключей и указать -exp переключатель, чтобы указать, что пара ключей экспортируема.

 aspnet_regiis -pc "MyDeploymentKeyContainer" -exp
  

Затем экспортируйте ключ в файл, включая закрытый ключ: закрытый ключ используется для расшифровки раздела конфигурации, поэтому он понадобится веб-серверу.

 aspnet_regiis -px "MyDeploymentKeyContainer" deploykey.xml -pri
  

Теперь добавьте раздел конфигурации в свой web.config и сохраните его.

 <configProtectedData>
  <providers>
  <add keyContainerName="MyDeploymentKeyContainer" 
           useMachineContainer="true"
           description="Uses RsaCryptoServiceProvider to encrypt and decrypt"
           name="DeploymentProvider"
     type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</configProtectedData>
  

Затем зашифруйте раздел web.config, указав имя поставщика, как показано выше (здесь это «DeploymentProvider»)

 aspnet_regiis -pef "connectionStrings" "C:WebAppLocationFolder" -prov "DeploymentProvider"
  

Теперь вам нужно развернуть приложение на обоих серверах и импортировать контейнер ключей RSA, который вы экспортировали в файл ранее. Скопируйте файл и запустите на каждом сервере:

 aspnet_regiis -pi deploykey.xml
  

Как только это будет сделано, удалите файл с сервера — вы не хотите, чтобы он зависал. Наконец, предоставьте учетной записи пользователя для пула приложений, в котором запущено ваше веб-приложение, доступ к контейнеру ключей на обоих веб-серверах.

 aspnet_regiis -pa "MyDeploymentKeyContainer" SomeDomainSomeAccount
  

Ответ №2:

Все, что вы делаете, прекрасно, но я также рекомендую вам вставить machinekey machine.config вместо web.config . Это значение обычно меняется не часто и снижает вероятность случайного изменения при изменении web.configs.

Это также позволит вам масштабировать будущие приложения, не затрачивая все больше и больше web.config.

Ответ №3:

Я решил это таким образом:

 aspnet_regiis -pi "MyDeploymentKeyContainer" "c:keys.xml"