Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Приложение 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 в адресную строку браузера.
Рис. 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 поставляется с двумя защищенными поставщиками конфигурации:
RSAProtectedConfigurationProvider
— использует асимметричный алгоритм RSA для шифрования и расшифровки.DPAPIProtectedConfigurationProvider
— использует API защиты данных Windows (DPAPI) для шифрования и расшифровки.
Так как защищенная система конфигурации реализует шаблон проектирования поставщика, можно создать собственный защищенный поставщик конфигурации и подключить его к приложению. Дополнительные сведения об этом процессе см. в статье Реализация поставщика защищенной конфигурации .
Поставщики 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
значение , Width
TextMode
MultiLine
а свойству и Rows
95 % и 15 соответственно. Этот элемент управления TextBox отображает содержимое Web.config
, позволяя нам быстро определить, зашифровано ли содержимое. Конечно, в реальном приложении вы никогда не захотите отображать содержимое Web.config
.
Под элементом TextBox добавьте два элемента управления Button с именами EncryptConnStrings
и DecryptConnStrings
. Задайте для свойств Text значения Encrypt Connection Strings (Шифрование строк подключения) и Расшифровка строк подключения ( Расшифровка строк подключения ).
На этом этапе экран должен выглядеть примерно так, как на рис. 2.
Рис. 2. Добавление веб-элементов управления TextBox и двух кнопок на страницу (щелкните для просмотра полноразмерного изображения)
Далее необходимо написать код, который загружает и отображает содержимое Web.config
элемента в элементе WebConfigContents
TextBox при первой загрузке страницы. Добавьте следующий код в класс кода программной части страницы. Этот код добавляет метод с именем 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
Button и добавить необходимый код для шифрования и расшифровки <connectionStrings>
раздела с помощью ключа уровня компьютера с поставщиком DPAPI. В Designer дважды щелкните каждую из кнопок, чтобы добавить 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
метода класса 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).
Рис. 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, информация теперь зашифрована.
Рис. 4. Нажатие кнопки Encrypt Connection Strings (Шифрование строк подключения) позволяет зашифровать <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, средство регистрации iis ASP.NET также можно использовать для шифрования или расшифровки указанных разделов конфигурации в Web.config
.
В следующей инструкции показан общий синтаксис, используемый для шифрования раздела конфигурации с помощью программы командной aspnet_regiis.exe
строки:
aspnet_regiis.exe -pef section physical_directory -prov provider
section — это раздел конфигурации для шифрования (например, connectionStrings), physical_directory — полный физический путь к корневому каталогу веб-приложения, а provider — имя используемого защищенного поставщика конфигурации (например, 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_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
Примечание
Так как мы используем поставщик 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 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
Значение Integrated Security=True и отсутствие имени пользователя и пароля указывают на то, что используется проверка подлинности Windows. В некоторых строках подключения вместо Integrated Security=True используется термин Trusted Connection=Yes или Integrated Security=SSPI, но все три указывают на использование проверка подлинности Windows.
В следующем примере показан строка подключения, использующий проверку подлинности SQL. Обратите внимание на учетные данные, внедренные в строка подключения:
Server=serverName; Database=Northwind; uid=userID; pwd=password
Представьте, что злоумышленник может просмотреть файл приложения 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: проверка подлинности, авторизация и безопасный обмен данными
Web.config
Шифрование значений в ASP.NET 2.0- Практическое руководство. Шифрование разделов конфигурации в ASP.NET 2.0 с помощью DPAPI
- Практическое руководство. Шифрование разделов конфигурации в ASP.NET 2.0 с помощью RSA
- API конфигурации в .NET 2.0
- Защита данных Windows
Об авторе
Скотт Митчелл (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.