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

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

Скачать код или скачать 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 Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    'On the first page visit, call DisplayWebConfig method
    If Not Page.IsPostBack Then
        DisplayWebConfig()
    End If
End Sub
Private Sub DisplayWebConfig()
    'Reads in the contents of Web.config and displays them in the TextBox
    Dim webConfigStream As StreamReader = _
        File.OpenText(Path.Combine(Request.PhysicalApplicationPath, "Web.config"))
    Dim configContents As String = webConfigStream.ReadToEnd()
    webConfigStream.Close()
    WebConfigContents.Text = configContents
End Sub

Метод DisplayWebConfig использует классFile для открытия файла Web.config приложения, классStreamReader для считывания его содержимого в строку, а классPath — для создания физического пути к файлу Web.config. Все эти три класса находятся в пространстве именSystem.IO. Следовательно, необходимо добавить оператор Imports``System.IO в верхнюю часть класса кода программной части или, в качестве префикса к именам этих классов, с помощью System.IO.

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

Protected Sub EncryptConnStrings_Click(sender As Object, e As EventArgs) _
    Handles EncryptConnStrings.Click
    'Get configuration information about Web.config
    Dim config As Configuration = _
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)
    ' Let's work with the <connectionStrings> section
    Dim connectionStrings As ConfigurationSection = _
        config.GetSection("connectionStrings")
    If connectionStrings IsNot Nothing Then
        ' Only encrypt the section if it is not already protected
        If Not connectionStrings.SectionInformation.IsProtected Then
            ' Encrypt the <connectionStrings> section using the 
            ' DataProtectionConfigurationProvider provider
            connectionStrings.SectionInformation.ProtectSection( _
                "DataProtectionConfigurationProvider")
            config.Save()
            ' Refresh the Web.config display
            DisplayWebConfig()
        End If
    End If
End Sub
Protected Sub DecryptConnStrings_Click(sender As Object, e As EventArgs) _
    Handles DecryptConnStrings.Click
    ' Get configuration information about Web.config
    Dim config As Configuration = _
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)
    ' Let's work with the <connectionStrings> section
    Dim connectionStrings As ConfigurationSection = _
        config.GetSection("connectionStrings")
    If connectionStrings IsNot Nothing Then
        ' Only decrypt the section if it is protected
        If connectionStrings.SectionInformation.IsProtected Then
            ' Decrypt the <connectionStrings> section
            connectionStrings.SectionInformation.UnprotectSection()
            config.Save()
            ' Refresh the Web.config display
            DisplayWebConfig()
        End If
    End If
End Sub

Код, используемый в двух обработчиках событий, практически идентичен. Они начинают с получения сведений о текущем приложении Web.config файл с помощью метода WebConfigurationManager класса s OpenWebConfiguration. Этот метод возвращает файл веб-конфигурации для указанного виртуального пути. Затем доступ к разделу Web.config Files <connectionStrings> осуществляется через метод Configuration класса s GetSection(sectionName), который возвращает объект ConfigurationSection .

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

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

После вызова метода ProtectSection(provider) или UnprotectSection необходимо вызвать метод Configuration Object s Save , чтобы сохранить изменения. После того как сведения о конфигурации будут зашифрованы или расшифрованы, а изменения сохранены, мы вызываем 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_VB"
-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. Обратите внимание на учетные данные, внедренные в строку подключения:

Server=serverName; Database=Northwind; uid=userID; pwd=password

Представьте себе, что злоумышленник может просмотреть приложение 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.