연습: 보호되는 구성을 사용하여 구성 정보 암호화
업데이트: 2007년 11월
ASP.NET 응용 프로그램에 대한 구성 파일의 섹션을 암호화하는 단계별 예제를 제공합니다.
보호되는 구성을 사용하면 Web.config 파일에 저장된 중요한 정보를 암호화할 수 있도록 설정하여 응용 프로그램의 보안을 향상시킬 수 있습니다. aspnet_regiis.exe를 사용하여 Web.config 파일의 섹션을 암호화하고 암호화 키를 관리할 수 있습니다. ASP.NET은 구성 파일을 처리할 때 파일을 해독합니다. 따라서 암호 해독 시에는 추가 코드가 필요하지 않습니다. 보호되는 구성에 대한 자세한 내용은 보호되는 구성을 사용하여 구성 정보 암호화를 참조하십시오.
이 연습을 통해 다음과 같은 작업 방법을 배웁니다.
보호되는 구성의 기본 공급자를 사용하여 Web.config 파일의 섹션을 암호화합니다.
ASP.NET 페이지의 암호가 해독된 구성 정보를 액세스합니다.
사전 요구 사항
이 연습을 완료하려면 다음과 같은 요건을 갖추어야 합니다.
사이트를 호스팅하는 컴퓨터에 Microsoft IIS(인터넷 정보 서비스)가 설치 및 구성되어 있어야 합니다.
IIS를 설치 및 구성하는 방법에 대한 자세한 내용은 IIS 설치에 포함된 온라인 도움말을 참조하거나 Internet Information Services (IIS) 6.0 Technical Resources를 참조하십시오.
ASP.NET 웹 사이트.
웹 사이트가 이미 있으면 해당 사이트를 사용할 수 있습니다. 그렇지 않은 경우 가상 디렉터리나 웹 사이트를 만드는 방법에 대한 자세한 내용은 방법: IIS 5.0 및 6.0에서 가상 디렉터리 만들기 및 구성을 참조하십시오.
RSA 암호화 키에 읽기 권한 부여
ASP.NET에서 Web.config 파일의 암호화된 정보를 해독하려면 ASP.NET 응용 프로그램의 ID에 암호화된 섹션을 암호화 및 해독하는 데 사용되는 암호화 키에 대한 읽기 권한이 있어야 합니다. 이 연습에서는 Machine.config 파일에 지정된 "RsaProtectedConfigurationProvider"라는 기본 RsaProtectedConfigurationProvider 공급자를 사용합니다. 기본 RsaProtectedConfigurationProvider 공급자에서 사용하는 RSA 키 컨테이너의 이름은 "NetFrameworkConfigurationKey"입니다.
기본 RSA 키 컨테이너에 ASP.NET ID 읽기 권한을 부여하려면
텍스트 편집기를 열고 다음 코드를 새 파일로 복사합니다.
<%@ Page Language="VB" %> <% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name) %>
<%@ Page Language="C#" %> <% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); %>
응용 프로그램 디렉터리에 새 파일을 identity.aspx로 저장합니다.
ASP.NET 응용 프로그램의 ID를 확인하려면 브라우저에서 identity.aspx를 엽니다.
ASP.NET 응용 프로그램의 가장 ID가 브라우저에 표시됩니다.
참고: 이 연습에서는 IIS를 사용하므로 사이트 인증을 위해 가장을 사용하지 마십시오. 즉, 이 연습에 대해서는 익명 인증만 ASP.NET 응용 프로그램의 ID로 사용합니다. 응용 프로그램에 대한 Web.config 파일에서 응용 프로그램의 ID가 현재 로그온한 사용자 ID(예: DOMAIN\myuserid)인 경우 가장을 비활성화하십시오. Web.config 파일에서 가장을 비활성화하려면 Web.config 파일을 열고 <identity> 요소를 제거합니다. <identity> 요소를 제거한 다음 브라우저에서 identity.aspx를 업데이트하면 응용 프로그램의 수정된 ID가 표시됩니다.
명령 프롬프트에서 다음 옵션을 사용하여 aspnet_regiis.exe를 실행합니다.
-pa 옵션 뒤에 기본 RsaProtectedConfigurationProvider에 대한 RSA 키 컨테이너의 이름을 사용합니다.
이전 단계에서 확인한 ASP.NET 응용 프로그램의 ID를 사용합니다.
예를 들어 다음 명령은 컴퓨터 수준의 "NetFrameworkConfigurationKey" RSA 키 컨테이너에 NETWORK SERVICE 계정 권한을 부여합니다.
참고: Web.config 파일에서 ASP.NET 응용 프로그램에 대한 가장이 해제된 Microsoft Windows Server 2003을 실행 중인 컴퓨터의 경우 응용 프로그램 ID는 응용 프로그램 풀의 ID입니다. 기본적으로 이 ID는 NETWORK SERVICE 계정입니다. 이전 버전의 Windows에서는 로컬 ASPNET 계정입니다.
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
명령 프롬프트 창을 닫지 마십시오.
Web.config 파일의 섹션 암호화
ASP.NET 응용 프로그램의 ID에 기본 RsaProtectedConfigurationProvider 개체의 RSA 키 컨테이너에 대한 읽기 권한이 있으므로 해당 키 컨테이너를 사용하여 ASP.NET 응용 프로그램에 대한 Web.config 파일의 섹션을 암호화합니다. 그런 다음 ASP.NET은 Web.config 파일을 처리할 때 섹션을 해독합니다.
Web.config 파일의 <connectionStrings> 및 <machineKey> 섹션을 암호화하려면
텍스트 편집기에서 응용 프로그램에 대한 Web.config 파일을 엽니다.
- ASP.NET 응용 프로그램에 대한 Web.config 파일이 없으면 텍스트 편집기를 열고 예제 구성을 새 파일로 복사한 다음 새 파일을 ASP.NET 응용 프로그램 디렉터리에 web.config로 저장합니다.
다음 예제와 같이 <system.web> 요소에 대한 <connectionStrings> 자식 요소와 <machineKey> 자식 요소가 모두 있어야 합니다.
<configuration> <connectionStrings> <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" /> </connectionStrings> <system.web> <machineKey validationKey="D61B3C89CB33A2F1422FF158AFF7320E8DB8CB5CDA1742572A487D94018787EF42682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="FBF50941F22D6A3B229EA593F24C41203DA6837F1122EF17" /> </system.web> </configuration>
Web.config 파일을 닫습니다.
명령 프롬프트에서 다음 명령을 입력하여 디렉터리를 .NET Framework 버전 2.0 디렉터리로 변경합니다.
cd \WINDOWS\Microsoft.Net\Framework\v2.0.*
명령 프롬프트에서 다음 옵션을 사용하여 aspnet_regiis.exe를 실행합니다.
-pe 옵션과 "connectionStrings" 문자열을 사용하여 응용 프로그램에 대한 Web.config 파일의 connectionStrings 요소를 암호화합니다.
-app 옵션과 응용 프로그램의 이름을 사용합니다.
예를 들어 다음 명령은 MyApplication이라는 응용 프로그램에 대한 Web.config 파일의 <connectionStrings> 섹션을 암호화합니다.
aspnet_regiis -pe "connectionStrings" -app "/MyApplication"
다음 예제와 같이 <system.web> 요소의 <machineKey> 자식 요소에 대해 이전 단계를 반복합니다.
aspnet_regiis -pe "system.web/machineKey" -app "/MyApplication"
명령 프롬프트 창을 닫지 마십시오.
Web.config를 열고 암호화된 내용을 확인합니다.
다음 예제의 Web.config 파일과 비슷한 내용이 표시될 것입니다.
<configuration> <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName>RSA Key </KeyName> </KeyInfo> <CipherData> <CipherValue>WcFEbDX8VyLfAsVK8g6hZVAG1674ZFc1kWH0BoazgOwdBfinhcAmQmnIn0oHtZ5tO2EXGl+dyh10giEmO9NemH4YZk+iMIln+ItcEay9CGWMXSen9UQLpcQHQqMJErZiPK4qPZaRWwqckLqriCl9X8x9OE7jKIsO2Ibapwj+1Jo= </CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>OpWQgQbq2wBZEGYAeV8WF82yz6q5WNFIj3rcuQ8gT0MP97aO9SHIZWwNggSEi2Ywi4oMaHX9p0NaJXG76aoMR9L/WasAxEwzQz3fexFgFSrGPful/5txSPTAGcqUb1PEBVlB9CA71UXIGVCPTiwF7zYDu8sSHhWa0fNXqVHHdLQYy1DfhXS3cO61vW5e/KYmKOGA4mjqT0VZaXgb9tVeGBDhjPh5ZlrLMNfYSozeJ+m2Lsm7hnF6VvFm3fFMXa6+h0JTHeCXBdmzg/vQb0u3oejSGzB4ly+V9O0T4Yxkwn9KVDW58PHOeRT2//3iZfJfWV2NZ4e6vj4Byjf81o3JVNgRjmm9hr9blVbbT3Q8/j5zJ+TElCn6zPHvnuB70iG2KPJXqAj2GBzBk6cHq+WNebOQNWIb7dTPumuZK0yW1XDZ5gkfBuqgn8hmosTE7mCvieP9rgATf6qgLgdA6zYyVV6WDjo1qbCV807lczxa3bF5KzKaVUSq5FS1SpdZKAE6/kkr0Ps++CE= </CipherValue> </CipherData> </EncryptedData> </connectionStrings> <system.web> <machineKey configProtectionProvider="RsaProtectedConfigurationProvider"> <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> <KeyName>RSA Key </KeyName> </KeyInfo> <CipherData> <CipherValue>IwUopItbWX0mJdGWtAqE1LlsG3u5RBRlAXs9/GZj3HEfeUXduHVF76q6Ip88YqlfLthH+DMBYdOZAF+hCOmS2agfTo1tKUvELRGIljS/BqEYxUO+/IOz9tllAw8ZlGF7AVCzptgIejI+iLXEZfMKW7f6EMGeb5vaaKXHIkYZwcM= </CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>ivVyERVPNUzIb/i7/NUbRkxsxh8IG959vycwrzJO0vYWxHZ5i03SfrLbsGUV17+FxZ6lbcrVaF5FY3zVm7dRMRvQpVFwaVcL </CipherValue> </CipherData> </EncryptedData> </machineKey> </system.web> </configuration>
Web.config 파일을 닫습니다.
암호 해독된 구성 설정 액세스
ASP.NET은 Web.config 파일을 처리할 때마다 파일 내용을 자동으로 해독합니다. 따라서 다른 ASP.NET 기능에서 사용하도록 암호화된 구성 설정을 해독하거나 코드에서 값을 액세스하기 위한 추가 단계가 필요하지 않습니다. 하지만 암호 해독된 설정을 보려면 다음 단계를 따릅니다.
암호가 해독된 구성 값을 보려면
텍스트 편집기를 열고 다음 ASP.NET 코드를 새 파일로 복사합니다.
<%@ Page Language="VB" %> <%@ Import Namespace="System.Configuration" %> <%@ Import Namespace="System.Web.Configuration" %> <script > Public Sub Page_Load() ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings ConnectionStringsGrid.DataBind() Dim config As System.Configuration.Configuration = _ WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath) Dim key As MachineKeySection = _ CType(config.GetSection("system.web/machineKey"), MachineKeySection) DecryptionKey.Text = key.DecryptionKey ValidationKey.Text = key.ValidationKey End Sub </script> <html> <body> <form > <asp:GridView CellPadding="4" id="ConnectionStringsGrid" /> <P> MachineKey.DecryptionKey = <asp:Label runat="Server" id="DecryptionKey" /><BR> MachineKey.ValidationKey = <asp:Label runat="Server" id="ValidationKey" /> </form> </body> </html>
<%@ Page Language="C#" %> <%@ Import Namespace="System.Configuration" %> <%@ Import Namespace="System.Web.Configuration" %> <script > public void Page_Load() { ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings; ConnectionStringsGrid.DataBind(); Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); MachineKeySection key = (MachineKeySection)config.GetSection("system.web/machineKey"); DecryptionKey.Text = key.DecryptionKey; ValidationKey.Text = key.ValidationKey; } </script> <html> <body> <form > <asp:GridView CellPadding="4" id="ConnectionStringsGrid" /> <P> MachineKey.DecryptionKey = <asp:Label runat="Server" id="DecryptionKey" /><BR> MachineKey.ValidationKey = <asp:Label runat="Server" id="ValidationKey" /> </form> </body> </html>
파일을 walkthrough.aspx로 저장하고 브라우저에서 해당 파일을 봅니다.
암호화된 Web.config 파일에서 암호가 해독된 값이 표시됩니다.
웹 사이트의 중요한 정보를 공개하지 않으려면 이 연습을 마친 후 walkthrough.aspx 파일을 삭제합니다.
다음 단계
필요한 경우 -pd 옵션으로 aspnet_regiis.exe를 실행하여 암호화된 Web.config 파일 내용을 해독할 수 있습니다. 암호 해독 구문은 -pe 옵션으로 Web.config 파일 내용을 암호화할 때와 동일하지만 보호되는 구성 공급자를 지정하지 않는다는 점이 다릅니다. 해당 공급자는 protected 섹션의 configProtectionProvider 요소로 식별됩니다. 예를 들어 다음 명령은 MyApplication이라는 ASP.NET 응용 프로그램에 대한 Web.config 파일에서 <connectionStrings> 요소 및 <system.web> 요소의 <machineKey> 자식 요소를 해독합니다.
aspnet_regiis -pd "connectionStrings" -app "/MyApplication"
aspnet_regiis -pd "system.web/machineKey" -app "/MyApplication"