암호화를 사용하여 암호 보호
작성자: Saad Ladki
소개
이 문서에서는 IIS 7.0 이상 서버에 대해 애플리케이션 풀 및 작업자 프로세스 격리를 설정하는 데 필요한 단계에 대한 개요를 제공합니다. 애플리케이션 풀 격리는 WAS(IIS 로컬 시스템 프로세스)가 액세스해야 하는 데이터를 보호해야 합니다. 이 데이터의 예로는 애플리케이션 풀 암호가 있습니다. 반면 작업자 프로세스 격리에는 애플리케이션 풀 ID가 액세스해야 하는 데이터 보호가 수반됩니다. 이 데이터의 예로 익명 사용자 계정 암호가 있습니다.
필수 조건
이 프로세스를 간소화하기 위해 다음 두 가지 샘플 코드가 제공됩니다.
- machine.config에서 새 RSA 암호화 공급자를 만듭니다.
- machine.config에서 기본 공급자의 이름을 설정합니다.
마지막 필수 구성 요소 섹션에서는 이후 항목에서 사용할 4개의 사용자 계정을 설정하는 방법에 대해 설명합니다.
새 RSA 암호화 공급자 애플리케이션 만들기
Windows 메모장을 열고 다음 C# 코드가 포함된 선택한 명명된 createProvider.cs 디렉터리에 파일을 만듭니다.
using System; using Microsoft.Web.Administration; using System.Configuration; namespace testingEncryption { public class createProvider { public static void Main(string[] args) { String keyContainerName = args[0]; String description = args[1]; String providerName = args[2]; System.Configuration.Configuration machineConfig = System.Configuration.ConfigurationManager.OpenMachineConfiguration(); System.Configuration.ProviderSettings settings = new System.Configuration.ProviderSettings(providerName, "System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); settings.Parameters["description"] = description; settings.Parameters["keyContainerName"] = keyContainerName; settings.Parameters["cspProviderName"] = String.Empty; settings.Parameters["useMachineContainer"] = "true"; settings.Parameters["useOAEP"] = "false"; settings.Parameters["name"] = providerName; ProtectedConfigurationSection pcSection = (System.Configuration.ProtectedConfigurationSection)machineConfig.GetSection ("configProtectedData"); pcSection.Providers.Add(settings); machineConfig.Save(); } } }
다음으로 관리자 권한 명령 프롬프트를 시작합니다.
- 시작 메뉴를 클릭합니다.
- 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다 .
- 관리자 권한으로 실행을 선택합니다.
명령 프롬프트 창에서 createProvider.cs 파일을 저장한 위치로 이동하고 다음 명령을 실행하여 코드를 컴파일합니다.
%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll createProvider.cs
이제 이 단계가 완료되었습니다.
기본 공급자를 변경하는 애플리케이션 만들기
Windows 메모장을 열고 다음 C# 코드가 포함된 명명된 setProvider.cs 선택한 디렉터리에 파일을 만듭니다.
using System; using Microsoft.Web.Administration; using System.Configuration; namespace testingEncryption { public class setProvider { public static void Main(string[] args) { String provider = args[0]; // example: DataProtectionConfigurationProvider System.Configuration.Configuration machineConfig = System.Configuration.ConfigurationManager.OpenMachineConfiguration(); ProtectedConfigurationSection pcSection = (System.Configuration.ProtectedConfigurationSection)machineConfig.GetSection("configProtectedData"); string oldEncryptionProviderName = pcSection.DefaultProvider; Console.WriteLine("The default provider is currently: " + oldEncryptionProviderName); Console.WriteLine("Changing the default provider to: " + provider); pcSection.DefaultProvider = provider; machineConfig.Save(); } } }
다음으로 관리자 권한 명령 프롬프트를 시작합니다.
- 시작 메뉴를 클릭합니다.
- 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다 .
- 관리자 권한으로 실행을 선택합니다.
명령 프롬프트 창에서 setProvider.cs 파일을 저장한 위치로 이동하고 다음 명령을 실행하여 코드를 컴파일합니다.
%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll setProvider.cs
이제 이 단계가 완료되었습니다.
사용자 계정 만들기
이 단계에서는 이 문서 전체에서 사용할 4개의 새 사용자 계정을 만듭니다.
시작하려면 다음 단계를 사용하여 관리 권한으로 실행되는 명령 셸 창을 엽니다.
- 시작 메뉴를 클릭합니다.
- 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다.
- 관리자 권한으로 실행을 선택합니다.
- 명령 창에서 다음 명령을 실행합니다.
net user /add AppPoolIdentity1 password1
net user /add AppPoolIdentity2 password2
net user /add AnonymousAccount1 password3
net user /add AnonymousAccount2 password
이제 이 단계가 완료되었습니다.
애플리케이션 풀 격리
IIS에는 LOCALSYSTEM의 컨텍스트에서 실행되는 WAS라는 프로세스가 있으며 애플리케이션 풀 암호에 액세스해야 하는 유일한 프로세스입니다. 이 작업에서는 다음을 수행합니다.
- LOCALSYSTEM 및 관리자만 액세스할 수 있는 새 RSA 키(iisWasKey)를 만듭니다. 이 키는 모든 애플리케이션 풀의 암호를 암호화하는 데 사용됩니다.
- 두 개의 애플리케이션 풀을 만듭니다.
- 각 애플리케이션 풀을 서로 다른 ID로 실행하고 iisWasKey를 사용하여 암호를 암호화하도록 구성합니다.
- SYSTEM 및 관리자만 액세스할 수 있도록 키 파일에 대한 NTFS 파일 시스템 권한을 제한합니다.
새 RSA 키 만들기
- 시작 메뉴를 클릭합니다.
- 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다.
- 관리자 권한으로 실행을 선택합니다.
- 명령 창에서 createProvider.exe 저장한 위치로 이동하고 다음 명령을 실행합니다.
createProvider.exe iisWasKey RsaKeyForWAS Rsa_WAS
이러한 변경 내용이 올바르게 발생했는지 확인합니다. 사용 중인 Windows 메모장을 열고 새 공급자에 대한 섹션의 줄이 있는지 확인합니다 %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\config\machine.config
.
keyContainerName="NetFrameworkConfigurationKey" cspProviderName=""
useMachineContainer="true" useOAEP="false" name="RsaProtectedConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
useMachineProtection="true" keyEntropy="" name="DataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
cspProviderName="" useMachineContainer="true" useOAEP="false"
name="Rsa_WAS"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
애플리케이션 풀 암호 암호화
기본적으로 속성이 암호화될 때마다 IIS는 machine.config에 정의된 암호화에 defaultProvider를 사용합니다. 기본값은 RsaProtectedConfigurationProvider입니다.
이 단계에서는 이전에 만든 setProvider.exe 애플리케이션을 사용하여 공급자를 iisWasKey로 변경한 다음 IIS 관리자를 사용하여 암호를 변경합니다.
- 시작 메뉴를 클릭합니다.
- 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다.
- 관리자 권한으로 실행을 선택합니다.
- 명령 창에서 setProvider.exe 저장한 위치로 이동하고 다음 명령을 실행합니다.
setProvider.exe Rsa_WAS
기본 공급자 Rsa_WAS 변경되었습니다.
새 애플리케이션 풀 만들기
이 단계에서는 서로 격리하는 두 개의 새 애플리케이션 풀을 만듭니다. 이렇게 하려면 IIS 관리자를 시작합니다.
시작을 클릭하고 'INetMgr.exe'을 입력하고 Enter 키를 누릅니다(메시지가 표시되면 계속을 선택하여 사용 권한 상승).
+ 연결 섹션에서 컴퓨터 이름 옆에 있는 단추를 클릭합니다.
애플리케이션 풀을 클릭합니다.
오른쪽의 애플리케이션 풀 추가에서 작업을 선택합니다.
이름 'AppPool1'을 입력한 다음 다음과 같이 확인을 누릅니다.
이전 단계를 반복하지만 이번에는 AppPool2라는 이름을 사용합니다.
AppPool1 및 AppPool2의 ID가 NetworkService인 방법을 확인합니다. AppPool1을 마우스 오른쪽 단추로 클릭한 다음 고급 설정을 선택하여 이전에 만든 계정으로 변경합니다.
타이틀 프로세스 모델에서:
이제 ID 값이 아래와 같이 표시됩니다.
확인을 클릭하여 변경 내용을 저장합니다.
AppPool2에 대해 이전 단계를 반복하고 사용자 이름 "AppPoolIdentity2" 및 암호 "password2"를 사용자에게 반복합니다.
IIS 관리자에 다음이 표시됩니다(주로 애플리케이션 풀의 ID가 변경됨).
Windows 메모장을 사용하고 파일을 열어 변경 내용을 확인합니다
%SystemRoot%\System32\Inetsrv\applicationHost.config
. applicationPools 섹션으로 이동하면 의도한 대로 Rsa_WAS 키를 사용하여 애플리케이션 풀 암호를 암호화한 것을 볼 수 있습니다.password="[enc:Rsa_WAS:jAAAAAECAAADZgAAAKQAAAUkBfhWFbUHIt/qtlo+P7CiZC10r9H0DGBvAl U2mhiOxMoHXX6Dz0S8TQjKx2YTKvuE8y+SBUWrEs3JYzXKOkY45Q9z6E/3BFvru5oR9uzbjInASKF/83N N1tIEsoorQWmUOjnL4XM9RNzpqkY6TgyC3CyPUGN9fR7li5+AUupHHfgVPMzcLHfCsoq+ri+X6IbEnJdu cUEAYBn1P9F/Zxk=:enc]" /> password="[enc:Rsa_WAS:jAAAAAECAAADZgAAAKQAAEbQEa/sAmyLbryAR0hD3voip2+0RfzM44sXPekp I2H7HYLzta55NfLcG8vSPHhasahKVgO4wcIcT03CLSn+5koWvAaIRdeClhXWK/X8ZQPFooOpyhOqT0TEP5v jB+DXAKgq0RC6ufHFtrHMy0U69ew7/49YXEcrkF+o8OJZ1K+EkgA3J2ikHKxW0pFBU0tFvLCjt2/UXypfNI 0hYPe2syk=:enc]" />
암호화 공급자 잠금
기본적으로 IIS_IUSRS 만들 때 키에 대한 읽기 권한이 부여됩니다. 그러나 ASPNET_REGIIS 도구를 사용하여 해당 액세스를 제거할 수 있습니다. 이렇게 하려면 관리자 권한 명령 프롬프트에서 다음 명령을 실행합니다.
cd /d %systemroot%
cd Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pr iisWasKey IIS_IUSRS
이로 인해 IIS_IUSRS(애플리케이션 풀 ID 그룹)가 관리자 및 LOCALSYSTEM 액세스 전용인 iisWasKey를 읽을 수 없게 됩니다.
작업자 프로세스 격리
이 항목에서는 서로 다른 애플리케이션 풀에 속하고 다른 익명 인증 ID가 있는 두 개의 새 사이트를 만들어 작업자 프로세스 격리를 설정하는 방법을 설명합니다. 그런 다음 각 애플리케이션 풀에 대한 새 RSA 공급자를 만들어 익명 암호를 암호화합니다.
새 사이트 만들기
이 섹션에서는 두 개의 새 사이트를 만들고 이전에 만든 애플리케이션 풀에 각 사이트를 추가합니다. 시작하려면 다음 단계를 사용하여 관리 권한으로 실행되는 명령 셸을 엽니다.
시작 메뉴를 클릭합니다.
명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다 .
관리자 권한으로 실행을 선택합니다.
명령 창에서 다음 명령을 사용하여 wwwroot 디렉터리로 이동합니다.
cd /d %SystemDrive%\inetpub\wwwroot
다음 명령을 사용하여 "one"이라는 새 디렉터리와 디렉터리 "2"를 만듭니다.
mkdir one
mkdir two
다음 HTML 코드를 포함하는 "1" 및 "2" 디렉터리에 기본 Default.htm 파일을 만듭니다.
<html><body>Hello from site X</body></html>
참고 항목
파일의 디렉터리 위치에 따라 'X'를 '1' 또는 '2'로 바꿉다.
이제 IIS 관리자를 사용하여 두 개의 사이트를 만듭니다.
시작을 클릭하고 INetMgr.exe 입력하고 Enter 키를 누릅니다(메시지가 표시되면 계속을 선택하여 사용 권한 상승).
+ 연결 섹션에서 컴퓨터 이름 옆에 있는 단추를 클릭합니다.
연결 아래의 트리 보기에서 사이트를 마우스 오른쪽 단추로 클릭한 다음 웹 사이트 추가를 선택합니다.
다음 정보를 사용하여 사이트를 만듭니다.
웹 사이트 이름: 1
애플리케이션 풀: AppPool1
물리적 경로: {inetpub 디렉터리의 위치}\wwwroot\one
포트: 81완료되면 다음과 같이 표시됩니다.
확인을 클릭하여 변경 내용을 저장합니다.
이전 두 단계를 반복하지만 이번에는 두 번째 사이트에 대해 다음 정보를 사용합니다.
웹 사이트 이름: 2
애플리케이션 풀: AppPool2
실제 경로: {inetpub 디렉터리의 위치}\wwwroot\two
포트: 82
이제 One과 Two라는 두 개의 새 사이트를 만들고 AppPool1 및 AppPool2 애플리케이션 풀에 추가했습니다.
사이트를 테스트할 URL은 다음과 같습니다.
http://localhost:81
사이트 1의 경우http://localhost:82
for site 2
각 애플리케이션 풀에 대한 새 공급자 만들기
이 섹션에서는 각 애플리케이션 풀에 대한 새 RSA 공급자를 만듭니다.
시작 메뉴 클릭합니다.
명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다 .
관리자 권한으로 실행을 선택합니다.
명령 창 실행에서 createProvider.exe 저장한 위치로 이동하고 다음 명령을 실행합니다.
createProvider.exe App1Key RsaKeyForAppPool1 Rsa_app1 createProvider.exe App2Key RsaKeyForAppPool2 Rsa_app2
사이트 1에 대한 익명 계정 설정
관리자 권한 명령 프롬프트 창에서 다음 명령을 실행합니다.
setProvider.exe Rsa_app1
IIS 관리자로 돌아가서 사이트 1을 두 번 클릭합니다.
기능 이름 제목 아래에서 인증 항목을 두 번 클릭합니다.
익명 인증을 선택한 다음 익명 인증 자격 증명 편집 대화 상자가 표시되는 오른쪽의 작업 제목 아래에서 편집을 클릭합니다.
특정 사용자 옵션을 클릭한 다음 설정 단추를 클릭합니다.
사용자 이름 AnonymousAccount1 및 password3 을 입력하고 확인을 선택합니다.
그러면 다음 대화 상자가 나타납니다.
확인을 눌러 변경 내용을 저장합니다.
사이트 2에 대한 익명 계정 설정
관리자 권한 명령 프롬프트 창에서 다음 명령을 실행합니다.
setProvider.exe Rsa_app2
- IIS 관리자로 돌아가서 사이트 2를 두 번 클릭합니다.
- 기능 이름 제목 아래에서 인증 항목을 두 번 클릭합니다.
- 익명 인증을 선택한 다음 오른쪽의 작업 제목 아래에서 편집을 클릭하여 익명 자격 증명 편집 대화 상자를 표시합니다.
- 특정 사용자 옵션을 클릭하고 [설정]을 클릭합니다.
- 사용자 이름 AnonymousAccount2 및 암호 암호4를 입력하고 확인을 선택합니다.
- 확인을 클릭하여 변경 내용을 저장합니다.
암호화 공급자를 기본값으로 다시 설정
- 관리자 권한 명령 프롬프트 창으로 돌아가서 다음 명령을 실행합니다.
setProvider.exe RsaProtectedConfigurationProvider
참고 항목
이렇게 변경하면 암호화된 모든 미래 속성에서 기본 암호화 공급자를 사용할 수 있습니다.
변경 내용 확인
원하는 일이 발생했는지 확인합니다. Windows 메모장을 사용하여 파일을 엽니다.%SystemRoot%\System32\Inetsrv\applicationHost.config
AppPool1 및 AppPool2의 암호는 모두 여전히 Rsa_Was 키로 보호됩니다.
AnonymousAccount1의 암호도 Rsa_app1 키로 보호됩니다.
password="[enc:Rsa_app1:jAAAAAECAAADZgAAAKQAAKoz4LV7HyPQuyNzXh8gspB0rPG7j3Ijvn3d+jY3/f gma8ZxA7AHLUxjis9b0+Qu8XkLvsGn/A+F+m1O68gY1LkWzAcSW9ks81FuiBVhpZx73FzEo6aOz2QqBduJ7Xhu x923KMBqmwkIVJ0mVAdzwFIm6LWymwRXxNxDE4eosKsw6QP6Rd6duC8gckaLxrTndclErQYgGdMt3W6ofxzRMlc=:enc]" />
마지막으로 AnonymousAccount2 암호도 Rsa_app2 키로 보호됩니다.
password="[enc:Rsa_app2:jAAAAAECAAADZgAAAKQAAKmHMhCTICEUhGncSGCxQc6ll/QGXo0asEIzOf3rIjl sBDGRYhlDQWlf2QbFcIsBGYt8dHo9hzAQN/f03BPSlaFynevpSx4xJOg2/B8ATgPmCg4vgxpY5huZbGxongs55c Rr20WFXsxzlUuw1xoUZI8c1+7gQPOtF0Rwh1g8NBmb5ML/R3jAIFcMtVhaj0OOIfAP7JCjdInwztBqK0XO7FM=:enc]" />
암호화 공급자 잠금
위의 이전처럼 키에 대한 파일 권한을 보호합니다. 관리자 권한 명령 프롬프트에서 다음 명령을 실행합니다.
cd /d %systemroot%
cd Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pr App1Key IIS_IUSRS
aspnet_regiis.exe -pa App1Key AppPoolIdentity1
aspnet_regiis.exe -pr App2Key IIS_IUSRS
aspnet_regiis.exe -pa App2Key AppPoolIdentity2
이러한 명령은 키를 읽는 IIS_IUSRS 기능을 제거하고 키에 대한 액세스 권한이 필요한 애플리케이션 풀 ID만 추가했습니다.
사이트 테스트
이제 사이트를 테스트합니다.
http://localhost:81
http://localhost:82
모든 것이 이전과 마찬가지로 계속 작동해야 합니다.
요약
요약하자면, 애플리케이션 풀 설정을 보호하기 위해 다음 작업을 수행했습니다.
- 두 개의 애플리케이션 풀을 만들었습니다.
- 두 개의 로컬 사용자 계정을 만들고 애플리케이션 풀 ID로 구성
- 관리 암호화 키를 만들어 모든 애플리케이션 풀 ID 암호를 보호하는 데 사용했습니다.
- ASPNET_REGIIS 사용하여 키 액세스에서 IIS_IUSRS(애플리케이션 풀 ID 그룹)를 제거했습니다.
이러한 작업을 통해 관리자 및 SYSTEM 계정만 애플리케이션 풀에 대한 암호를 읽을 수 있습니다. 따라서 애플리케이션 풀 내의 애플리케이션이 해당(또는 임의의) 애플리케이션 풀에 대한 암호를 검색하려고 하면 시도가 실패합니다.
작업자 프로세스 설정을 격리하기 위해 다음을 수행합니다.
- 새 익명 ID 계정 만들기
- 애플리케이션 풀에 대한 새 공급자를 만들었습니다.
- 애플리케이션 풀 키를 사용하여 익명 인증 암호를 암호화했습니다.
- IIS_IUSRS 익명 인증 공급자에 대한 액세스 권한을 제거하고 애플리케이션 풀 ID에 대한 액세스 권한만 부여했습니다.
이렇게 하면 애플리케이션 풀 ID가 속한 익명 암호의 암호를 해독할 수 있으며 다른 누구도 암호 해독할 수 없습니다.