Защита строк подключения и других сведений о конфигурации (C#)

по Скотт Митчелл

Скачать код или скачать PDF

Приложение 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 их в адресную строку браузера.

При посещении 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 включает систему защищенных конфигураций, которая упрощает шифрование и расшифровку выбранных разделов конфигурации с помощью программирования.

Note

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

Шаг 1. изучение параметров защищенной конфигурации ASP.NET 2,0 s

ASP.NET 2,0 включает систему защищенной конфигурации для шифрования и расшифровки информации о конфигурации. Сюда входят методы в платформа .NET Framework, которые можно использовать для программного шифрования или расшифровки сведений о конфигурации. Защищенная система конфигурации использует модель поставщика, которая позволяет разработчикам выбрать используемую реализацию шифрования.

Платформа .NET Framework поставляется с двумя поставщиками защищенной конфигурации:

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

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

В этом учебнике в нашем примере будут использоваться поставщик DPAPI и ключи уровня компьютера. В частности, будет рассмотрено шифрование <connectionStrings> раздела в Web.config , хотя защищенная система конфигурации может использоваться для шифрования большинства Web.config разделов. Сведения об использовании ключей уровня пользователя или поставщика RSA см. в разделе Дополнительные материалы в конце этого руководства.

Note

RSAProtectedConfigurationProviderПоставщики и DPAPIProtectedConfigurationProvider регистрируются в machine.config файле с именами поставщиков RsaProtectedConfigurationProvider и DataProtectionConfigurationProvider соответственно. При шифровании или расшифровке сведений о конфигурации необходимо указать соответствующее имя поставщика ( 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 .

Под текстовым полем добавьте два элемента управления "Кнопка" с именами EncryptConnStrings и DecryptConnStrings . Задайте для свойств текста шифрование строк подключения и расшифровку строк подключения.

На этом этапе экран должен выглядеть примерно так, как показано на рис. 2.

Добавление на страницу текстового поля и двух веб-элементов управления "Кнопка"

Рис. 2. Добавление на страницу элемента управления TextBox и двух кнопок (щелкните, чтобы просмотреть изображение с полным размером)

Далее необходимо написать код, который загружает и отображает содержимое Web.config в WebConfigContents текстовом поле при первой загрузке страницы. Добавьте следующий код в класс кода программной части Pages. Этот код добавляет метод с именем 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 оператор в верхнюю часть класса кода программной части или, в качестве префикса, к именам этих классов System.IO. .

Далее необходимо добавить обработчики событий для двух элементов управления "Кнопка" Click и добавить необходимый код для шифрования и расшифровки <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 помощью OpenWebConfiguration метода WebConfigurationManager класса s. Этот метод возвращает файл веб-конфигурации для указанного виртуального пути. Далее Web.config <connectionStrings> доступ к разделу Files осуществляется через GetSection(sectionName) метод Configuration класса s, который возвращает ConfigurationSection объект.

ConfigurationSectionОбъект включает SectionInformation свойство , которое предоставляет дополнительные сведения и функциональные возможности, касающиеся раздела конфигурации. Как показано в приведенном выше коде, мы можем определить, шифруется ли раздел конфигурации, проверив SectionInformation свойство s свойства IsProtected . Более того, раздел можно зашифровать или расшифровать с помощью SectionInformation свойств ProtectSection(provider) и UnprotectSection методов.

ProtectSection(provider)Метод принимает в качестве входных данных строку, указывающую имя поставщика защищенной конфигурации, который будет использоваться при шифровании. В EncryptConnString обработчике событий Button (кнопка s) мы передаем датапротектионконфигуратионпровидер в ProtectSection(provider) метод, чтобы использовался поставщик DPAPI. UnprotectSectionМетод может определить поставщика, который использовался для шифрования раздела конфигурации, и поэтому не требует входных параметров.

После вызова ProtectSection(provider) метода или UnprotectSection необходимо вызвать Configuration Save метод Object s, чтобы сохранить изменения. После того как сведения о конфигурации будут зашифрованы или расшифрованы, а изменения сохранены, мы вызываем, DisplayWebConfig чтобы загрузить обновленное Web.config содержимое в элемент управления TextBox.

После введения приведенного выше кода протестируйте его, посетив страницу в EncryptingConfigSections.aspx браузере. Сначала должна отобразиться страница со списком содержимого в Web.config <connectionStrings> разделе, отображаемом в виде обычного текста (см. рис. 3).

Добавление на страницу текстового поля и двух веб-элементов управления "Кнопка"

Рис. 3. Добавление на страницу элемента управления TextBox и двух кнопок (щелкните, чтобы просмотреть изображение с полным размером)

Теперь нажмите кнопку шифрование строк подключения. Если проверка запросов включена, то разметка, отправленная обратно из WebConfigContents текстового поля, создает объект HttpRequestValidationException , который отображает сообщение, потенциально опасное Request.Form значение было обнаружено клиентом. Проверка запросов, которая включена по умолчанию в ASP.NET 2,0, запрещает обратные передачи, включающие в себя незакодированный HTML, и предназначено для предотвращения атак путем внедрения скриптов. Эту проверку можно отключить на уровне страницы или приложения. Чтобы отключить его для этой страницы, задайте ValidateRequest для параметра значение false в @Page директиве. @PageДиректива находится в верхней части декларативной разметки страницы s.

<%@ Page ValidateRequest="False" ... %>

Дополнительные сведения о проверке запросов, ее назначении, отключении на уровне страницы и приложения, а также о том, как кодировать HTML, см. в разделе Проверка запросов — предотвращение атак с помощью сценариев.

После отключения проверки запроса для страницы снова нажмите кнопку шифрование строк подключения. При обратной передаче файл конфигурации будет доступен и его <connectionStrings> раздел шифруется с помощью поставщика DPAPI. Затем текстовое поле обновляется для вывода нового Web.config содержимого. Как показано на рис. 4, <connectionStrings> теперь данные зашифрованы.

Нажатие кнопки "шифровать строки подключения" шифрует < > раздел ConnectionString

Рис. 4. нажатие кнопки "шифровать строки подключения" шифрует <connectionString> раздел (щелкните, чтобы просмотреть изображение с полным размером)

Зашифрованный <connectionStrings> раздел создается на моем компьютере, хотя часть содержимого <CipherData> элемента была удалена для краткости:

<connectionStrings 
    configProtectionProvider="DataProtectionConfigurationProvider">
  <EncryptedData>
    <CipherData>
      <CipherValue>AQAAANCMnd8BFdERjHoAwE/...zChw==</CipherValue>
    </CipherData>
  </EncryptedData>
</connectionStrings>

Note

<connectionStrings>Элемент указывает поставщика, используемого для выполнения шифрования ( DataProtectionConfigurationProvider ). Эта информация используется UnprotectSection методом при нажатии кнопки расшифровать строки подключения.

Когда доступ к сведениям строки подключения осуществляется из Web.config -за кода, записываемого, из элемента управления SqlDataSource или автоматически созданного кода из адаптеров таблиц TableAdapter в типизированных наборах данных, он автоматически расшифровывается. Вкратце, нам не нужно добавлять дополнительный код или логику для расшифровки зашифрованного <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 ). Как следует из названия, средство регистрации ASP.NET IIS в основном используется для регистрации приложения ASP.NET 2,0 с веб-сервером Microsoft s профессионального уровня, IIS. Помимо функций, связанных с IIS, средство регистрации ASP.NET IIS можно также использовать для шифрования или расшифровки указанных разделов конфигурации в Web.config .

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

aspnet_regiis.exe -pef section physical_directory -prov provider

раздел — это раздел конфигурации для шифрования (например, ConnectionString), физический _ Каталог — это полный физический путь к корневому каталогу веб-приложения, а provider — имя поставщика защищенной конфигурации для использования (например, датапротектионконфигуратионпровидер). Кроме того, если веб-приложение зарегистрировано в службах 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

Note

Так как мы используем поставщик DPAPI, который использует ключи, относящиеся к компьютеру, необходимо запустить с того aspnet_regiis.exe же компьютера, с которого обслуживаются веб-страницы. Например, если запустить программу командной строки с локального компьютера разработки, а затем передать зашифрованный файл Web.config на рабочий сервер, то рабочий сервер не сможет расшифровать данные строки подключения, поскольку они были зашифрованы с помощью ключей, характерных для компьютера разработки. Поставщик RSA не имеет этого ограничения, так как можно экспортировать ключи RSA на другой компьютер.

Основные сведения о параметрах аутентификации базы данных

Прежде чем любое приложение сможет выдавать SELECT INSERT запросы,, UPDATE или DELETE к базе данных Microsoft SQL Server, база данных сначала должна опознать запрашивающий. Этот процесс называется проверкой подлинности , а SQL Server предоставляет два метода проверки подлинности:

  • Проверка подлинности Windows . процесс, при котором выполняется приложение, используется для взаимодействия с базой данных. При запуске приложения ASP.NET с помощью Visual Studio 2005 s ASP.NET Development Server в приложении 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 с помощью защищенной системы конфигурации.

Note

Дополнительные сведения о различных типах проверки подлинности, доступных в 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/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998. Скотт работает как независимый консультант, преподаватель и модуль записи. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа. Он доступен по адресу mitchell@4GuysFromRolla.com . или через его блог, который можно найти по адресу http://ScottOnWriting.NET .

Специальная благодарность

Эта серия руководств была рассмотрена многими полезными рецензентами. Потенциальные рецензенты для этого учебника были Терезой Мерфи и Рэнди Шмидт. Хотите ознакомиться с моими будущими статьями MSDN? Если это так, удалите строку в mitchell@4GuysFromRolla.com .