연결 문자열 및 기타 구성 정보 보호(VB)Protecting Connection Strings and Other Configuration Information (VB)

Scott Mitchellby Scott Mitchell

코드 다운로드 또는 PDF 다운로드Download Code or Download PDF

ASP.NET 응용 프로그램은 일반적으로 Web.config 파일에 구성 정보를 저장 합니다.An ASP.NET application typically stores configuration information in a Web.config file. 이 정보 중 일부는 중요 하며 보호를 보증 합니다.Some of this information is sensitive and warrants protection. 기본적으로이 파일은 웹 사이트 방문자에 게 제공 되지 않지만 관리자나 해커가 웹 서버의 파일 시스템에 액세스 하 여 파일의 내용을 볼 수 있습니다.By default this file will not be served to a Web site visitor, but an administrator or a hacker may gain access to the Web server's file system and view the contents of the file. 이 자습서에서는 ASP.NET 2.0에서 web.config 파일의 섹션을 암호화 하 여 중요 한 정보를 보호할 수 있는 방법을 알아봅니다.In this tutorial we learn that ASP.NET 2.0 allows us to protect sensitive information by encrypting sections of the Web.config file.

소개Introduction

ASP.NET 응용 프로그램에 대 한 구성 정보는 일반적으로 Web.config이라는 XML 파일에 저장 됩니다.Configuration information for ASP.NET applications is commonly stored in an XML file named Web.config. 이러한 자습서를 진행 하는 동안 Web.config를 몇 번 업데이트 했습니다.Over the course of these tutorials we have updated the Web.config a handful of times. 예를 들어 첫 번째 자습서에서 Northwind 형식화 된 데이터 집합을 만들 때 연결 문자열 정보는 <connectionStrings> 섹션의 Web.config에 자동으로 추가 됩니다.When creating the Northwind Typed DataSet in the first tutorial, for example, connection string information was automatically added to Web.config in the <connectionStrings> section. 나중에 마스터 페이지 및 사이트 탐색 자습서에서 Web.config를 수동으로 업데이트 하 여 프로젝트의 모든 ASP.NET 페이지가 DataWebControls 테마를 사용 해야 함을 나타내는 <pages> 요소를 추가 합니다.Later, in the Master Pages and Site Navigation tutorial, we manually updated Web.config, adding a <pages> element indicating that all of the ASP.NET pages in our project should use the DataWebControls Theme.

Web.config에는 연결 문자열과 같은 중요 한 데이터가 포함 될 수 있기 때문에 Web.config의 콘텐츠를 안전 하 게 유지 하 고 권한이 없는 뷰어에 숨어 두어야 합니다.Since Web.config may contain sensitive data such as connection strings, it is important that the contents of Web.config be kept safe and hidden from unauthorized viewers. 기본적으로 .config 확장을 사용 하는 파일에 대 한 모든 HTTP 요청은 그림 1에 표시 된 이 유형의 페이지를 제공 하지 않는 메시지를 반환 하는 ASP.NET 엔진에 의해 처리 됩니다.By default, any HTTP request to a file with the .config extension is handled by the ASP.NET engine, which returns the This type of page is not served message shown in Figure 1. 즉, 방문자는 브라우저의 주소 표시줄에 http://www.YourServer.com/Web.config를 입력 하기만 하면 Web.config 파일의 내용을 볼 수 없습니다.This means that visitors cannot view your Web.config file s contents by simply entering http://www.YourServer.com/Web.config into their browser s Address bar.

브라우저를 통해 web.config를 방문 하면이 형식의 페이지가 제공 되지 않습니다. 메시지를 반환 Visiting Web.config Through a Browser Returns a This type of page is not served Message

그림 1: 브라우저를 통해 Web.config를 방문 하면이 형식의 페이지가 제공 되지 않습니다 (전체 크기 이미지를 보려면 클릭).Figure 1: Visiting Web.config Through a Browser Returns a This type of page is not served Message (Click to view full-size image)

그러나 공격자가 Web.config 파일 s 내용을 볼 수 있는 다른 악용을 찾을 수 있는 경우는 어떻게 되나요?But what if an attacker is able to find some other exploit that allows her to view your Web.config file s contents? 공격자가이 정보를 사용 하 여 수행할 수 있는 작업 및 Web.config내에서 중요 한 정보를 추가로 보호 하기 위해 수행할 수 있는 단계는 무엇 인가요?What could an attacker do with this information, and what steps can be taken to further protect the sensitive information within Web.config? 다행히 Web.config의 대부분 섹션에는 중요 한 정보가 포함 되어 있지 않습니다.Fortunately, most sections in Web.config do not contain sensitive information. 공격자가 ASP.NET 페이지에서 사용 하는 기본 테마의 이름을 알고 있는 경우 어떤 피해를 perpetrate?What harm can an attacker perpetrate if they know the name of the default Theme used by your ASP.NET pages?

그러나 특정 Web.config 섹션에는 연결 문자열, 사용자 이름, 암호, 서버 이름, 암호화 키 등을 포함할 수 있는 중요 한 정보가 포함 되어 있습니다.Certain Web.config sections, however, contain sensitive information that may include connection strings, user names, passwords, server names, encryption keys, and so forth. 이 정보는 일반적으로 다음 Web.config 섹션에서 찾을 수 있습니다.This information is typically found in the following Web.config sections:

  • <appSettings>
  • <connectionStrings>
  • <identity>
  • <sessionState>

이 자습서에서는 이러한 중요 한 구성 정보를 보호 하는 기술을 살펴봅니다.In this tutorial we will look at techniques for protecting such sensitive configuration information. 여기에서 볼 수 있듯이 .NET Framework 버전 2.0에는 프로그래밍 방식으로 선택 된 구성 섹션을 암호화 하 고 암호 해독 하는 데 사용 되는 보호 된 구성 시스템이 포함 되어 있습니다.As we will see, the .NET Framework version 2.0 includes a protected configurations system that makes programmatically encrypting and decrypting selected configuration sections a breeze.

Note

이 자습서에서는 ASP.NET 응용 프로그램에서 데이터베이스에 연결 하는 데 필요한 Microsoft s 권장 사항에 대해 살펴봅니다.This tutorial concludes with a look at Microsoft s recommendations for connecting to a database from an ASP.NET application. 연결 문자열을 암호화 하는 것 외에도 안전 하 게 데이터베이스에 연결 하 여 시스템을 강화 하는 데 도움이 될 수 있습니다.In addition to encrypting your connection strings, you can help harden your system by ensuring that you are connecting to the database in a secure fashion.

1 단계: ASP.NET 2.0 s 보호 된 구성 옵션 탐색Step 1: Exploring ASP.NET 2.0 s Protected Configuration Options

ASP.NET 2.0에는 구성 정보를 암호화 및 암호 해독 하기 위한 보호 된 구성 시스템이 포함 되어 있습니다.ASP.NET 2.0 includes a protected configuration system for encrypting and decrypting configuration information. 여기에는 프로그래밍 방식으로 구성 정보를 암호화 하거나 암호 해독 하는 데 사용할 수 있는 .NET Framework 메서드가 포함 됩니다.This includes methods in the .NET Framework that can be used to programmatically encrypt or decrypt configuration information. 보호 된 구성 시스템은 공급자 모델을 사용 하 여 개발자가 어떤 암호화 구현을 사용할 것인지 선택할 수 있습니다.The protected configuration system uses the provider model, which allows developers to choose what cryptographic implementation is used.

.NET Framework는 두 개의 보호 된 구성 공급자와 함께 제공 됩니다.The .NET Framework ships with two protected configuration providers:

보호 된 구성 시스템은 공급자 디자인 패턴을 구현 하므로 사용자가 보호 하는 구성 공급자를 만들어 응용 프로그램에 연결할 수 있습니다.Since the protected configuration system implements the provider design pattern, it is possible to create your own protected configuration provider and plug it into your application. 이 프로세스에 대 한 자세한 내용은 보호 된 구성 공급자 구현 을 참조 하세요.See Implementing a Protected Configuration Provider for more information on this process.

RSA 및 DPAPI 공급자는 암호화 및 암호 해독 루틴에 키를 사용 하며 이러한 키는 컴퓨터 또는 사용자 수준에서 저장할 수 있습니다.The RSA and DPAPI providers use keys for their encryption and decryption routines, and these keys can be stored at the machine- or user-level. 컴퓨터 수준 키는 웹 응용 프로그램이 자체 전용 서버에서 실행 되거나 암호화 된 정보를 공유 해야 하는 서버에 여러 응용 프로그램이 있는 경우에 적합 합니다.Machine-level keys are ideal for scenarios where the web application runs on its own dedicated server or if there are multiple applications on a server that need to share encrypted information. 사용자 수준 키는 동일한 서버의 다른 응용 프로그램이 보호 된 응용 프로그램 구성 섹션의 암호를 해독할 수 없는 공유 호스팅 환경에서 보다 안전한 옵션입니다.User-level keys are a more secure option in shared hosting environments where other applications on the same server should not be able to decrypt your application s protected configuration sections.

이 자습서에서는 DPAPI 공급자와 컴퓨터 수준 키를 사용 합니다.In this tutorial our examples will use the DPAPI provider and machine-level keys. 특히 보호 된 구성 시스템을 사용 하 여 대부분의 Web.config 섹션을 암호화할 수 있지만 Web.config에서 <connectionStrings> 섹션을 암호화 하는 것을 확인할 수 있습니다.Specifically, we will look at encrypting the <connectionStrings> section in Web.config, although the protected configuration system can be used to encrypt most any Web.config section. 사용자 수준 키를 사용 하거나 RSA 공급자를 사용 하는 방법에 대 한 자세한 내용은이 자습서의 끝부분에 있는 추가 판독값 섹션의 리소스를 참조 하세요.For information on using user-level keys or using the RSA provider, consult the resources in the Further Readings section at the end of this tutorial.

Note

RSAProtectedConfigurationProviderDPAPIProtectedConfigurationProvider 공급자는 각각 공급자 이름 RsaProtectedConfigurationProviderDataProtectionConfigurationProvider를 사용 하 여 machine.config 파일에 등록 됩니다.The RSAProtectedConfigurationProvider and DPAPIProtectedConfigurationProvider providers are registered in the machine.config file with the provider names RsaProtectedConfigurationProvider and DataProtectionConfigurationProvider, respectively. 구성 정보를 암호화 하거나 암호를 해독할 때 실제 형식 이름 (RSAProtectedConfigurationProviderDPAPIProtectedConfigurationProvider) 대신 적절 한 공급자 이름 (RsaProtectedConfigurationProvider 또는 DataProtectionConfigurationProvider)을 제공 해야 합니다.When encrypting or decrypting configuration information we will need to supply the appropriate provider name (RsaProtectedConfigurationProvider or DataProtectionConfigurationProvider) rather than the actual type name (RSAProtectedConfigurationProvider and DPAPIProtectedConfigurationProvider). $WINDOWS$\Microsoft.NET\Framework\version\CONFIG 폴더에서 machine.config 파일을 찾을 수 있습니다.You can find the machine.config file in the $WINDOWS$\Microsoft.NET\Framework\version\CONFIG folder.

2 단계: 프로그래밍 방식으로 구성 섹션 암호화 및 암호 해독Step 2: Programmatically Encrypting and Decrypting Configuration Sections

몇 줄의 코드를 사용 하 여 지정 된 공급자를 사용 하 여 특정 구성 섹션을 암호화 하거나 암호 해독할 수 있습니다.With a few lines of code we can encrypt or decrypt a particular configuration section using a specified provider. 곧 확인할 수 있듯이 코드는 적절 한 구성 섹션을 프로그래밍 방식으로 참조 하 고 ProtectSection 또는 UnprotectSection 메서드를 호출한 다음 Save 메서드를 호출 하 여 변경 내용을 유지 하기만 하면 됩니다.The code, as we will see shortly, simply needs to programmatically reference the appropriate configuration section, call its ProtectSection or UnprotectSection method, and then call the Save method to persist the changes. 또한 .NET Framework에는 구성 정보를 암호화 하 고 해독할 수 있는 유용한 명령줄 유틸리티가 포함 되어 있습니다.Moreover, the .NET Framework includes a helpful command line utility that can encrypt and decrypt configuration information. 3 단계의이 명령줄 유틸리티를 살펴보겠습니다.We will explore this command line utility in Step 3.

구성 정보를 프로그래밍 방식으로 보호 하는 방법을 설명 하기 위해 Web.config에서 <connectionStrings> 섹션을 암호화 하 고 암호를 해독 하는 단추를 포함 하는 ASP.NET 페이지를 만들어 보겠습니다.To illustrate programmatically protecting configuration information, let s create an ASP.NET page that includes buttons for encrypting and decrypting the <connectionStrings> section in Web.config.

먼저 AdvancedDAL 폴더에서 EncryptingConfigSections.aspx 페이지를 엽니다.Start by opening the EncryptingConfigSections.aspx page in the AdvancedDAL folder. TextBox 컨트롤을 도구 상자에서 디자이너로 끌어 ID 속성을 WebConfigContents, TextMode 속성을 MultiLine, WidthRows 속성을 각각 95% 및 15로 설정 합니다.Drag a TextBox control from the Toolbox onto the Designer, setting its ID property to WebConfigContents, its TextMode property to MultiLine, and its Width and Rows properties to 95% and 15, respectively. 이 TextBox 컨트롤은 콘텐츠가 암호화 되는지 여부를 신속 하 게 확인할 수 있도록 Web.config의 내용을 표시 합니다.This TextBox control will display the contents of Web.config allowing us to quickly see if the contents are encrypted or not. 물론 실제 응용 프로그램에서는 Web.config의 내용을 표시 하지 않을 것입니다.Of course, in a real application you would never want to display the contents of Web.config.

텍스트 상자 아래에 EncryptConnStringsDecryptConnStrings라는 두 개의 Button 컨트롤을 추가 합니다.Beneath the TextBox, add two Button controls named EncryptConnStrings and DecryptConnStrings. 텍스트 속성을 설정 하 여 연결 문자열을 암호화 하 고 연결 문자열의 암호를 해독 합니다.Set their Text properties to Encrypt Connection Strings and Decrypt Connection Strings .

이 시점에서 화면은 그림 2와 유사 하 게 표시 됩니다.At this point your screen should look similar to Figure 2.

텍스트 상자와 두 개의 단추 웹 컨트롤을 페이지에 추가 Add a TextBox and Two Button Web Controls to the Page

그림 2: 텍스트 상자와 두 개의 단추 웹 컨트롤을 페이지에 추가 (전체 크기 이미지를 보려면 클릭)Figure 2: Add a TextBox and Two Button Web Controls to the Page (Click to view full-size image)

다음으로 페이지가 처음 로드 될 때 WebConfigContents 텍스트 상자에 Web.config 내용을 로드 하 고 표시 하는 코드를 작성 해야 합니다.Next, we need to write code that loads and displays the contents of Web.config in the WebConfigContents TextBox when the page is first loaded. 페이지의 코드 숨김이 클래스에 다음 코드를 추가 합니다.Add the following code to the page s code-behind class. 이 코드는 DisplayWebConfig 라는 메서드를 추가 하 고 Page.IsPostBack FalsePage_Load 이벤트 처리기에서 호출 합니다.This code adds a method named DisplayWebConfig and calls it from the Page_Load event handler when Page.IsPostBack is 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 파일의 실제 경로를 생성 합니다.The DisplayWebConfig method uses the File class to open the application s Web.config file, the StreamReader class to read its contents into a string, and the Path class to generate the physical path to the Web.config file. 이러한 세 클래스는 모두 System.IO 네임 스페이스에 있습니다.These three classes are all found in the System.IO namespace. 따라서 코드를 사용 하는 클래스의 맨 위에 Imports``System.IO 문을 추가 하거나 이러한 클래스 이름 앞에 System.IO.를 추가 해야 합니다.Consequently, you will need to add a Imports``System.IO statement to the top of the code-behind class or, alternatively, prefix these class names with System.IO.

그런 다음 이벤트 Click 두 단추 컨트롤에 대 한 이벤트 처리기를 추가 하 고 DPAPI 공급자를 사용 하 여 컴퓨터 수준 키를 사용 하 여 <connectionStrings> 섹션을 암호화 하 고 암호 해독 하는 데 필요한 코드를 추가 해야 합니다.Next, we need to add event handlers for the two Button controls Click events and add the necessary code to encrypt and decrypt the <connectionStrings> section using a machine-level key with the DPAPI provider. 디자이너에서 각 단추를 두 번 클릭 하 여 코드 숨김으로 된 클래스에 Click 이벤트 처리기를 추가한 후 다음 코드를 추가 합니다.From the Designer, double-click each of the Buttons to add a Click event handler in the code-behind class and then add the following code:

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

두 이벤트 처리기에서 사용 되는 코드는 거의 동일 합니다.The code used in the two event handlers is nearly identical. 둘 다 WebConfigurationManager 클래스OpenWebConfiguration 메서드를 통해 현재 응용 프로그램 Web.config 파일에 대 한 정보를 가져오는 것으로 시작 합니다.They both start by getting information about the current application s Web.config file via the WebConfigurationManager class s OpenWebConfiguration method. 이 메서드는 지정 된 가상 경로에 대 한 웹 구성 파일을 반환 합니다.This method returns the web configuration file for the specified virtual path. 그런 다음 Web.config 파일 s <connectionStrings> 섹션은 Configuration 클래스 s GetSection(sectionName) 메서드를 통해 액세스 합니다 .이 메서드는 ConfigurationSection 개체를 반환 합니다.Next, the Web.config file s <connectionStrings> section is accessed via the Configuration class s GetSection(sectionName) method, which returns a ConfigurationSection object.

ConfigurationSection 개체는 구성 섹션과 관련 된 추가 정보 및 기능을 제공 하는 SectionInformation 속성 을 포함 합니다.The ConfigurationSection object includes a SectionInformation property that provides additional information and functionality regarding the configuration section. 위의 코드에서 볼 수 있듯이 SectionInformation 속성 IsProtected 속성을 확인 하 여 구성 섹션이 암호화 되는지 여부를 확인할 수 있습니다.As the code above shows, we can determine whether the configuration section is encrypted by checking the SectionInformation property s IsProtected property. 또한 SectionInformation 속성 s ProtectSection(provider)UnprotectSection 메서드를 통해 섹션을 암호화 하거나 암호를 해독할 수 있습니다.Moreover, the section can be encrypted or decrypted via the SectionInformation property s ProtectSection(provider) and UnprotectSection methods.

ProtectSection(provider) 메서드는 암호화할 때 사용할 보호 된 구성 공급자의 이름을 지정 하는 문자열을 입력으로 받아들입니다.The ProtectSection(provider) method accepts as input a string specifying the name of the protected configuration provider to use when encrypting. EncryptConnString 단추 s 이벤트 처리기에서 DPAPI 공급자가 사용 되도록 DataProtectionConfigurationProvider를 ProtectSection(provider) 메서드로 전달 합니다.In the EncryptConnString Button s event handler we pass DataProtectionConfigurationProvider into the ProtectSection(provider) method so that the DPAPI provider is used. UnprotectSection 메서드는 구성 섹션을 암호화 하는 데 사용 된 공급자를 확인할 수 있으므로 입력 매개 변수가 필요 하지 않습니다.The UnprotectSection method can determine the provider that was used to encrypt the configuration section and therefore does not require any input parameters.

ProtectSection(provider) 또는 UnprotectSection 메서드를 호출한 후에는 Configuration 개체 s Save 메서드 를 호출 하 여 변경 내용을 유지 해야 합니다.After calling the ProtectSection(provider) or UnprotectSection method, you must call the Configuration object s Save method to persist the changes. 구성 정보를 암호화 하거나 암호를 해독 하 고 변경 내용을 저장 한 후에는 DisplayWebConfig를 호출 하 여 텍스트 상자 컨트롤에 업데이트 된 Web.config 콘텐츠를 로드 합니다.Once the configuration information has been encrypted or decrypted and the changes saved, we call DisplayWebConfig to load the updated Web.config contents into the TextBox control.

위의 코드를 입력 한 후 브라우저를 통해 EncryptingConfigSections.aspx 페이지를 방문 하 여 테스트 합니다.Once you have entered the above code, test it by visiting the EncryptingConfigSections.aspx page through a browser. 처음에는 <connectionStrings> 섹션이 일반 텍스트로 표시 된 Web.config의 내용을 나열 하는 페이지가 표시 됩니다 (그림 3 참조).You should initially see a page that lists the contents of Web.config with the <connectionStrings> section displayed in plain-text (see Figure 3).

텍스트 상자와 두 개의 단추 웹 컨트롤을 페이지에 추가 Add a TextBox and Two Button Web Controls to the Page

그림 3: 텍스트 상자와 두 개의 단추 웹 컨트롤을 페이지에 추가 (전체 크기 이미지를 보려면 클릭)Figure 3: Add a TextBox and Two Button Web Controls to the Page (Click to view full-size image)

이제 연결 문자열 암호화 단추를 클릭 합니다.Now click the Encrypt Connection Strings button. 요청 유효성 검사를 사용 하도록 설정 하는 경우 WebConfigContents 텍스트 상자에서 다시 게시 된 태그는 메시지를 표시 하는 HttpRequestValidationException을 생성 하 고 잠재적으로 위험한 Request.Form 값이 클라이언트에서 검색 된 것입니다.If request validation is enabled, the markup posted back from the WebConfigContents TextBox will produce an HttpRequestValidationException, which displays the message, A potentially dangerous Request.Form value was detected from the client. ASP.NET 2.0에서 기본적으로 사용 하도록 설정 된 요청 유효성 검사는 인코딩되지 않은 HTML을 포함 하는 포스트백을 금지 하 고 스크립트 삽입 공격을 방지 하도록 디자인 되었습니다.Request validation, which is enabled by default in ASP.NET 2.0, prohibits postbacks that include un-encoded HTML and is designed to help prevent script-injection attacks. 이 검사는 페이지 또는 응용 프로그램 수준에서 사용 하지 않도록 설정할 수 있습니다.This check can be disabled at the page- or application-level. 이 페이지에서이 기능을 해제 하려면 @Page 지시어에서 ValidateRequest 설정을 False로 설정 합니다.To turn it off for this page, set the ValidateRequest setting to False in the @Page directive. @Page 지시문은 페이지의 선언적 태그 맨 위에 있습니다.The @Page directive is found at the top of the page s declarative markup.

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

요청 유효성 검사, 용도, 페이지 및 응용 프로그램 수준에서이 기능을 사용 하지 않도록 설정 하는 방법 및 태그를 HTML 인코딩하는 방법에 대 한 자세한 내용은 요청 유효성 검사-스크립트 공격 방지를 참조 하세요.For more information on request validation, its purpose, how to disable it at the page- and application-level, as well as how to HTML encode markup, see Request Validation - Preventing Script Attacks.

페이지에 대 한 요청 유효성 검사를 사용 하지 않도록 설정한 후에는 연결 문자열 암호화 단추를 다시 클릭 합니다.After disabling request validation for the page, try clicking the Encrypt Connection Strings button again. 다시 게시 하는 경우 구성 파일에 액세스 하 고 DPAPI 공급자를 사용 하 여 <connectionStrings> 섹션을 암호화 합니다.On postback, the configuration file will be accessed and its <connectionStrings> section encrypted using the DPAPI provider. 그러면 텍스트 상자가 업데이트 되어 새 Web.config 콘텐츠가 표시 됩니다.The TextBox is then updated to display the new Web.config content. 그림 4에 표시 된 것 처럼 <connectionStrings> 정보가 암호화 됩니다.As Figure 4 shows, the <connectionStrings> information is now encrypted.

연결 문자열 암호화 단추를 클릭 하 <connectionString> 섹션을 암호화 합니다.Clicking the Encrypt Connection Strings Button Encrypts the <connectionString> Section

그림 4: 연결 문자열 암호화 단추를 클릭 하면 <connectionString> 섹션이 암호화 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 4: Clicking the Encrypt Connection Strings Button Encrypts the <connectionString> Section (Click to view full-size image)

내 컴퓨터에서 생성 된 암호화 된 <connectionStrings> 섹션이 다음을 위해 <CipherData> 요소의 일부 콘텐츠가 제거 되었습니다.The encrypted <connectionStrings> section generated on my computer follows, although some of the content in the <CipherData> element has been removed for brevity:

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

Note

<connectionStrings> 요소는 암호화 (DataProtectionConfigurationProvider)를 수행 하는 데 사용 되는 공급자를 지정 합니다.The <connectionStrings> element specifies the provider used to perform the encryption (DataProtectionConfigurationProvider). 이 정보는 연결 문자열 암호 해독 단추를 클릭할 때 UnprotectSection 메서드에서 사용 됩니다.This information is used by the UnprotectSection method when the Decrypt Connection Strings button is clicked.

Web.config에서 연결 문자열 정보에 액세스 하는 경우, SqlDataSource 컨트롤 또는 형식화 된 데이터 집합의 Tableadapter에서 자동 생성 된 코드에서 코드를 작성 합니다. 그러면 자동으로 암호가 해독 됩니다.When the connection string information is accessed from Web.config - either by code we write, from a SqlDataSource control, or the auto-generated code from the TableAdapters in our Typed DataSets - it is automatically decrypted. 간단히 말해서 암호화 된 <connectionString> 섹션의 암호를 해독 하는 추가 코드 또는 논리를 추가할 필요가 없습니다.In short, we do not need to add any extra code or logic to decrypt the encrypted <connectionString> section. 이를 보여 주기 위해 기본 보고 섹션 (~/BasicReporting/SimpleDisplay.aspx)의 간단한 표시 자습서와 같은 이전 자습서 중 하나를 방문해 보세요.To demonstrate this, visit one of the earlier tutorials at this time, such as the Simple Display tutorial from the Basic Reporting section (~/BasicReporting/SimpleDisplay.aspx). 그림 5와 같이 자습서는 정상적으로 작동 하는 것과 동일 하 게 작동 하며,이는 암호화 된 연결 문자열 정보가 ASP.NET 페이지에 의해 자동으로 해독 됨을 나타냅니다.As Figure 5 shows, the tutorial works exactly as we would expect it, indicating that the encrypted connection string information is being automatically decrypted by the ASP.NET page.

데이터 액세스 계층 자동으로 연결 문자열 정보를 해독 합니다.The Data Access Layer Automatically Decrypts the Connection String Information

그림 5: 데이터 액세스 계층이 자동으로 연결 문자열 정보를 해독 합니다 (전체 크기 이미지를 보려면 클릭).Figure 5: The Data Access Layer Automatically Decrypts the Connection String Information (Click to view full-size image)

<connectionStrings> 섹션을 일반 텍스트 표현으로 되돌리려면 연결 문자열 암호 해독 단추를 클릭 합니다.To revert the <connectionStrings> section back to its plain-text representation, click the Decrypt Connection Strings button. 다시 게시 시 Web.config의 연결 문자열이 일반 텍스트로 표시 되어야 합니다.On postback you should see the connection strings in Web.config in plain-text. 이 시점에서 화면은이 페이지를 처음 방문할 때 처럼 보입니다 (그림 3 참조).At this point your screen should look like it did when first visiting this page (see in Figure 3).

3 단계:aspnet_regiis.exe를 사용 하 여 구성 섹션 암호화Step 3: Encrypting Configuration Sections Usingaspnet_regiis.exe

.NET Framework은 $WINDOWS$\Microsoft.NET\Framework\version\ 폴더에 다양 한 명령줄 도구를 포함 합니다.The .NET Framework includes a variety of command line tools in the $WINDOWS$\Microsoft.NET\Framework\version\ folder. 예를 들어 Sql 캐시 종속성 사용 자습서에서는 aspnet_regsql.exe 명령줄 도구를 사용 하 여 SQL 캐시 종속성에 필요한 인프라를 추가 하는 방법을 살펴보았습니다.In the Using SQL Cache Dependencies tutorial, for instance, we looked at using the aspnet_regsql.exe command line tool to add the infrastructure necessary for SQL cache dependencies. 이 폴더의 또 다른 유용한 명령줄 도구는 ASP.NET IIS 등록 도구 (aspnet_regiis.exe)입니다.Another useful command line tool in this folder is the ASP.NET IIS Registration tool (aspnet_regiis.exe). 이름에서 알 수 있듯이 ASP.NET IIS 등록 도구는 주로 Microsoft professional 웹 서버 (IIS)를 사용 하 여 ASP.NET 2.0 응용 프로그램을 등록 하는 데 사용 됩니다.As its name implies, the ASP.NET IIS Registration tool is primarily used to register an ASP.NET 2.0 application with Microsoft s professional-grade Web server, IIS. IIS 관련 기능 외에도 ASP.NET IIS 등록 도구를 사용 하 여 Web.config에서 지정 된 구성 섹션을 암호화 하거나 암호를 해독할 수 있습니다.In addition to its IIS-related features, the ASP.NET IIS Registration tool can also be used to encrypt or decrypt specified configuration sections in Web.config.

다음 문은 aspnet_regiis.exe 명령줄 도구를 사용 하 여 구성 섹션을 암호화 하는 데 사용 되는 일반 구문을 보여 줍니다.The following statement shows the general syntax used to encrypt a configuration section with the aspnet_regiis.exe command line tool:

aspnet_regiis.exe -pef section physical_directory -prov provider

섹션 은 암호화할 구성 섹션입니다 (예: connectionStrings). 실제_디렉터리 는 웹 응용 프로그램의 루트 디렉터리에 대 한 전체 실제 경로이 고 provider 는 사용할 보호 된 구성 공급자의 이름 (예: DataProtectionConfigurationProvider)입니다.section is the configuration section to encrypt (like connectionStrings ), the physical_directory is the full, physical path to the web application s root directory, and provider is the name of the protected configuration provider to use (such as DataProtectionConfigurationProvider ). 또는 웹 응용 프로그램이 IIS에 등록 되어 있는 경우 다음 구문을 사용 하 여 실제 경로 대신 가상 경로를 입력할 수 있습니다.Alternatively, if the web application is registered in IIS you can enter the virtual path instead of the physical path using the following syntax:

aspnet_regiis.exe -pe section -app virtual_directory -prov provider

다음 aspnet_regiis.exe 예제에서는 컴퓨터 수준 키로 DPAPI 공급자를 사용 하 여 <connectionStrings> 섹션을 암호화 합니다.The following aspnet_regiis.exe example encrypts the <connectionStrings> section using the DPAPI provider with a machine-level key:

aspnet_regiis.exe -pef
"connectionStrings" "C:\Websites\ASPNET_Data_Tutorial_73_VB"
-prov "DataProtectionConfigurationProvider"

마찬가지로 aspnet_regiis.exe 명령줄 도구를 사용 하 여 구성 섹션의 암호를 해독할 수 있습니다.Similarly, the aspnet_regiis.exe command line tool can be used to decrypt configuration sections. -pef 스위치를 사용 하는 대신 -pdf (또는 -pe대신 -pd)를 사용 합니다.Instead of using the -pef switch, use -pdf (or instead of -pe, use -pd). 또한 암호를 해독 하는 경우에는 공급자 이름이 필요 하지 않습니다.Also, note that the provider name is not necessary when decrypting.

aspnet_regiis.exe -pdf section physical_directory
  -- or --
aspnet_regiis.exe -pd section -app virtual_directory

Note

컴퓨터와 관련 된 키를 사용 하는 DPAPI 공급자를 사용 하 고 있으므로 웹 페이지를 제공 하는 컴퓨터와 동일한 컴퓨터에서 aspnet_regiis.exe를 실행 해야 합니다.Since we are using the DPAPI provider, which uses keys specific to the computer, you must run aspnet_regiis.exe from the same machine from which the web pages are being served. 예를 들어 로컬 개발 컴퓨터에서이 명령줄 프로그램을 실행 한 후 암호화 된 web.config 파일을 프로덕션 서버에 업로드 하는 경우 프로덕션 서버는 암호화 된 후에 연결 문자열 정보를 해독할 수 없습니다. 개발 컴퓨터에 특정 한 키 사용For example, if you run this command line program from your local development machine and then upload the encrypted Web.config file to the production server, the production server will not be able to decrypt the connection string information since it was encrypted using keys specific to your development machine. Rsa 공급자는 RSA 키를 다른 컴퓨터로 내보낼 수 있으므로이 제한이 없습니다.The RSA provider does not have this limitation as it is possible to export the RSA keys to another machine.

데이터베이스 인증 옵션 이해Understanding Database Authentication Options

응용 프로그램에서 Microsoft SQL Server 데이터베이스에 대 한 SELECT, INSERT, UPDATE또는 DELETE 쿼리를 실행 하기 전에 먼저 데이터베이스에서 요청자를 식별 해야 합니다.Before any application can issue SELECT, INSERT, UPDATE, or DELETE queries to a Microsoft SQL Server database, the database first must identify the requestor. 이 프로세스를 인증 이라고 하며 SQL Server는 두 가지 인증 방법을 제공 합니다.This process is known as authentication and SQL Server provides two methods of authentication:

  • Windows 인증 -응용 프로그램이 실행 되는 프로세스를 사용 하 여 데이터베이스와 통신 합니다.Windows Authentication - the process under which the application is running is used to communicate with the database. ASP.NET 개발 서버 Visual Studio 2005 s를 통해 ASP.NET 응용 프로그램을 실행 하는 경우 ASP.NET 응용 프로그램은 현재 로그온 한 사용자의 id를 가정 합니다.When running an ASP.NET application through Visual Studio 2005 s ASP.NET Development Server, the ASP.NET application assumes the identity of the currently logged on user. Microsoft IIS (Internet Information Server)에서 ASP.NET 응용 프로그램의 경우 ASP.NET 응용 프로그램은 일반적으로 사용자 지정할 수 있지만 domainName``\MachineName 또는 domainName``\NETWORK SERVICEid를 가정 합니다.For ASP.NET applications on Microsoft Internet Information Server (IIS), ASP.NET applications usually assume the identity of domainName``\MachineName or domainName``\NETWORK SERVICE, although this can be customized.
  • SQL 인증 -사용자 ID 및 암호 값은 인증을 위한 자격 증명으로 제공 됩니다.SQL Authentication - a user ID and password values are supplied as credentials for authentication. SQL 인증을 사용 하면 연결 문자열에 사용자 ID와 암호가 제공 됩니다.With SQL authentication, the user ID and password are provided in the connection string.

Windows 인증은 더 안전 하기 때문에 SQL 인증 보다 우선 합니다.Windows authentication is preferred over SQL authentication because it is more secure. Windows 인증을 사용 하는 경우 연결 문자열은 사용자 이름 및 암호에서 무료로 제공 되며 웹 서버와 데이터베이스 서버가 서로 다른 두 컴퓨터에 있는 경우에는 자격 증명이 네트워크를 통해 일반 텍스트로 전송 되지 않습니다.With Windows authentication the connection string is free from a username and password and if the web server and database server reside on two different machines, the credentials are not sent over the network in plain-text. 그러나 SQL 인증을 사용 하는 경우 인증 자격 증명이 연결 문자열에 하드 코딩 되며 웹 서버에서 일반 텍스트로 데이터베이스 서버로 전송 됩니다.With SQL authentication, however, the authentication credentials are hard-coded in the connection string and are transmitted from the web server to the database server in plain-text.

이러한 자습서에서는 Windows 인증을 사용 했습니다.These tutorials have used Windows authentication. 연결 문자열을 검사 하 여 어떤 인증 모드를 사용 중인지 알 수 있습니다.You can tell what authentication mode is being used by inspecting the connection string. 이 자습서의 Web.config 연결 문자열은 다음과 같습니다.The connection string in Web.config for our tutorials has been:

Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\NORTHWND.MDF; Integrated Security=True; User Instance=True

Integrated Security = True 이며 사용자 이름 및 암호가 부족 하면 Windows 인증을 사용 하 고 있음을 알 수 있습니다.The Integrated Security=True and lack of a username and password indicate that Windows authentication is being used. 일부 연결 문자열에서는 Integrated Security = True 대신 트러스트 된 연결 이라는 용어가 사용 되며 세 가지 모두 Windows 인증 사용을 의미 합니다.In some connection strings the term Trusted Connection=Yes or Integrated Security=SSPI is used instead of Integrated Security=True, but all three indicate the use of Windows authentication.

다음 예에서는 SQL 인증을 사용 하는 연결 문자열을 보여 줍니다.The following example shows a connection string that uses SQL authentication. 연결 문자열에 포함 된 자격 증명을 확인 합니다.Note the credentials embedded within the connection string:

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

공격자가 응용 프로그램 Web.config 파일을 볼 수 있다고 가정 합니다.Imagine that an attacker is able to view your application s Web.config file. SQL 인증을 사용 하 여 인터넷을 통해 액세스할 수 있는 데이터베이스에 연결 하는 경우 공격자가이 연결 문자열을 사용 하 여 SQL Management Studio 또는 자체 웹 사이트의 ASP.NET 페이지를 통해 데이터베이스에 연결할 수 있습니다.If you use SQL authentication to connect to a database that is accessible over the Internet, the attacker can use this connection string to connect to your database through SQL Management Studio or from ASP.NET pages on their own website. 이 위협을 완화 하기 위해 보호 된 구성 시스템을 사용 하 여 Web.config에서 연결 문자열 정보를 암호화 합니다.To help mitigate this threat, encrypt the connection string information in Web.config using the protected configuration system.

Note

SQL Server에서 사용할 수 있는 다양 한 인증 유형에 대 한 자세한 내용은 보안 ASP.NET 응용 프로그램 빌드: 인증, 권한 부여 및 보안 통신을 참조 하세요.For more information on the different types of authentication available in SQL Server, see Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication. Windows 및 SQL 인증 구문 간의 차이점을 보여 주는 추가 연결 문자열 예는 ConnectionStrings.com을 참조 하세요.For further connection string examples illustrating the differences between Windows and SQL authentication syntax, refer to ConnectionStrings.com.

요약Summary

기본적으로 ASP.NET 응용 프로그램에서 .config 확장명을 가진 파일은 브라우저를 통해 액세스할 수 없습니다.By default, files with a .config extension in an ASP.NET application cannot be accessed through a browser. 이러한 유형의 파일은 데이터베이스 연결 문자열, 사용자 이름 및 암호 등의 중요 한 정보를 포함할 수 있기 때문에 반환 되지 않습니다.These types of files are not returned because they may contain sensitive information, such as database connection strings, usernames and passwords, and so on. .NET 2.0의 보호 된 구성 시스템은 지정 된 구성 섹션을 암호화할 수 있도록 하 여 중요 한 정보를 추가로 보호할 수 있습니다.The protected configuration system in .NET 2.0 helps further protect sensitive information by allowing specified configuration sections to be encrypted. 보호 된 구성 공급자에는 두 가지가 있습니다. 하나는 RSA 알고리즘을 사용 하 고 다른 하나는 Windows DPAPI (데이터 보호 API)를 사용 합니다.There are two built-in protected configuration providers: one that uses the RSA algorithm and one that uses the Windows Data Protection API (DPAPI).

이 자습서에서는 DPAPI 공급자를 사용 하 여 구성 설정을 암호화 하 고 해독 하는 방법을 살펴보았습니다.In this tutorial we looked at how to encrypt and decrypt configuration settings using the DPAPI provider. 이는 2 단계에서 살펴본 것 처럼 프로그래밍 방식으로 수행할 수 있으며, 3 단계에서 다룬 aspnet_regiis.exe 명령줄 도구를 통해 수행할 수 있습니다.This can be accomplished both programmatically, as we saw in Step 2, as well as through the aspnet_regiis.exe command line tool, which was covered in Step 3. 사용자 수준 키를 사용 하거나 RSA 공급자를 대신 사용 하는 방법에 대 한 자세한 내용은 추가 정보 섹션의 리소스를 참조 하세요.For more information on using user-level keys or using the RSA provider instead, see the resources in the Further Reading section.

행복 한 프로그래밍Happy Programming!

추가 참고 자료Further Reading

이 자습서에서 설명 하는 항목에 대 한 자세한 내용은 다음 리소스를 참조 하세요.For more information on the topics discussed in this tutorial, refer to the following resources:

저자 정보About the Author

Scott Mitchell(7 개의 ASP/ASP. NET books 및 4GuysFromRolla.com창립자)은 1998부터 Microsoft 웹 기술을 사용 하 여 작업 했습니다.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott은 독립 컨설턴트, 강사 및 기록기로 작동 합니다.Scott works as an independent consultant, trainer, and writer. 최신 책은 24 시간 이내에 ASP.NET 2.0을 sams teach yourself것입니다.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.com에 도달할 수 있습니다 .He can be reached at mitchell@4GuysFromRolla.com. 또는 블로그를 통해 http://ScottOnWriting.NET에서 찾을 수 있습니다.or via his blog, which can be found at http://ScottOnWriting.NET.

특별히 감사 합니다.Special Thanks To

이 자습서 시리즈는 많은 유용한 검토자가 검토 했습니다.This tutorial series was reviewed by many helpful reviewers. 이 자습서에 대 한 리드 검토자는 Teresa Murphy 및 Randy Schmidt입니다.Lead reviewers for this tutorial were Teresa Murphy and Randy Schmidt. 예정 된 MSDN 문서를 검토 하는 데 관심이 있나요?Interested in reviewing my upcoming MSDN articles? 그렇다면mitchell@4GuysFromRolla.com에서 줄을 삭제 합니다.If so, drop me a line at mitchell@4GuysFromRolla.com.