1. Введение
При создании приложений ASP.NET 2.0 разработчики обычно хранят конфиденциальную информацию о конфигурации в файле Web.config. Наиболее типичным примером является строка подключения к базе данных, но другая конфиденциальная информация, включенная в файл Web.config, включает информацию о подключении к SMTP-серверу, данные учетных данных пользователя и т. д. Хотя ASP.NET по умолчанию можно настроить на отклонение всех HTTP-запросов к файловым ресурсам с расширением .config, однако, если хакер сможет получить доступ к файловой системе вашего веб-сервера, конфиденциальная информация все равно может быть украдена; Например, возможно, вы случайно разрешили анонимный FTP-доступ к своему веб-сайту, тем самым позволив хакеру просто загрузить ваш файл Web.config через протокол FTP.
К счастью, ASP.NET 2.0 помогает решить эту проблему, позволяя шифровать выбранные части файла Web.config, такие как раздел
В этой статье мы обсудим, как программно зашифровать и расшифровать этот раздел настроек конфигурации, а также рассмотрим использование программы командной строки aspnet_regiis.exe. Затем мы оценим параметры шифрования, предоставляемые ASP.NET 2.0. Кроме того, мы кратко обсудим, как шифровать информацию о конфигурации в ASP.NET версии 1.x.
2. Предпосылка
Прежде чем мы начнем обсуждать, как шифровать информацию о конфигурации ASP.NET 2.0, помните следующие моменты:
1. Все формы шифрования содержат какой-то секрет, и этот секрет используется при шифровании и расшифровке данных. Алгоритмы симметричного шифрования используют один и тот же ключ при шифровании и расшифровке сообщения, тогда как алгоритмы асимметричного шифрования используют разные ключи для шифрования и дешифрования. Независимо от того, какая технология используется, самое главное — насколько надежен ключ дешифрования.
2. Технология шифрования конфигурации, предоставляемая ASP.NET 2.0, предназначена для предотвращения возможности хакеров каким-либо образом получить ваши файлы конфигурации. Идея в том, что если на компьютере хакера есть ваш файл Web.config, то он не сможет взломать зашифрованную часть. Однако когда страница ASP.NET на веб-сервере запрашивает информацию из зашифрованного файла конфигурации, данные необходимо расшифровать, прежде чем их можно будет использовать (и это происходит без написания кода). Таким образом, если хакер сможет загрузить в вашу систему веб-страницу ASP.NET, которая запрашивает файл конфигурации и отображает его результаты, он сможет просмотреть зашифрованные настройки в виде обычного текста. (Для получения подробной информации обратитесь к образцу страницы ASP.NET, представленному в этой статье, где показано, как шифровать и расшифровывать различные части файла Web.config; как видите, страница ASP.NET может получать доступ (и отображать) зашифрованные данные (обычная текстовая форма).
3. Шифрование и дешифрование информации о конфигурации требует определенных затрат производительности. Поэтому обычно шифруют только те части конфигурации, которые содержат конфиденциальную информацию. Например, может не потребоваться шифрование разделов конфигурации
3. Какую информацию можно зашифровать?
Прежде чем мы проанализируем, как зашифровать информацию о конфигурации ASP.NET 2.0, давайте сначала посмотрим, какая информация о конфигурации может быть зашифрована. Используя библиотеки, предоставляемые .NET Framework 2.0, разработчики могут зашифровать большинство разделов конфигурации в файле Web.config или Machine.config. Эти части конфигурации представляют собой элементы XML, которые являются дочерними узлами элемента
<?xml версия="1.0"?>
<configuration xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<Строки подключения>
<add name="MembershipConnectionString" ConnectionString="connectionString"/>
</connectionStrings>
<система.веб>
<отладка компиляции="true"/>
<режим аутентификации="Формы" />
Каждый из этих разделов может быть дополнительно зашифрован либо программно, либо с помощью aspnet_regiis.exe (инструмент командной строки). В зашифрованном виде зашифрованный текст сохраняется непосредственно в файле конфигурации. Например, если бы мы зашифровали раздел
<configuration xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<Зашифрованные данные>
<Данные шифра>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
</ЦиферДанные>
</ЗашифрованныеДанные>
</connectionStrings>
<система.веб>
<отладка компиляции="true"/>
<режим аутентификации="Формы" />
</system.web>
Кроме того, есть некоторые части конфигурации, которые невозможно зашифровать с помощью этого метода:
· <processModel>
· <время выполнения>
· <мскорлиб>
·<стартап>
· <system.runtime.remoting>
· <configProtectedData>
· <спутниковые сборки>
· <Настройки криптографии>
· <Сопоставление криптоимен>
·
Чтобы зашифровать эти части конфигурации, необходимо зашифровать эти значения и сохранить их в реестре. Существует инструмент командной строки aspnet_setreg.exe, который может помочь вам в этом процессе; мы обсудим этот инструмент позже в этой статье.
[Совет] Разница между Web.Config и Machine.Config:
файл Web.config определяет параметры конфигурации для конкретного веб-приложения и находится в корневом каталоге приложения, а файл Machine.config определяет все расположенные параметры конфигурации; на веб-сервере параметры конфигурации для сайта, расположенные в каталоге $WINDOWSDIR$Microsoft.NetFrameworkVersionCONFIG.
4. Параметры шифрования.
Разработчики могут использовать модель поставщика ASP.NET 2.0 для защиты информации раздела конфигурации, что позволяет легко подключать любую реализацию к API. .NET Framework 2.0 предоставляет два встроенных поставщика для защиты информации раздела конфигурации:
· Поставщик API защиты данных Windows (DPAPI) (DataProtectionConfigurationProvider): этот поставщик использует встроенную технологию шифрования Windows для шифрования и дешифрования разделов конфигурации. По умолчанию этот провайдер использует собственный ключ. Вы также можете использовать пользовательские ключи, но это требует некоторой настройки.
· Поставщик защищенной конфигурации RSA (RSAProtectedConfigurationProvider): использует шифрование с открытым ключом RSA для шифрования и расшифровки разделов конфигурации. Используя этого поставщика, вам необходимо создать контейнер ключей, в котором будут храниться открытые и закрытые ключи, используемые для шифрования и расшифровки информации о конфигурации. Вы можете использовать RSA в ферме с несколькими серверами, создав экспортируемые контейнеры ключей.
Конечно, при необходимости вы также можете создать собственного поставщика настроек защиты.
В этой статье мы обсуждаем только использование ключей машинного уровня с использованием поставщика DPAPI. Это, безусловно, самый простой метод, поскольку он не требует создания каких-либо ключей или контейнеров ключей. Недостатком, конечно, является то, что зашифрованный файл конфигурации можно использовать только на том веб-сервере, который изначально реализовал шифрование; кроме того, использование машинного ключа позволит расшифровать зашифрованный текст любым сайтом на веб-сервере;
5. Программно зашифровать раздел конфигурации.
Класс System.Configuration.SectionInformation абстрагирует описание раздела конфигурации. Чтобы зашифровать раздел конфигурации, просто используйте метод ProtectSection(provider) классаsectionInformation, передав имя поставщика, которого вы хотите использовать для шифрования. Чтобы получить доступ к определенному разделу конфигурации в файле Web.config вашего приложения, вы можете использовать класс WebConfigurationManager (в пространстве имен System.Web.Configuration) для ссылки на файл Web.config, а затем использовать его GetSection. Метод (sectionName) возвращает Экземпляр ConfigurationSection. Наконец, вы можете получить объект РазделИнформация через свойство РазделИнформация экземпляра ConfigurationSection.
Ниже мы проиллюстрируем проблему на простом примере кода
:
{
Конфигурация конфигурации = WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath);
Раздел ConfigurationSection = config.GetSection(имяраздела);
if (раздел != null &&!section.SectionInformation.IsProtected)
{
раздел.SectionInformation.ProtectSection(поставщик);
конфигурация.Сохранить();
}
}
частный недействительный UnProtectSection (строкаsectionName) {
Конфигурация конфигурации =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
Раздел ConfigurationSection = config.GetSection n(sectionName);
if (раздел != null && раздел.SectionInformation.IsProtected)
{
раздел.SectionInformation.UnprotectSection();
конфигурация.Сохранить();
}
Вы можете вызвать этот метод ProtectSection(sectionName, поставщик) со страницы ASP.NET, его соответствующими параметрами являются имя раздела (например, ConnectionStrings) и поставщик (например, DataProtectionConfigurationProvider), и он открывает файл Web.config, ссылаясь на него. В этом разделе вызывается метод ProtectSection(provider) объектаsectionInformation и, наконец, сохраняются изменения конфигурации.
С другой стороны, метод UnProtectSection(provider) реализует расшифровку определенного раздела конфигурации. Здесь необходимо передать только раздел, который нужно расшифровать — нам не нужно беспокоить провайдера, поскольку эта информация уже хранится в теге, сопровождающем зашифрованный раздел (то есть раздел
Помните, что после того, как эти данные зашифрованы, при чтении их со страницы ASP.NET (то есть при чтении информации строки подключения из элемента управления SqlDataSource или программно через ConfigurationManager.ConnectionStrings[connStringName].ConnectionString) ASP.NET автоматически расшифровывает строку подключения и вернуть текстовое значение. Другими словами, вам вообще не нужно менять код после реализации шифрования. Довольно круто, правда?
В образце веб-сайта ASP.NET 2.0, загруженном из этой статьи, вы найдете образец страницы, на которой отображается файл Web.config сайта, который имеет многострочное текстовое поле и соответствующие кнопки веб-управления для различных частей конфигурации шифрования. файл. В этом примере также используются методы ProtectSection() и UnProtectSection(), рассмотренные выше.
6. Используйте инструмент командной строки aspnet_regiis.exe.
Вы также можете использовать инструмент командной строки aspnet_regiis.exe для шифрования и расшифровки части конфигурации файла Web.config. Его можно найти в папке «%WINDOWSDIR%Microsoft.Net». Каталог Frameworkversion». инструмент. Чтобы зашифровать раздел файла Web.config, вы можете использовать машинный ключ DPAPI в этом инструменте командной строки следующим образом:
Распространенная форма шифрования файла Web.config для определенного веб-сайта:
aspnet_regiis.exe -pef раздел физический_каталог. - поставщик prov
или:
aspnet_regiis.exe -pesection -app virtual_directory -prov
Конкретный экземпляр поставщика, шифрующий файл Web.config определенного веб-сайта:
aspnet_regiis.exe -pef "connectionStrings" "C:InetpubwwwrootMySite" -prov «DataProtectionConfigurationProvider»
или:
aspnet_regiis.exe -pe «connectionStrings» -app «/MySite» -prov «DataProtectionConfigurationProvider»
Общая форма расшифровки файла Web.config конкретного веб-сайта:
aspnet_regiis.exe -pdf раздел физический_каталог
или:
aspnet_regiis. exe -pd Раздел -app virtual_directory
Конкретный пример расшифровки файла Web.config конкретного веб-сайта:
aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
или:
Вы также можете указать, что aspnet_regiis.exe выполняется Machine.config Шифрование/дешифрование файлов.
[Совет] Шифрование параметров конфигурации в ASP.NET версии 1.x.
Чтобы защитить параметры конфигурации в ASP.NET версии 1.x, разработчикам необходимо зашифровать и сохранить конфиденциальные параметры в реестре веб-сервера и использовать «надежное» хранилище ключей. метод. Вместо хранения зашифрованного содержимого (как в ASP.NET 2.0) файл конфигурации просто содержит ссылку на раздел реестра, в котором хранится зашифрованное значение. Например:
пароль="регистрация:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,пароль" />
Microsoft предоставляет разработчикам инструмент командной строки aspnet_setreg.exe для шифрования конфиденциальной информации о конфигурации и перемещения ее в «надежный» вход в реестр. К сожалению, этот инструмент работает только с определенными параметрами конфигурации; ASP.NET 2.0, напротив, позволяет шифровать любой раздел конфигурации.
Дополнительные сведения об использовании aspnet_setreg.exe в приложении ASP.NET 1.x см. в статье KB#32990 на сайте MSDN. К сожалению, эта программа командной строки может шифровать только предопределенные разделы в настройках конфигурации и не позволяет шифровать строки подключения к базе данных и другую конфиденциальную информацию, которую вы добавляете самостоятельно.
7. Заключение
В этой статье мы узнали, как использовать различные параметры шифрования, предоставляемые ASP.NET 2.0, для защиты информации раздела конфигурации. Мы также обсудили, как использовать методы программирования и aspnet_regiis.exe для шифрования раздела конфигурации в Web.config соответственно. . Защита ваших конфиденциальных параметров конфигурации помогает гарантировать, что ваш сайт будет сложнее взломать, поскольку затрудняется обнаружение конфиденциальных параметров конфигурации. Сегодня ASP.NET 2.0 уже предоставляет относительно простую технологию шифрования и дешифрования, и у разработчиков нет причин не использовать этот метод для защиты ваших конфиденциальных параметров конфигурации.