다음을 통해 공유


암호화를 사용하여 암호 보호

작성자: Saad Ladki

소개

이 문서에서는 IIS 7.0 이상 서버에 대해 애플리케이션 풀 및 작업자 프로세스 격리를 설정하는 데 필요한 단계에 대한 개요를 제공합니다. 애플리케이션 풀 격리는 WAS(IIS 로컬 시스템 프로세스)가 액세스해야 하는 데이터를 보호해야 합니다. 이 데이터의 예로는 애플리케이션 풀 암호가 있습니다. 반면 작업자 프로세스 격리에는 애플리케이션 풀 ID가 액세스해야 하는 데이터 보호가 수반됩니다. 이 데이터의 예로 익명 사용자 계정 암호가 있습니다.

필수 조건

이 프로세스를 간소화하기 위해 다음 두 가지 샘플 코드가 제공됩니다.

  • machine.config에서 새 RSA 암호화 공급자를 만듭니다.
  • machine.config에서 기본 공급자의 이름을 설정합니다.

마지막 필수 구성 요소 섹션에서는 이후 항목에서 사용할 4개의 사용자 계정을 설정하는 방법에 대해 설명합니다.

새 RSA 암호화 공급자 애플리케이션 만들기

  1. 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();
            }
        }
    }
    
  2. 다음으로 관리자 권한 명령 프롬프트를 시작합니다.

    • 시작 메뉴를 클릭합니다.
    • 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다 .
    • 관리자 권한으로 실행을 선택합니다.
  3. 명령 프롬프트 창에서 createProvider.cs 파일을 저장한 위치로 이동하고 다음 명령을 실행하여 코드를 컴파일합니다.
    %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll createProvider.cs

이제 이 단계가 완료되었습니다.

기본 공급자를 변경하는 애플리케이션 만들기

  1. 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();
            }
        }
    }
    
  2. 다음으로 관리자 권한 명령 프롬프트를 시작합니다.

    • 시작 메뉴를 클릭합니다.
    • 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다 .
    • 관리자 권한으로 실행을 선택합니다.
  3. 명령 프롬프트 창에서 setProvider.cs 파일을 저장한 위치로 이동하고 다음 명령을 실행하여 코드를 컴파일합니다.
    %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll setProvider.cs

이제 이 단계가 완료되었습니다.

사용자 계정 만들기

이 단계에서는 이 문서 전체에서 사용할 4개의 새 사용자 계정을 만듭니다.

시작하려면 다음 단계를 사용하여 관리 권한으로 실행되는 명령 셸 창을 엽니다.

  1. 시작 메뉴를 클릭합니다.
  2. 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다.
  3. 관리자 권한으로 실행을 선택합니다.
  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 키 만들기

  1. 시작 메뉴를 클릭합니다.
  2. 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다.
  3. 관리자 권한으로 실행을 선택합니다.
  4. 명령 창에서 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 관리자를 사용하여 암호를 변경합니다.

  1. 시작 메뉴를 클릭합니다.
  2. 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다.
  3. 관리자 권한으로 실행을 선택합니다.
  4. 명령 창에서 setProvider.exe 저장한 위치로 이동하고 다음 명령을 실행합니다.
setProvider.exe Rsa_WAS

기본 공급자 Rsa_WAS 변경되었습니다.

새 애플리케이션 풀 만들기

이 단계에서는 서로 격리하는 두 개의 새 애플리케이션 풀을 만듭니다. 이렇게 하려면 IIS 관리자를 시작합니다.

  1. 시작을 클릭하고 'INetMgr.exe'을 입력하고 Enter 키를 누릅니다(메시지가 표시되면 계속을 선택하여 사용 권한 상승).

  2. + 연결 섹션에서 컴퓨터 이름 옆에 있는 단추를 클릭합니다.

  3. 애플리케이션 풀을 클릭합니다.

  4. 오른쪽의 애플리케이션 풀 추가에서 작업을 선택합니다.

  5. 이름 'AppPool1'을 입력한 다음 다음과 같이 확인을 누릅니다.

    O K 옵션에 포커스가 있는 애플리케이션 풀 추가 대화 상자의 스크린샷

  6. 이전 단계를 반복하지만 이번에는 AppPool2라는 이름을 사용합니다.

  7. 이제 IIS 내에 다음 화면이 표시됩니다.
    서버의 애플리케이션 풀 목록을 보여 주는 애플리케이션 풀 화면의 스크린샷

  8. AppPool1 및 AppPool2ID가 NetworkService인 방법을 확인합니다. AppPool1을 마우스 오른쪽 단추로 클릭한 다음 고급 설정을 선택하여 이전에 만든 계정으로 변경합니다.

  9. 타이틀 프로세스 모델에서:

    • ID 단어의 오른쪽에 있는 단추를 클릭합니다.

    • 애플리케이션 풀 Identiy 창에서 "사용자 지정 계정" 라디오 단추를 선택하고 "설정..."을 클릭합니다. 단추.

    • 자격 증명 설정 대화 상자에서 다음 사용자 이름과 암호를 입력합니다.

      사용자 이름: AppPoolIdentity1
      password: password1

      사용자 이름, 암호 및 암호 확인 필드를 보여 주는 자격 증명 설정 대화 상자의 스크린샷

  10. 이제 ID 값이 아래와 같이 표시됩니다.

    프로세스 모델 섹션에서 ID 값이 강조 표시된 고급 설정 대화 상자의 스크린샷

  11. 확인을 클릭하여 변경 내용을 저장합니다.

  12. AppPool2에 대해 이전 단계를 반복하고 사용자 이름 "AppPoolIdentity2" 및 암호 "password2"를 사용자에게 반복합니다.

  13. IIS 관리자에 다음이 표시됩니다(주로 애플리케이션 풀의 ID가 변경됨).

    애플리케이션 풀의 변경된 ID를 보여 주는 애플리케이션 풀의 스크린샷

  14. 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 공급자를 만들어 익명 암호를 암호화합니다.

새 사이트 만들기

이 섹션에서는 두 개의 새 사이트를 만들고 이전에 만든 애플리케이션 풀에 각 사이트를 추가합니다. 시작하려면 다음 단계를 사용하여 관리 권한으로 실행되는 명령 셸을 엽니다.

  1. 시작 메뉴를 클릭합니다.

  2. 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다 .

  3. 관리자 권한으로 실행을 선택합니다.

  4. 명령 창에서 다음 명령을 사용하여 wwwroot 디렉터리로 이동합니다.

    cd /d %SystemDrive%\inetpub\wwwroot
    
  5. 다음 명령을 사용하여 "one"이라는 새 디렉터리와 디렉터리 "2"를 만듭니다.

    mkdir one
    
    mkdir two
    
  6. 다음 HTML 코드를 포함하는 "1" 및 "2" 디렉터리에 기본 Default.htm 파일을 만듭니다.

    <html><body>Hello from site X</body></html>
    

    참고 항목

    파일의 디렉터리 위치에 따라 'X'를 '1' 또는 '2'로 바꿉다.

이제 IIS 관리자를 사용하여 두 개의 사이트를 만듭니다.

  1. 시작을 클릭하고 INetMgr.exe 입력하고 Enter 키를 누릅니다(메시지가 표시되면 계속을 선택하여 사용 권한 상승).

  2. + 연결 섹션에서 컴퓨터 이름 옆에 있는 단추를 클릭합니다.

  3. 연결 아래의 트리 보기에서 사이트를 마우스 오른쪽 단추 클릭한 다음 웹 사이트 추가를 선택합니다.

  4. 다음 정보를 사용하여 사이트를 만듭니다.

    웹 사이트 이름: 1
    애플리케이션 풀: AppPool1
    물리적 경로: {inetpub 디렉터리의 위치}\wwwroot\one
    포트: 81

    완료되면 다음과 같이 표시됩니다.

    사이트 이름 필드가 One 항목으로 채워지는 웹 사이트 추가 대화 상자의 스크린샷

  5. 확인을 클릭하여 변경 내용을 저장합니다.

  6. 이전 두 단계를 반복하지만 이번에는 두 번째 사이트에 대해 다음 정보를 사용합니다.

    웹 사이트 이름: 2
    애플리케이션 풀: AppPool2
    실제 경로: {inetpub 디렉터리의 위치}\wwwroot\two
    포트: 82

이제 One과 Two라는 두 개의 새 사이트를 만들고 AppPool1AppPool2 애플리케이션 풀에 추가했습니다.

사이트를 테스트할 URL은 다음과 같습니다.

  • http://localhost:81 사이트 1의 경우
  • http://localhost:82 for site 2

각 애플리케이션 풀에 대한 새 공급자 만들기

이 섹션에서는 각 애플리케이션 풀에 대한 새 RSA 공급자를 만듭니다.

  1. 시작 메뉴 클릭합니다.

  2. 명령 프롬프트를 마우스 오른쪽 단추로 클릭합니다 .

  3. 관리자 권한으로 실행을 선택합니다.

  4. 명령 창 실행에서 createProvider.exe 저장한 위치로 이동하고 다음 명령을 실행합니다.

    createProvider.exe App1Key RsaKeyForAppPool1 Rsa_app1
    createProvider.exe App2Key RsaKeyForAppPool2 Rsa_app2
    

사이트 1에 대한 익명 계정 설정

관리자 권한 명령 프롬프트 창에서 다음 명령을 실행합니다.

setProvider.exe Rsa_app1
  1. IIS 관리자돌아가서 사이트 1을 두 번 클릭합니다.

  2. 기능 이름 제목 아래에서 인증 항목을 두 번 클릭합니다.

  3. 익명 인증을 선택한 다음 익명 인증 자격 증명 편집 대화 상자가 표시되는 오른쪽의 작업 제목 아래에서 편집을 클릭합니다.

  4. 특정 사용자 옵션을 클릭한 다음 설정 단추를 클릭합니다.

  5. 사용자 이름 AnonymousAccount1 및 password3 을 입력하고 확인을 선택합니다.

  6. 그러면 다음 대화 상자가 나타납니다.

    익명 인증 자격 증명 편집 대화 상자의 스크린샷.

  7. 확인을 눌러 변경 내용을 저장합니다.

사이트 2에 대한 익명 계정 설정

관리자 권한 명령 프롬프트 창에서 다음 명령을 실행합니다.

setProvider.exe Rsa_app2
  1. IIS 관리자돌아가서 사이트 2를 두 번 클릭합니다.
  2. 기능 이름 제목 아래에서 인증 항목을 두 번 클릭합니다.
  3. 익명 인증을 선택한 다음 오른쪽의 작업 제목 아래에서 편집을 클릭하여 익명 자격 증명 편집 대화 상자를 표시합니다.
  4. 특정 사용자 옵션을 클릭하고 [설정]을 클릭합니다.
  5. 사용자 이름 AnonymousAccount2 및 암호 암호4를 입력하고 확인을 선택합니다.
  6. 확인을 클릭하여 변경 내용을 저장합니다.

암호화 공급자를 기본값으로 다시 설정

  • 관리자 권한 명령 프롬프트 창으로 돌아가서 다음 명령을 실행합니다.
setProvider.exe RsaProtectedConfigurationProvider

참고 항목

이렇게 변경하면 암호화된 모든 미래 속성에서 기본 암호화 공급자를 사용할 수 있습니다.

변경 내용 확인

원하는 일이 발생했는지 확인합니다. Windows 메모장을 사용하여 파일을 엽니다.%SystemRoot%\System32\Inetsrv\applicationHost.config

  • AppPool1AppPool2암호는 모두 여전히 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가 속한 익명 암호의 암호를 해독할 수 있으며 다른 누구도 암호 해독할 수 없습니다.