Шифрование Web.Config (Web.Release.config) Преобразование файлов с помощью aspnet_regiis

У меня есть требование не хранить конфиденциальную информацию (например, имена пользователей и пароли) в системе управления версиями. Мы делаем приложение .NET 4.5 MVC, поэтому я планировал зашифровать файл web.config с помощью aspnet_regiis.exe и встроенных функций ASP.NET. У меня нет проблем с тем, чтобы заставить это работать здесь, но проблема, с которой я столкнулся, заключается в том, что я также хотел бы зашифровать преобразования (Web.Release.config и т. д.), поскольку они также содержат конфиденциальную информацию. Я огляделся и не видел никакого способа сделать это. Кто-нибудь знает способ сделать это?


person bechbd    schedule 16.04.2014    source источник
comment
Как насчет того, чтобы не включать файл web.config в систему управления версиями? И/или проверка пустого файла, и разработчик должен будет скопировать и настроить файл конфигурации перед использованием?   -  person gunr2171    schedule 16.04.2014
comment
@ gunr2171 gunr2171 Я не могу говорить за ОП, но я сталкиваюсь с тем же, потому что использую свой контроль версий для непрерывного развертывания. Обычно я бы сказал, что альтернативой является размещение строки подключения в web.config или machine.config более высокого уровня, но этот подход, к сожалению, неприемлем при развертывании в веб-службах Azure.   -  person Kelly Gendron    schedule 01.06.2014
comment
@BrianDiggs, если вы ссылаетесь на эту статью Скотта Хансельмана, вот как я защищаю частную жизнь настройки приложения и строки подключения.   -  person Nkosi    schedule 04.08.2017
comment
Я ценю дополнительные ответы и идеи, которые были добавлены к этому вопросу. В то время как большинство из них предоставили превосходные подходы к обработке защищенной/секретной информации, я присудил награду тому, который касался узкого вопроса шифрования в aspnet_regiis поместье web.release.config файла на месте.   -  person Brian Diggs    schedule 11.08.2017


Ответы (7)


Способ, которым я смог выполнить эту работу, заключался в том, что я зашел на каждую машину и зашифровал там файл web.config с помощью правильной строки подключения, а затем скопировал раздел только что зашифрованной строки подключения в соответствующее преобразование web.cong. Это огромная боль, но это работает.

person bechbd    schedule 28.07.2014
comment
Из-за этой проблемы мы перешли на использование централизованного хранилища конфигурации. Эта статья может быть вам интересна Простой трюк для централизации конфигурации .NET - person Albert; 07.08.2017
comment
Посмотрите мое решение, если оно решит вашу проблему - person muhammad hasnain; 08.08.2017
comment
Спасибо @tjeuten! - person Syntax Error; 08.02.2018

Вы можете хранить файл преобразования продукции в хранилище секретов, доступ к которому есть только у вашей оперативной группы. Ваша система CI будет ссылаться на оба репозитория и копировать файл преобразования из вашего репозитория секретов в каталог сборки и компилировать, как вы это делаете сейчас.

Это удалит все конфиденциальные значения конфигурации из вашего основного репозитория и по-прежнему позволит вам использовать возможности преобразования.

person Babak Naffas    schedule 07.08.2017

Попробуйте следующее, я только что привел пример защиты строки подключения. Замените тег, который вы хотите заменить, используя System.Configuration;

 ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
                configMap.ExeConfigFilename = modulePath + "Web.Release.config";
                System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
                System.Configuration.ConfigurationSection section = config.GetSection("connectionStrings");
                if (!section.SectionInformation.IsProtected)
                {
                                   section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
                    config.Save();
                }
person muhammad hasnain    schedule 08.08.2017
comment
Я получил ошибку 'xdt' is an undeclared prefix, которую я использовал для xdt:Transform="SetAttributes" xdt:Locator="Match(name)". Есть идеи? - person Sam; 02.06.2020

Существует несколько различных способов справиться с этим в зависимости от ваших потребностей и различных типов доступа, которые вы и ваша команда разработчиков имеете к серверам.

Вариант 1. Вернуть зашифрованные файлы преобразований в систему управления версиями.

Создайте файл web.config и зашифруйте параметры приложения и строки подключения с помощью aspnet_regiis.exe. Затем в вашем преобразовании (например, web.release.config) для каждой среды используйте следующие значения:

<appSettings configProtectionProvider="ProviderName" xdt:Transform="Replace">
<EncryptedData>.....</EncryptedData
</appSettings>

Если вы используете разных провайдеров в каждой среде (так и должно быть), вам нужно будет выполнить шифрование для каждой среды.

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

Вариант 2. Используйте Transforms + Token Replace и Encrypt на месте на сервере

Для этого варианта вы должны использовать свои традиционные преобразования, но заменить все конфиденциальные данные токенами, такими как {{WebServicePassword}}. Замена токена — это обычная функциональность, существующая в большинстве средств развертывания. В этом случае вы должны создать переменную в своем инструменте развертывания (VSTS, UrbanCode и т. д.), которая имеет истинное значение {{WebServicePassword}}. Затем вам нужно будет настроить свое развертывание для замены токенов, и конкретные детали этого будут отличаться в зависимости от рассматриваемого инструмента развертывания. После развертывания файла запустите aspnet_regiis.exe удаленно на сервере, чтобы зашифровать файл web.config на месте.

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

Лично я предпочитаю вариант № 2, так как он позволяет вам видеть все ключи настроек приложения, и вы можете легко обрабатывать изменения ключей (не значений) с помощью запросов на включение/проверки кода. Имея дело с зашифрованными значениями appsettings/databaseconnections в системе управления версиями, вы понятия не имеете, действительно ли зашифрованное значение содержит ключи, необходимые вашему приложению.

person DenverDev    schedule 10.08.2017
comment
Вариант 1 не работает. Вам необходимо включить пространство имен xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0", чтобы использовать EncryptedData, иначе Visual Studio выдаст сообщение об ошибке: Failed to decrypt using provider 'RsaProtectedConfigurationProvider'. Error message from the provider: The RSA key container could not be opened.. После добавления пространства имен Visual Studio почему-то игнорирует xdt:Transform="Replace". - person Neurion; 22.01.2021

Существует один способ шифрования конфиденциальной информации с помощью Protected Конфигурация, иначе вам нужно сохранить файл в любой папке внутри appdata и зашифровать его с помощью приложения

person Saneesh kunjunni    schedule 04.08.2017

У меня есть требование не хранить конфиденциальную информацию (например, имена пользователей и пароли) в системе управления версиями.

Да, вы не должны, и один из способов добиться этого — использовать либо переменные среды, либо параметры конфигурации на уровне пользователя. По словам Майкрософт

В процессе разработки

Элемент appSettings имеет атрибут файла, который позволяет указать внешний файл, содержащий конфиденциальные параметры конфигурации приложения. Вы можете переместить все свои секреты во внешний файл, если внешний файл не зарегистрирован в вашем исходном дереве.

Then you can do something like:

</connectionStrings>
   <appSettings file="relative\path\to\AppSettingsSecrets.config">          
   </appSettings>
  <system.web>

Что касается строк подключения

Вы можете использовать атрибут configSource, чтобы заменить всю разметку. В отличие от атрибута файла, который объединяет разметку, атрибут configSource заменяет разметку.

Во время развертывания

Вы можете перейти на портал управления Azure и установить их вручную в разделе Веб-приложения > ваше веб-приложение > Все настройки > Настройки приложения.

проверьте эта ссылка для дальнейшего ознакомления

person Yordan    schedule 09.08.2017
comment
Вы предполагаете, что OP использует Azure, хотя в контексте их вопроса похоже, что это не так. - person Michael Coxon; 10.08.2017

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


Наша установка такая...

В проекте web.config есть все стандартные вещи для разработчиков. Включая любые настройки приложения для разработки, которые в производственной среде будут считаться частными. В нашем случае не имеет значения, что эти настройки зарегистрированы, поскольку они предназначены только для нашего внутреннего использования. Преобразования удаляют всю эту информацию при публикации.

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

Следующим шагом является то, что сборка переименовывает web.config в web.config.default. Это позволяет нам предоставить файл конфигурации, в котором есть все настройки по умолчанию, характерные для этой сборки, но без конфиденциальных данных.

При первом развертывании человек, выполняющий развертывание, должен переименовать web.config.default в web.config и заполнить конфиденциальную информацию. Оттуда они могут выбрать, следует ли шифровать информацию.

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

Кроме того, ручные шаги здесь также можно автоматизировать с помощью какого-либо установщика...

person Michael Coxon    schedule 10.08.2017