Защита строк подключения и других сведений о конфигурации (C#)
Приложение ASP.NET обычно хранит сведения о конфигурации в файле конфигурации Web.config. Некоторые из этих сведений являются конфиденциальными и гарантируют защиту. По умолчанию этот файл не будет обслуживаться посетителю веб-сайта, но администратор или хакер может получить доступ к файловой системе веб-сервера и просмотреть содержимое файла. В этом руководстве мы узнаем, что ASP.NET 2.0 позволяет защитить конфиденциальную информацию путем шифрования разделов файла Web.config.
Введение
Сведения о конфигурации для приложений ASP.NET обычно хранятся в XML-файле с именем Web.config
. В ходе этих учебников мы обновили Web.config
горстку раз. При создании типизированного Northwind
набора данных в первом руководстве, например, строка подключения сведения были автоматически добавлены Web.config
в <connectionStrings>
раздел. Далее в руководстве по эталонным страницам и навигации по сайтам мы вручную обновили Web.config
элемент, указывающий <pages>
, что все страницы ASP.NET в нашем проекте должны использовать DataWebControls
тему.
Так как Web.config
может содержать конфиденциальные данные, такие как строка подключения, важно, чтобы содержимое Web.config
хранилось в безопасности и скрытии от несанкционированных зрителей. По умолчанию любой HTTP-запрос к файлу с .config
расширением обрабатывается подсистемой ASP.NET, которая возвращает сообщение этого типа страницы не обслуживается на рис. 1. Это означает, что посетители не могут просматривать Web.config
содержимое файла, просто введя http://www.YourServer.com/Web.config адресную строку браузера.
Рис. 1. Просмотр Web.config
через браузер возвращает тип страницы не обслуживаемого сообщения (щелкните, чтобы просмотреть изображение полного размера)
Но что делать, если злоумышленник может найти другой эксплойт, позволяющий ей просматривать содержимое файла Web.config
? Что может сделать злоумышленник с этой информацией, и какие шаги можно предпринять для дальнейшего защиты конфиденциальной информации в пределах Web.config
? К счастью, большинство разделов не Web.config
содержат конфиденциальную информацию. Какой вред может причинить злоумышленнику, если они знают имя темы по умолчанию, используемой ASP.NET страницы?
Однако некоторые Web.config
разделы содержат конфиденциальную информацию, которая может содержать строка подключения, имена пользователей, пароли, имена серверов, ключи шифрования и т. д. Эти сведения обычно находятся в следующих Web.config
разделах:
<appSettings>
<connectionStrings>
<identity>
<sessionState>
В этом руководстве мы рассмотрим методы защиты таких конфиденциальных сведений о конфигурации. Как мы увидим, платформа .NET Framework версии 2.0 включает в себя систему защищенных конфигураций, которая делает программным шифрованием и расшифровкой выбранных разделов конфигурации ветерком.
Примечание.
В этом руководстве приведены рекомендации Майкрософт по подключению к базе данных из приложения ASP.NET. Помимо шифрования строка подключения, вы можете защитить систему, обеспечивая безопасное подключение к базе данных.
Шаг 1. Изучение параметров защищенной конфигурации ASP.NET 2.0
ASP.NET 2.0 включает защищенную систему конфигурации для шифрования и расшифровки сведений о конфигурации. Это включает методы в платформа .NET Framework, которые можно использовать для программного шифрования или расшифровки сведений о конфигурации. В защищенной системе конфигурации используется модель поставщика, которая позволяет разработчикам выбирать, какую криптографическую реализацию используется.
Платформа .NET Framework поставляется с двумя защищенными поставщиками конфигурации:
RSAProtectedConfigurationProvider
— использует асимметричный алгоритм RSA для шифрования и расшифровки.DPAPIProtectedConfigurationProvider
— использует API защиты данных Windows (DPAPI) для шифрования и расшифровки.
Так как защищенная система конфигурации реализует шаблон проектирования поставщика, можно создать собственный защищенный поставщик конфигурации и подключить его к приложению. Дополнительные сведения об этом процессе см. в статье о реализации защищенного поставщика конфигурации.
Поставщики RSA и DPAPI используют ключи для своих процедур шифрования и расшифровки, и эти ключи можно хранить на уровне компьютера или пользователя. Ключи на уровне компьютера идеально подходят для сценариев, когда веб-приложение работает на собственном выделенном сервере или если на сервере есть несколько приложений, которым требуется предоставить общий доступ к зашифрованной информации. Ключи уровня пользователя — это более безопасный вариант в общих средах размещения, где другие приложения на том же сервере не должны расшифровывать защищенные разделы конфигурации приложения.
В этом руководстве мы будем использовать поставщик DPAPI и ключи на уровне компьютера. В частности, мы рассмотрим шифрование <connectionStrings>
раздела в Web.config
, хотя защищенная система конфигурации может использоваться для шифрования большинства разделов Web.config
. Сведения об использовании ключей уровня пользователя или использовании поставщика RSA см. в разделе "Дополнительные чтения" в конце этого руководства.
Примечание.
Поставщики RSAProtectedConfigurationProvider
регистрируются в machine.config
файле с именами RsaProtectedConfigurationProvider
поставщиков и DataProtectionConfigurationProvider
соответственно.DPAPIProtectedConfigurationProvider
При шифровании или расшифровке сведений о конфигурации необходимо указать соответствующее имя поставщика (RsaProtectedConfigurationProvider
или DataProtectionConfigurationProvider
) вместо фактического имени типа (RSAProtectedConfigurationProvider
и DPAPIProtectedConfigurationProvider
). Файл можно найти machine.config
в папке $WINDOWS$\Microsoft.NET\Framework\version\CONFIG
.
Шаг 2. Программное шифрование и расшифровка разделов конфигурации
С помощью нескольких строк кода можно зашифровать или расшифровать определенный раздел конфигурации с помощью указанного поставщика. Код, как мы увидим вскоре, просто необходимо программно ссылаться на соответствующий раздел конфигурации, вызывать его ProtectSection
или UnprotectSection
метод, а затем вызывать Save
метод для сохранения изменений. Кроме того, платформа .NET Framework включает полезную программу командной строки, которая может шифровать и расшифровывать сведения о конфигурации. Мы рассмотрим эту служебную программу командной строки на шаге 3.
Чтобы проиллюстрировать программную защиту сведений о конфигурации, давайте создадим страницу ASP.NET, включающую кнопки для шифрования и расшифровки <connectionStrings>
раздела.Web.config
Начните с открытия EncryptingConfigSections.aspx
страницы в папке AdvancedDAL
. Перетащите элемент управления TextBox из панели элементов в конструктор, присвойв свойству ID
WebConfigContents
, свойству TextMode
MultiLine
и Width
Rows
свойствам значение 95% и 15 соответственно. В этом элементе управления TextBox отображается содержимое Web.config
, позволяющее быстро узнать, зашифровано ли содержимое. Конечно, в реальном приложении вы никогда не хотите отображать содержимое Web.config
.
Под текстовым полем добавьте два элемента управления Button с именем EncryptConnStrings
и DecryptConnStrings
. Задайте свойства текста для шифрования строк подключения и расшифровки строк подключения.
На этом этапе экран должен выглядеть примерно так же, как на рис. 2.
Рис. 2. Добавление текстового поля и двух кнопки веб-элементов управления на страницу (щелкните, чтобы просмотреть изображение полного размера)
Затем необходимо написать код, который загружает и отображает содержимое текстового Web.config
поля при WebConfigContents
первой загрузке страницы. Добавьте следующий код в класс кодовой части страницы. Этот код добавляет метод с именем DisplayWebConfig
и вызывает его из обработчика Page_Load
событий в Page.IsPostBack
следующих случаях false
:
protected void Page_Load(object sender, EventArgs e)
{
// On the first page visit, call DisplayWebConfig method
if (!Page.IsPostBack)
DisplayWebConfig();
}
private void DisplayWebConfig()
{
// Reads in the contents of Web.config and displays them in the TextBox
StreamReader webConfigStream =
File.OpenText(Path.Combine(Request.PhysicalApplicationPath, "Web.config"));
string configContents = webConfigStream.ReadToEnd();
webConfigStream.Close();
WebConfigContents.Text = configContents;
}
Метод DisplayWebConfig
использует File
класс для открытия файла приложенияWeb.config
,StreamReader
класса для чтения его содержимого в строку иPath
класса для создания физического пути к файлу.Web.config
Эти три класса находятся в System.IO
пространстве имен. Следовательно, необходимо добавить using
System.IO
инструкцию в верхнюю часть класса code-behind или, кроме того, префиксировать эти имена классов.System.IO.
Затем необходимо добавить обработчики событий для двух событий управления Click
Button и добавить необходимый код для шифрования и расшифровки <connectionStrings>
раздела с помощью ключа уровня компьютера с поставщиком DPAPI. В конструкторе дважды щелкните каждую Click
из кнопок, чтобы добавить обработчик событий в класс программной части, а затем добавьте следующий код:
protected void EncryptConnStrings_Click(object sender, EventArgs e)
{
// Get configuration information about Web.config
Configuration config =
WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
// Let's work with the <connectionStrings> section
ConfigurationSection connectionStrings = config.GetSection("connectionStrings");
if (connectionStrings != null)
// Only encrypt the section if it is not already protected
if (!connectionStrings.SectionInformation.IsProtected)
{
// Encrypt the <connectionStrings> section using the
// DataProtectionConfigurationProvider provider
connectionStrings.SectionInformation.ProtectSection(
"DataProtectionConfigurationProvider");
config.Save();
// Refresh the Web.config display
DisplayWebConfig();
}
}
protected void DecryptConnStrings_Click(object sender, EventArgs e)
{
// Get configuration information about Web.config
Configuration config =
WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
// Let's work with the <connectionStrings> section
ConfigurationSection connectionStrings =
config.GetSection("connectionStrings");
if (connectionStrings != null)
// Only decrypt the section if it is protected
if (connectionStrings.SectionInformation.IsProtected)
{
// Decrypt the <connectionStrings> section
connectionStrings.SectionInformation.UnprotectSection();
config.Save();
// Refresh the Web.config display
DisplayWebConfig();
}
}
Код, используемый в двух обработчиках событий, почти идентичен. Они оба начинаются с получения сведений о текущем файле приложения Web.config
с помощью WebConfigurationManager
метода классаOpenWebConfiguration
. Этот метод возвращает файл веб-конфигурации для указанного виртуального пути. Затем доступ к разделу Web.config
файлов <connectionStrings>
осуществляется черезConfiguration
метод классаGetSection(sectionName)
, который возвращает ConfigurationSection
объект.
Объект ConfigurationSection
содержит SectionInformation
свойство , которое предоставляет дополнительные сведения и функциональные возможности в разделе конфигурации. Как показано в приведенном выше коде, можно определить, шифруется ли раздел конфигурации, проверив SectionInformation
свойство свойства IsProtected
. Кроме того, раздел можно зашифровать или расшифровать с помощью SectionInformation
ProtectSection(provider)
свойств и UnprotectSection
методов.
Метод ProtectSection(provider)
принимает в качестве входных данных строку, указывающую имя защищенного поставщика конфигурации, используемого при шифровании. В обработчике EncryptConnString
событий Button мы передаем DataProtectionConfigurationProvider в ProtectSection(provider)
метод, чтобы используется поставщик DPAPI. Метод UnprotectSection
может определить поставщика, который использовался для шифрования раздела конфигурации, поэтому не требует входных параметров.
После вызова ProtectSection(provider)
метода или UnprotectSection
метода необходимо вызвать Configuration
метод объектаSave
, чтобы сохранить изменения. После шифрования или расшифровки сведений о конфигурации и сохранения изменений мы вызываем DisplayWebConfig
загрузку обновленного Web.config
содержимого в элемент управления TextBox.
После ввода приведенного выше кода проверьте его, перейдя на EncryptingConfigSections.aspx
страницу через браузер. Сначала должна появиться страница, которая содержит содержимое Web.config
<connectionStrings>
раздела, отображаемого в виде обычного текста (см. рис. 3).
Рис. 3. Добавление текстового поля и двух кнопки веб-элементов управления на страницу (щелкните, чтобы просмотреть изображение полного размера)
Теперь нажмите кнопку "Зашифровать строки подключения". Если проверка запроса включена, разметка, размещенная обратно из WebConfigContents
TextBox, создаст HttpRequestValidationException
сообщение, которое отображает сообщение, потенциально опасное Request.Form
значение было обнаружено от клиента. Проверка запроса, которая включена по умолчанию в ASP.NET 2.0, запрещает обратные передачи, которые включают некодированный HTML и предназначены для предотвращения атак внедрения скриптов. Эта проверка может быть отключена на уровне страницы или приложения. Чтобы отключить его для этой страницы, задайте ValidateRequest
параметр false
в директиве @Page
. Директива @Page
найдена в верхней части декларативной разметки страницы.
<%@ Page ValidateRequest="False" ... %>
Дополнительные сведения о проверке запросов, его цели, о том, как отключить его на уровне страницы и приложения, а также как кодировать разметку HTML, см. в статье "Проверка запросов — предотвращение атак скриптов".
После отключения проверки запроса на страницу попробуйте снова нажать кнопку "Зашифровать строки подключения". После обратной передачи файл конфигурации будет доступ к файлу конфигурации и его <connectionStrings>
раздел зашифрован с помощью поставщика DPAPI. Затем текстовое поле обновляется, чтобы отобразить новое Web.config
содержимое. Как показано на рисунке 4, <connectionStrings>
данные теперь шифруются.
Рис. 4. Нажатие кнопки "Зашифровать строки подключения" шифрует <connectionString>
раздел (щелкните, чтобы просмотреть изображение полного размера)
Зашифрованный <connectionStrings>
раздел, созданный на моем компьютере, следует, хотя некоторые из содержимого элемента <CipherData>
были удалены для краткости:
<connectionStrings
configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/...zChw==</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
Примечание.
Элемент <connectionStrings>
указывает поставщика, используемого для выполнения шифрования (DataProtectionConfigurationProvider
). Эти сведения используются методом UnprotectSection
при нажатии кнопки "Расшифровка строк подключения".
Когда доступ к Web.config
данным строка подключения осуществляется либо по коду, из элемента управления SqlDataSource, либо автоматически созданного кода из TableAdapters в наших типизированных наборах данных— он автоматически расшифровывается. Короче говоря, нам не нужно добавлять дополнительный код или логику для расшифровки зашифрованного <connectionString>
раздела. Чтобы продемонстрировать это, посетите одно из предыдущих учебников в настоящее время, например руководство по простому отображению из раздела "Базовый отчет" ().~/BasicReporting/SimpleDisplay.aspx
Как показано на рисунке 5, учебник работает точно так же, как и ожидалось, что зашифрованные строка подключения данные автоматически расшифровываются на странице ASP.NET.
Рис. 5. Уровень доступа к данным автоматически расшифровывает сведения о строке подключения (щелкните, чтобы просмотреть изображение полного размера)
Чтобы вернуть раздел обратно в <connectionStrings>
представление обычного текста, нажмите кнопку "Расшифровать строки подключения". На обратной отправке должны отображаться строка подключения в Web.config
виде обычного текста. На этом этапе экран должен выглядеть так, как при первом посещении этой страницы (см. рис. 3).
Шаг 3. Шифрование разделов конфигурации с помощью aspnet_regiis.exe
Платформа .NET Framework включает различные средства командной строки в папке$WINDOWS$\Microsoft.NET\Framework\version\
. Например, в руководстве по использованию зависимостей кэша SQL мы рассмотрели использование aspnet_regsql.exe
средства командной строки для добавления инфраструктуры, необходимой для зависимостей кэша SQL. Другим полезным средством командной строки в этой папке является средство регистрации ASP.NET IIS (aspnet_regiis.exe
). Как подразумевает его имя, средство регистрации IIS ASP.NET в основном используется для регистрации приложения ASP.NET 2.0 на веб-сервере профессионального уровня Майкрософт, IIS. Помимо функций, связанных с IIS, средство регистрации служб IIS ASP.NET также можно использовать для шифрования или расшифровки указанных разделов конфигурации.Web.config
В следующей инструкции показан общий синтаксис, используемый для шифрования раздела конфигурации с помощью средства командной aspnet_regiis.exe
строки:
aspnet_regiis.exe -pef section physical_directory -prov provider
Раздел конфигурации для шифрования (например, connectionStrings), physical_directory — это полный физический путь к корневому каталогу веб-приложения, а поставщик — имя защищенного поставщика конфигурации (например, DataProtectionConfigurationProvider). Кроме того, если веб-приложение зарегистрировано в IIS, можно ввести виртуальный путь вместо физического пути с помощью следующего синтаксиса:
aspnet_regiis.exe -pe section -app virtual_directory -prov provider
aspnet_regiis.exe
Следующий пример шифрует <connectionStrings>
раздел с помощью поставщика DPAPI с помощью ключа уровня компьютера:
aspnet_regiis.exe -pef
"connectionStrings" "C:\Websites\ASPNET_Data_Tutorial_73_CS"
-prov "DataProtectionConfigurationProvider"
Аналогичным образом средство командной aspnet_regiis.exe
строки можно использовать для расшифровки разделов конфигурации. Вместо использования коммутатора -pef
используйте -pdf
(или вместо -pe
этого используйте -pd
). Кроме того, обратите внимание, что имя поставщика не требуется при расшифровке.
aspnet_regiis.exe -pdf section physical_directory
-- or --
aspnet_regiis.exe -pd section -app virtual_directory
Примечание.
Так как мы используем поставщик DPAPI, который использует ключи, относящиеся к компьютеру, необходимо запустить aspnet_regiis.exe
с того же компьютера, с которого обслуживаются веб-страницы. Например, если запустить эту программу командной строки с локального компьютера разработки, а затем передать зашифрованный файл web.config на рабочий сервер, рабочий сервер не сможет расшифровать сведения строка подключения, так как он был зашифрован с помощью ключей, относящихся к компьютеру разработки. У поставщика RSA нет этого ограничения, так как можно экспортировать ключи RSA на другой компьютер.
Общие сведения о параметрах проверки подлинности базы данных
Прежде чем любое приложение может выдавать SELECT
запросы INSERT
UPDATE
DELETE
к базе данных Microsoft SQL Server, база данных сначала должна определить запрашивателя. Этот процесс называется проверкой подлинности и SQL Server предоставляет два метода проверки подлинности :
- Проверка подлинности Windows — процесс, в котором выполняется приложение, используется для взаимодействия с базой данных. При запуске приложения ASP.NET через сервер разработки Visual Studio 2005 ASP.NET приложение ASP.NET предполагает удостоверение пользователя, вошедшего в систему. Для приложений ASP.NET в Microsoft Internet Information Server (IIS) ASP.NET приложения обычно предполагают удостоверение
domainName``\MachineName
илиdomainName``\NETWORK SERVICE
, хотя это можно настроить. - Проверка подлинности SQL — значения идентификатора пользователя и пароля предоставляются в качестве учетных данных для проверки подлинности. При проверке подлинности SQL идентификатор пользователя и пароль предоставляются в строка подключения.
проверка подлинности Windows предпочтителен по сравнению с проверкой подлинности SQL, так как она более безопасна. Если проверка подлинности Windows строка подключения бесплатно от имени пользователя и пароля, а если веб-сервер и сервер базы данных находятся на двух разных компьютерах, учетные данные не отправляются по сети в виде обычного текста. Однако при проверке подлинности SQL учетные данные проверки подлинности жестко закодированы в строка подключения и передаются с веб-сервера на сервер базы данных в виде обычного текста.
Эти учебники использовали проверка подлинности Windows. Чтобы узнать, какой режим проверки подлинности используется, проверьте строка подключения. Строка подключения Web.config
для наших учебников:
Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\NORTHWND.MDF; Integrated Security=True; User Instance=True
Встроенная безопасность=True и отсутствие имени пользователя и пароля указывают на то, что используется проверка подлинности Windows. В некоторых строка подключения используется термин "Надежное подключение=Да" или "Встроенная безопасность=SSPI", а не "Встроенная безопасность=True", но все три указывают на использование проверка подлинности Windows.
В следующем примере показан строка подключения, использующий проверку подлинности SQL. $CREDENTIAL_PLACEHOLDER$
— это заполнитель для пары "ключ-значение пароля". Обратите внимание, что учетные данные внедрены в строка подключения:
Server=serverName; Database=Northwind; uid=userID; $CREDENTIAL_PLACEHOLDER$
Представьте, что злоумышленник может просмотреть файл приложения Web.config
. При использовании проверки подлинности SQL для подключения к базе данных, доступной через Интернет, злоумышленник может использовать эту строка подключения для подключения к базе данных через SQL Management Studio или с ASP.NET страниц на своем веб-сайте. Чтобы устранить эту угрозу, зашифруйте сведения строка подключения с Web.config
помощью защищенной системы конфигурации.
Примечание.
Дополнительные сведения о различных типах проверки подлинности, доступных в SQL Server, см. в статье "Создание безопасных ASP.NET приложений: проверка подлинности, авторизация и безопасная связь". Дополнительные строка подключения примеры, иллюстрирующие различия между синтаксисом проверки подлинности Windows и SQL, см. в ConnectionStrings.com.
Итоги
По умолчанию файлы с .config
расширением в приложении ASP.NET не могут быть доступны через браузер. Эти типы файлов не возвращаются, так как они могут содержать конфиденциальную информацию, например строка подключения базы данных, имена пользователей и пароли и т. д. Система защищенной конфигурации в .NET 2.0 помогает защитить конфиденциальную информацию, позволяя шифровать указанные разделы конфигурации. Существует два встроенных защищенных поставщика конфигураций: один из которых использует алгоритм RSA и один из них, использующий API защиты данных Windows (DPAPI).
В этом руководстве мы рассмотрели, как шифровать и расшифровывать параметры конфигурации с помощью поставщика DPAPI. Это можно сделать как программным способом, так и в шаге 2, а также с помощью средства командной aspnet_regiis.exe
строки, которое было описано на шаге 3. Дополнительные сведения об использовании ключей на уровне пользователя или использовании поставщика RSA см. в разделе "Дополнительное чтение".
Счастливое программирование!
Дополнительные материалы
Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:
- Создание безопасного приложения ASP.NET: проверка подлинности, авторизация и безопасный обмен данными
- Шифрование сведений о конфигурации в приложениях ASP.NET 2.0
Web.config
Шифрование значений в ASP.NET 2.0- Практическое руководство. Шифрование разделов конфигурации в ASP.NET 2.0 с помощью DPAPI
- Практическое руководство. Шифрование разделов конфигурации в ASP.NET 2.0 с помощью RSA
- API конфигурации в .NET 2.0
- Защита данных Windows
Об авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Сэмс Учит себя ASP.NET 2.0 в 24 часах. Он может быть достигнут в mitchell@4GuysFromRolla.com. или через его блог, который можно найти на http://ScottOnWriting.NET.
Особое спасибо
Эта серия учебников была проверена многими полезными рецензентами. Ведущие рецензенты для этого руководства были Тереса Мерфи и Рэнди Шмидт. Хотите просмотреть мои предстоящие статьи MSDN? Если да, упадите меня линию в mitchell@4GuysFromRolla.com.