#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:
Мне кажется, что вы все сделали правильно. Прежде всего, здесь есть две проблемы:
- Обеспечение
machineKey
одинакового на обоих веб-серверах. - Обеспечение того, чтобы один и тот же закрытый ключ 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"