1. 소개
ASP.NET 2.0 응용 프로그램을 만들 때 개발자는 일반적으로 중요한 구성 정보를 Web.config 파일에 저장합니다. 가장 일반적인 예는 데이터베이스 연결 문자열이지만 Web.config 파일에 포함된 다른 중요한 정보에는 SMTP 서버 연결 정보, 사용자 자격 증명 데이터 등이 포함됩니다. ASP.NET은 기본적으로 .config 확장자를 가진 파일 리소스에 대한 모든 HTTP 요청을 거부하도록 구성할 수 있지만 해커가 웹 서버의 파일 시스템에 액세스할 수 있으면 민감한 정보가 여전히 도난당할 수 있습니다. 예를 들어 실수로 웹 사이트에 대한 익명 FTP 액세스를 허용하여 해커가 FTP 프로토콜을 통해 Web.config 파일을 다운로드할 수 있도록 허용했을 수 있습니다.
다행히 ASP.NET 2.0에서는 <connectionStrings> 섹션이나 응용 프로그램에서 사용하는 일부 사용자 지정 구성 섹션과 같은 Web.config 파일의 선택된 부분을 암호화할 수 있으므로 이 문제를 완화하는 데 도움이 됩니다. 구성 섹션은 인코딩 또는 aspnet_regiis.exe(명령줄 프로그램)를 사용하여 쉽게 사전 암호화할 수 있습니다. 일단 암호화되면 Web.config 설정은 엿보는 눈으로부터 보호됩니다. 또한 ASP.NET 페이지에서 프로그래밍 방식으로 암호화된 구성 설정을 검색할 때 ASP.NET은 읽는 암호화된 부분을 자동으로 해독합니다. 즉, 구성 정보가 암호화되면 암호화된 데이터를 사용하기 위해 애플리케이션에서 다른 코드를 작성하거나 추가 조치를 취할 필요가 없습니다.
이 문서에서는 이 구성 설정 섹션을 프로그래밍 방식으로 암호화 및 해독하는 방법을 설명하고 명령줄 프로그램 aspnet_regiis.exe의 사용을 검토합니다. 그런 다음 ASP.NET 2.0에서 제공하는 암호화 옵션을 평가하겠습니다. 또한 ASP.NET 버전 1.x에서 구성 정보를 암호화하는 방법에 대해 간략하게 설명합니다.
2. 전제
ASP.NET 2.0 구성 정보를 암호화하는 방법에 대해 논의하기 전에 다음 사항을 기억하십시오.
1. 모든 형태의 암호화에는 일종의 비밀이 포함되며 이 비밀은 데이터를 암호화하고 해독할 때 사용됩니다. 대칭 암호화 알고리즘은 메시지를 암호화하고 복호화할 때 동일한 키를 사용하는 반면, 비대칭 암호화 알고리즘은 암호화 및 복호화에 서로 다른 키를 사용합니다. 어떤 기술을 사용하든 가장 중요한 것은 복호화 키가 얼마나 안전한가입니다.
2. ASP.NET 2.0에서 제공하는 구성 암호화 기술은 해커가 어떤 방식으로든 구성 파일을 검색하는 것을 방지하도록 설계되었습니다. 해커의 컴퓨터에 Web.config 파일이 있으면 암호화된 부분을 해독할 수 없다는 생각입니다. 그러나 웹 서버의 ASP.NET 페이지가 암호화된 구성 파일의 정보를 요청하는 경우 데이터를 사용하려면 먼저 암호를 해독해야 합니다(코드를 작성하지 않고도 이 작업이 수행됩니다). 따라서 해커가 구성 파일을 쿼리하고 그 결과를 표시하는 ASP.NET 웹 페이지를 시스템에 업로드할 수 있으면 암호화된 설정을 일반 텍스트로 볼 수 있습니다. (자세한 내용은 Web.config 파일의 다양한 부분을 암호화하고 해독하는 방법을 보여주는 이 기사에 제공된 샘플 ASP.NET 페이지를 참조하십시오. 보시다시피 ASP.NET 페이지는 액세스(및 표시)할 수 있습니다. 암호화된 데이터(일반 텍스트 형식)
3. 구성 정보를 암호화하고 해독하려면 특정 성능 비용이 필요합니다. 따라서 중요한 정보가 포함된 구성 부분만 암호화하는 것이 일반적입니다. 예를 들어 <compilation> 또는 <authorization> 구성 섹션을 암호화할 필요가 없을 수도 있습니다.
3. 어떤 종류의 정보를 암호화할 수 있습니까?
ASP.NET 2.0 구성 정보를 암호화하는 방법을 분석하기 전에 먼저 어떤 구성 정보를 암호화할 수 있는지 살펴보겠습니다. 개발자는 .NET Framework 2.0에서 제공하는 라이브러리를 사용하여 Web.config 또는 machine.config 파일의 대부분의 구성 섹션을 암호화할 수 있습니다. 이러한 구성 부분은 <configuration> 또는 <system.web> 요소의 하위 노드인 XML 요소입니다. 예를 들어 다음 샘플 Web.config 파일에는
<connectionStrings>, <compilation> 및 <authentication>으로 명시적으로 정의된 세 가지 구성 설정이 포함되어 있습니다.
<?xml 버전="1.0"?>
<구성 xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<연결문자열>
<이름 추가="MembershipConnectionString" ConnectionString="connectionString"/>
</connectionStrings>
<시스템.웹>
<컴파일 디버그="true"/>
<인증 모드="양식" />
</system.web>
이러한 각 섹션은 프로그래밍 방식으로 또는 aspnet_regiis.exe(명령줄 도구)를 통해 선택적으로 암호화할 수 있습니다. 암호화되면 암호화된 텍스트가 구성 파일에 직접 저장됩니다. 예를 들어 위의 <connectionStrings> 섹션을 암호화하려는 경우 결과 Web.config 파일은 다음과 같을 수 있습니다. (참고: 공간 제한으로 인해 <CipherValue>의 큰 부분을 생략했습니다.)
<?xml version= "1.0"?>
<구성 xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<암호화된 데이터>
<암호데이터>
<암호값>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
</CipherData>
</암호화된 데이터>
</connectionStrings>
<시스템.웹>
<컴파일 디버그="true"/>
<인증 모드="양식" />
</system.web>
또한 이 기술을 사용하여 암호화할 수 없는 일부 구성 부분이 있습니다.
· <processModel>
· <런타임>
· <mscorlib>
·<스타트업>
· <system.runtime.remoting>
· <configProtectedData>
· 〈위성 조립〉
· <암호화 설정>
· <cryptoNameMapping>
· <cryptoClasses>
이러한 구성 부분을 암호화하려면 해당 값을 암호화하여 레지스트리에 저장해야 합니다. 이 프로세스에 도움이 되는 aspnet_setreg.exe 명령줄 도구가 있습니다. 이 도구에 대해서는 이 문서의 뒷부분에서 설명하겠습니다.
[팁] Web.Config와 Machine.Config의 차이점:
Web.config 파일은 특정 웹 응용 프로그램에 대한 구성 설정을 지정하며 응용 프로그램의 루트 디렉터리에 있는 반면 machine.config 파일은 해당 웹 응용 프로그램의 모든 구성 설정을 지정합니다. 웹 서버의 $WINDOWSDIR$Microsoft.NetFrameworkVersionCONFIG 디렉터리에 있는 사이트에 대한 구성 설정입니다.
4. 암호화 옵션
개발자는 ASP.NET 2.0 공급자 모델을 사용하여 구성 섹션 정보를 보호할 수 있으며 이를 통해 모든 구현을 API에 원활하게 연결할 수 있습니다. .NET Framework 2.0은 구성 섹션 정보를 보호하기 위해 두 가지 기본 제공 공급자를 제공합니다.
· Windows DPAPI(데이터 보호 API) 공급자(DataProtectionConfigurationProvider): 이 공급자는 Windows의 기본 제공 암호화 기술을 사용하여 구성 섹션을 암호화하고 해독합니다. 기본적으로 이 공급자는 기본 키를 사용합니다. 사용자 키를 사용할 수도 있지만 이를 위해서는 약간의 사용자 정의가 필요합니다.
· RSA 보호 구성 공급자(RSAProtectedConfigurationProvider): RSA 공개 키 암호화를 사용하여 구성 섹션을 암호화하고 해독합니다. 이 공급자를 사용하면 구성 정보를 암호화하고 해독하는 데 사용되는 공개 키와 개인 키를 저장하는 키 컨테이너를 생성해야 합니다. 내보낼 수 있는 키 컨테이너를 생성하여 다중 서버 팜에서 RSA를 사용할 수 있습니다.
물론 필요한 경우 자체 보호 설정 공급자를 만들 수도 있습니다.
이 문서에서는 DPAPI 공급자를 사용하여 컴퓨터 수준 키를 사용하는 방법에 대해서만 설명합니다. 이는 키나 키 컨테이너를 생성할 필요가 없으므로 가장 간단한 방법입니다. 물론 단점은 암호화된 구성 파일은 처음에 암호화를 구현한 웹 서버에서만 사용할 수 있다는 것입니다. 또한 시스템 키를 사용하면 웹 서버의 모든 사이트에서 암호화된 텍스트를 해독할 수 있습니다.
5. 구성 섹션을 프로그래밍 방식으로 암호화합니다.
System.Configuration.SectionInformation 클래스는 구성 섹션에 대한 설명을 추상화합니다. 구성 섹션을 암호화하려면 간단히 SectionInformation 클래스의 ProtectSection(provider) 메서드를 사용하고 암호화를 수행하는 데 사용할 공급자의 이름을 전달하면 됩니다. 응용 프로그램의 Web.config 파일에 있는 특정 구성 섹션에 액세스하려면 WebConfigurationManager 클래스(System.Web.Configuration 네임스페이스에 있음)를 사용하여 Web.config 파일을 참조한 다음 해당 GetSection을 사용하면 됩니다. (sectionName) 메서드는 ConfigurationSection 인스턴스. 마지막으로 ConfigurationSection 인스턴스의 SectionInformation 속성을 통해 SectionInformation 개체를 얻을 수 있습니다.
아래에서는 간단한 코드 예제를 통해 문제를 설명합니다.
privatevoid ProtectSection(string sectionName, string 공급자)
{
구성 구성 = WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection 섹션 = config.GetSection(sectionName);
if (섹션 != null &&!section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(공급자);
구성.저장();
}
}
개인 무효 UnProtectSection(string sectionName) {
구성 구성 =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
ConfigurationSection 섹션 = config.GetSection n(섹션 이름);
if (섹션 != null && section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
구성.저장();
}
ASP.NET 페이지에서 이 ProtectSection(sectionName, 공급자) 메서드를 호출할 수 있습니다. 해당 매개 변수는 섹션 이름(예: ConnectionStrings) 및 공급자(예: DataProtectionConfigurationProvider)이며, 다음을 참조하여 Web.config 파일을 엽니다. 이 섹션에서는 SectionInformation 객체의 ProtectSection(provider) 메서드를 호출하고 마지막으로 구성 변경 사항을 저장합니다.
반면, UnProtectSection(provider) 메서드는 특정 구성 섹션의 암호 해독을 구현합니다. 여기에서는 해독할 섹션만 전달하면 됩니다. 해당 정보는 암호화된 섹션과 함께 제공되는 태그(즉, 위 예의 <connectionStrings> 섹션)에 이미 저장되어 있으므로 공급자를 귀찮게 할 필요가 없습니다. 나중에 암호화되면 <connectionStringsconfigProtectionProvider="DataProtectionConfigurationProvider">) 공급자가 포함됩니다.
이 데이터가 암호화되면 ASP.NET 페이지에서 읽을 때(즉, SqlDataSource 컨트롤에서 또는 프로그래밍 방식으로 ConfigurationManager.ConnectionStrings[connStringName].ConnectionString을 통해 연결 문자열 정보를 읽을 때) ASP.NET에서 자동으로 암호를 해독합니다. 연결 문자열을 입력하고 일반 텍스트 값을 반환합니다. 즉, 암호화를 구현한 후에는 코드를 전혀 변경할 필요가 없습니다. 정말 멋지죠?
이 기사에서 다운로드한 샘플 ASP.NET 2.0 웹 사이트에는 사이트의 Web.config 파일을 표시하는 샘플 페이지가 있습니다. 여기에는 암호화 구성을 위한 여러 줄의 TextBox와 해당 웹 컨트롤 버튼이 있습니다. 파일. 이 예제에서는 위에서 설명한 ProtectSection() 및 UnProtectSection() 메서드도 사용합니다.
6. 명령줄 도구 aspnet_regiis.exe를 사용합니다.
aspnet_regiis.exe 명령줄 도구를 사용하여 Web.config 파일의 구성 부분을 암호화하고 해독할 수도 있습니다. 이 내용은 "%WINDOWSDIR%Microsoft.Net에서 찾을 수 있습니다. Frameworkversion" 디렉터리. 도구. Web.config 파일의 섹션을 암호화하려면 다음과 같이 이 명령줄 도구에서 DPAPI 컴퓨터 키를 사용할 수 있습니다.
특정 웹 사이트에 대한 Web.config 파일을 암호화하는 일반적인 형식:
aspnet_regiis.exe -pef section Physical_directory - prov 공급자
또는:
aspnet_regiis.exe -pe 섹션 -app virtual_directory -prov
특정 웹 사이트의 Web.config 파일을 암호화하는 공급자의 특정 인스턴스:
aspnet_regiis.exe -pef "connectionStrings" "C:InetpubwwwrootMySite" -prov " DataProtectionConfigurationProvider"
또는:
aspnet_regiis.exe -pe "connectionStrings" -app "/MySite" -prov "DataProtectionConfigurationProvider"
특정 웹 사이트의 Web.config 파일을 해독하는 일반적인 형식:
aspnet_regiis.exe -pdf 섹션 Physical_directory
또는:
aspnet_regiis. exe -pd 섹션 -app virtual_directory
특정 웹 사이트의 Web.config 파일을 해독하는 구체적인 예:
aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
또는:
aspnet_regiis.exe가 실행되도록 지정할 수도 있습니다
.machine.config 파일 암호화/암호 해독.
[팁] ASP.NET 버전 1.x의 구성 설정 암호화
ASP.NET 버전 1.x의 구성 설정을 보호하려면 개발자는 웹 서버의 레지스트리에 중요한 설정을 암호화하고 저장해야 하며 A "강력한" 키 저장소를 사용해야 합니다. 방법. ASP.NET 2.0에서와 같이 암호화된 콘텐츠를 저장하는 대신 구성 파일에는 암호화된 값이 저장되는 레지스트리 키에 대한 참조만 포함됩니다. 예:
<identity impersonate="true"
userName="레지스트리:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,사용자 이름"
비밀번호="registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,password" />
Microsoft는 개발자에게 중요한 구성 정보를 암호화하고 이를 "강력한" 레지스트리 입구로 이동할 수 있는 aspnet_setreg.exe 명령줄 도구를 제공합니다. 불행하게도 이 도구는 특정 구성 설정에 대해서만 작동합니다. 반면 ASP.NET 2.0에서는 모든 구성 섹션을 암호화할 수 있습니다.
ASP.NET 1.x 응용 프로그램에서 aspnet_setreg.exe를 사용하는 방법에 대한 자세한 내용은 MSDN의 KB#32990을 참조하세요. 불행하게도 이 명령줄 프로그램은 구성 설정에서 미리 정의된 섹션만 암호화할 수 있으며 사용자가 직접 추가한 데이터베이스 연결 문자열 및 기타 중요한 정보는 암호화할 수 없습니다.
7. 결론
이 기사에서는 구성 섹션 정보를 보호하기 위해 ASP.NET 2.0에서 제공하는 다양한 암호화 옵션을 사용하는 방법을 배웠으며 프로그래밍 기술과 aspnet_regiis.exe를 사용하여 Web.config의 구성 섹션을 각각 암호화하는 방법도 설명했습니다. . 민감한 구성 설정을 보호하면 민감한 구성 설정을 발견하기가 더 어려워져 사이트를 해킹하기가 더 어려워집니다. 현재 ASP.NET 2.0은 이미 상대적으로 쉬운 암호화 및 암호 해독 기술을 제공하므로 개발자가 중요한 구성 설정을 보호하기 위해 이 방법을 사용하지 않을 이유가 없습니다.