Поделиться через


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

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

Загрузить PDF-файл

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

Введение

Сведения о конфигурации для приложений ASP.NET обычно хранятся в XML-файле с именем Web.config. В ходе работы с этими руководствами мы обновляли Web.config несколько раз. Например, при создании Northwind typed DataSet в первом руководстве строка подключения сведения были автоматически добавлены 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 включает в себя защищенную систему конфигураций, которая делает программное шифрование и расшифровку выбранных разделов конфигурации легкой.

Примечание

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

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

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

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

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

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

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

Примечание

Поставщики 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 из панели элементов на Designer, задав для его ID свойства WebConfigContentsзначение , WidthTextModeMultiLineа свойству и Rows 95 % и 15 соответственно. Этот элемент управления TextBox отображает содержимое Web.config , позволяя нам быстро определить, зашифровано ли содержимое. Конечно, в реальном приложении вы никогда не захотите отображать содержимое Web.config.

Под элементом TextBox добавьте два элемента управления Button с именами EncryptConnStrings и DecryptConnStrings. Задайте для свойств Text значения Encrypt Connection Strings (Шифрование строк подключения) и Расшифровка строк подключения ( Расшифровка строк подключения ).

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

Снимок экрана: Visual Studio, открытая для страницы EncryptingConfigSections.aspx с новым элементом TextBox и двумя элементами управления Button.

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

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

Далее необходимо добавить обработчики событий для двух событий элементов управления Click Button и добавить необходимый код для шифрования и расшифровки <connectionStrings> раздела с помощью ключа уровня компьютера с поставщиком DPAPI. В Designer дважды щелкните каждую из кнопок, чтобы добавить 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 метода класса sOpenWebConfiguration. Этот метод возвращает файл веб-конфигурации для указанного виртуального пути. Затем доступ к разделу Web.config<connectionStrings> файла осуществляется с помощью Configuration метода класса sGetSection(sectionName), который возвращает ConfigurationSection объект .

Объект ConfigurationSection содержит SectionInformation свойство , которое предоставляет дополнительные сведения и функциональные возможности, касающиеся раздела конфигурации. Как показано в приведенном выше коде, мы можем определить, зашифрован ли раздел конфигурации, проверив SectionInformation свойство свойства .IsProtected Кроме того, раздел можно зашифровать или расшифровать с помощью SectionInformation методов свойства s 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).

Снимок экрана: страница EncryptingConfigSections.aspx, загруженная в веб-браузере.

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

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

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

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

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

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

Рис. 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). Как следует из названия, средство регистрации ASP.NET IIS в основном используется для регистрации приложения ASP.NET 2.0 на веб-сервере майкрософт профессионального уровня IIS. В дополнение к функциям, связанным с IIS, средство регистрации ASP.NET IIS также можно использовать для шифрования или расшифровки указанных разделов конфигурации в Web.config.

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

aspnet_regiis.exe -pef section physical_directory -prov provider

section — это раздел конфигурации для шифрования (например, 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 через Сервер разработки ASP.NET Visual Studio 2005 приложение 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

Значение Integrated Security=True и отсутствие имени пользователя и пароля указывают на то, что используется проверка подлинности Windows. В некоторых строках подключения вместо Integrated Security=True используется термин Trusted Connection=Yes или Integrated Security=SSPI, но все три указывают на использование проверка подлинности 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 см. в ресурсах в разделе Дальнейшее чтение.

Счастливого программирования!

Дополнительные материалы

Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах:

Об авторе

Скотт Митчелл( Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часах. Он может быть доступен в mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Особая благодарность

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