관리형 Microsoft AD 도메인에 AD FS 배포

이 가이드에서는 Microsoft Active Directory용 관리형 서비스 도메인에서 Windows Server 2019용 Microsoft Active Directory Federation Services(AD FS)를 배포하는 방법을 설명합니다.

다음은 배포를 도식화한 다이어그램입니다.

아키텍처

사용자는 SSL 연결을 종료하기 위해 Google 관리 인증서를 사용하는 HTTPS 부하 분산기와 통신합니다. 부하 분산기는 Windows Server 2019용 Microsoft AD FS를 실행하고 Managed Microsoft AD 도메인에 조인되는 VM 인스턴스에 연결을 전달합니다. 부하 분산기와 VM 인스턴스 사이의 통신은 자체 서명된 SSL 인증서를 사용하여 보호됩니다.

배포에는 단일 AD FS 인스턴스와 소규모 환경에 적합한 Windows Internal Database가 사용됩니다. 안정성 및 보안 요구가 높은 환경에서는 팜 구성으로 AD FS 인스턴스를 여러 개 배포하고 통합 프록시를 배포하는 것이 좋습니다.

시작하기 전에

프로젝트 및 네트워크 준비

AD FS 배포를 위해 Google Cloud 프로젝트와 VPC 네트워크를 준비해야 합니다.

VM 인스턴스 만들기

AD FS를 실행할 서비스 계정과 VM 인스턴스를 만듭니다.

  1. Google Cloud 콘솔에서 Cloud Shell을 엽니다.

    Cloud Shell 활성화

  2. 기본 프로젝트 ID를 설정합니다.

    gcloud config set project PROJECT_ID
    

    PROJECT_ID를 Google Cloud 프로젝트의 ID로 바꿉니다.

  3. 기본 리전 및 영역을 설정합니다.

    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
    

    다음을 바꿉니다.

    • REGION: 배포할 리전의 ID
    • ZONE: 배포할 영역의 ID
  4. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create SA_NAME
    

    SA_NAME을 서비스 계정의 이름으로 바꿉니다.

  5. Windows Server 2019를 실행하고 특수 스크립트를 사용하는 VM 인스턴스를 만들어 자동으로 AD FS 서버 역할을 설치합니다.

    gcloud compute instances create VM_NAME \
      --machine-type n2-standard-8 \
      --image-family windows-2019 \
      --image-project windows-cloud \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --subnet SUBNET_NAME \
      --service-account SA_NAME@$(gcloud config get-value core/project).iam.gserviceaccount.com \
      --metadata sysprep-specialize-script-ps1="Add-WindowsFeature ADFS-Federation -IncludeManagementTools;Add-WindowsFeature RSAT-AD-PowerShell;Add-WindowsFeature RSAT-ADDS-Tools"
    

    다음을 바꿉니다.

    • VM_NAME: VM 인스턴스 이름
    • SUBNET_NAME: AD FS를 배포할 서브넷의 이름
    • SA_NAME: 서비스 계정의 이름

    VM 인스턴스를 구성하고 Active Directory 도메인에 조인하려면 다음 단계를 완료하세요.

    1. 직렬 포트 출력을 확인하여 VM의 초기화 프로세스를 모니터링합니다.

      gcloud compute instances tail-serial-port-output VM_NAME
      

      출력으로 Instance setup finished가 표시될 때까지 3분 정도 기다린 다음 Ctrl+C를 누릅니다. 이제 VM 인스턴스를 사용할 수 있습니다.

    2. VM 인스턴스의 사용자 이름과 비밀번호를 만듭니다.

    3. 원격 데스크톱을 사용하여 VM에 연결하고 이전 단계에서 만든 사용자 이름과 비밀번호를 사용하여 로그인합니다.

    4. Start(시작) 버튼을 마우스 오른쪽 버튼으로 클릭하고(또는 Win+X 누름) Windows PowerShell(관리자)을 클릭합니다.

    5. 를 클릭하여 권한 승격 프롬프트를 확인합니다.

    6. 컴퓨터를 Active Directory 도메인에 연결하고 다시 시작합니다.

      Add-Computer -Domain DOMAIN -Restart
      

      DOMAIN을 Active Directory 도메인의 DNS 이름으로 바꿉니다.

      다시 시작이 완료될 때까지 1분 정도 기다립니다.

부하 분산기 만들기

사용자가 단일 가상 IP 주소를 사용하여 AD FS에 액세스할 수 있는 부하 분산기를 만들어야 합니다.

AD FS를 실행하는 VM 인스턴스를 부하 분산기와 연결하려면 먼저 비관리형 인스턴스 그룹을 만든 후 이 인스턴스 그룹을 부하 분산기에 할당합니다.

  1. 기존 Cloud Shell 세션으로 돌아갑니다.
  2. 비관리형 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME &&
    gcloud compute instance-groups set-named-ports INSTANCE_GROUP_NAME --named-ports=http:443
    

    INSTANCE_GROUP_NAME을 만들려는 그룹의 이름으로 바꿉니다.

  3. 기존 VM 인스턴스를 인스턴스 그룹에 추가합니다.

    gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances VM_NAME
    
  4. AD FS의 HTTPS 포트를 프로브하는 상태 점검을 만듭니다.

    gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port 443
    

    HEALTH_CHECK_NAME을 상태 확인 이름으로 바꿉니다.

  5. 전에 만든 HTTPS 상태 점검 및 인스턴스 그룹을 사용하는 부하 분산기 백엔드 서비스를 만듭니다.

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
      --health-checks HEALTH_CHECK_NAME \
      --port-name http \
      --protocol HTTPS \
      --global && \
    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --instance-group INSTANCE_GROUP_NAME \
      --global \
      --instance-group-zone $(gcloud config get-value compute/zone)
    

    BACKEND_SERVICE_NAME을 백엔드 서비스 이름으로 바꿉니다.

  6. 부하 분산기에 대해 고정 외부 IP 주소를 예약합니다.

    gcloud compute addresses create ADDRESS_NAME --global
    

    ADDRESS_NAME을 이 주소와 연결할 이름으로 바꿉니다.

  7. 부하 분산기의 관리형 SSL 인증서를 만듭니다.

    gcloud compute ssl-certificates create CERTIFICATE_NAME \
      --domains PUBLIC_FQDN \
      --global
    

    다음을 바꿉니다.

    • CERTIFICATE_NAME: 관리형 SSL 인증서의 이름
    • PUBLIC_FQDN: AD FS에 사용할 정규화된 공개 도메인 이름(FQDN). 예를 들면 login.example.com입니다.
  8. 외부 IP 주소를 사용하고 트래픽을 백엔드 서비스로 전달하는 부하 분산기 프런트엔드를 만듭니다.

    gcloud compute url-maps create URL_MAP_NAME \
      --default-service BACKEND_SERVICE_NAME && \
    gcloud compute target-https-proxies create PROXY_NAME \
      --ssl-certificates CERTIFICATE_NAME \
      --url-map URL_MAP_NAME && \
    gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
      --global \
      --address ADDRESS_NAME \
      --target-https-proxy PROXY_NAME \
      --ports 443
    

    다음을 바꿉니다.

    • URL_MAP_NAME: 부하 분산기의 URL 맵 이름
    • PROXY_NAME: 부하 분산기의 대상 프록시 이름
    • FORWARDING_RULE_NAME: 부하 분산기의 전달 규칙 이름
  9. 부하 분산기에서 AD FS를 실행하는 VM 인스턴스로 트래픽을 허용하는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create FIREWALL_RULE_NAME \
      --allow tcp:443 \
      --network VPC_NAME \
      --source-ranges 130.211.0.0/22,35.191.0.0/16 \
      --target-service-accounts SA_NAME@$(gcloud config get-value core/project).iam.gserviceaccount.com
    

    다음을 바꿉니다.

    • FIREWALL_RULE_NAME: 방화벽 규칙의 이름
    • VPC_NAME: VPC 네트워크의 이름
    • SA_NAME: 서비스 계정의 이름

    소스 범위는 내부 부하 분산기의 IP 범위입니다. 자세한 내용은 방화벽 규칙 구성을 참조하세요.

  10. 부하 분산기의 IP 주소를 찾습니다.

    gcloud compute addresses describe ADDRESS_NAME \
       --global \
       --format=value\(address\)
    
  11. 공개 DNS 영역에서 부하 분산기의 IP 주소를 나타내는 DNS A 레코드를 만듭니다. DNS 레코드의 정규화된 이름은 SSL 인증서에 사용한 이름과 일치해야 합니다.

AD FS 배포

VM 인스턴스에 AD FS 서버 역할을 배포해야 합니다. 관리형 Microsoft AD 도메인에서 Domain Admins 권한이 없기 때문에 서버 관리자를 사용하여 설치를 수행할 수 없고, 대신 PowerShell을 사용해야 합니다.

서비스 사용자 만들기

Active Directory에 AD FS 서비스를 위한 사용자 계정을 만들어야 합니다.

  1. 원격 데스크톱을 사용하여 VM 인스턴스에 연결하고 위임된 관리자 사용자 인증 정보를 사용하여 로그인합니다.
  2. Start(시작) 버튼을 마우스 오른쪽 버튼으로 클릭하고(또는 Win+X 누름) Windows PowerShell(관리자)을 클릭합니다.
  3. AD FS 서비스 계정의 무작위 비밀번호를 설정합니다.

    $AdfsCredential = Get-Credential -UserName USER -Message 'PASSWORD'
    

    다음을 바꿉니다.

    • USER: Active Directory 사용자의 이름
    • PASSWORD: Active Directory 사용자의 비밀번호
  4. Active Directory 사용자 를 만듭니다.

    $CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName
    $AdfsUser = New-ADuser `
      -Name USER `
      -DisplayName 'AD FS service account' `
      -AccountPassword $AdfsCredential.Password `
      -Path "$CloudOuPath" `
      -PasswordNeverExpires $True `
      -PassThru | Enable-ADAccount -PassThru
    
  5. 사용자를 로컬 관리자 그룹에 추가합니다.

    Add-LocalGroupMember `
     -Group "Administrators" `
     -Member "$env:userdomain\USER"
    
  6. 서비스 주 구성원 이름을 할당합니다.

    setspn -a http/PUBLIC_FQDN USER
    

    PUBLIC_FQDN을 AD FS의 정규화된 공개 도메인 이름으로 바꿉니다.

  7. Active Directory에서 빈 컨테이너를 만듭니다. 나중에 AD FS를 설치할 때 이 컨테이너를 사용해야 합니다.

    New-ADObject `
      -Type Container `
      -Name "ADFS Data" `
      -Path $CloudOuPath
    
  8. AD FS 사용자에게 컨테이너에 대한 전체 제어 권한을 부여합니다.

    dsacls.exe "CN=ADFS Data,$CloudOuPath" /G $env:userdomain\USER:GA /I:T
    

AD FS 설치

VM 인스턴스에 AD FS를 설치할 수 있습니다.

  1. PowerShell 세션을 ADFS 사용자로 시작합니다.

    runas /u:$env:userdomain\USER powershell
    

    새로운 PowerShell 세션이 승격된 권한 없이 AD FS 사용자로 실행됩니다.

  2. 새 PowerShell 세션에서 두 번째 승격된 PowerShell 세션을 시작합니다.

    Start-Process PowerShell -Verb RunAs
    

    새로 승격된 PowerShell 세션에서 이 모든 후속 단계를 실행해야 합니다.

  3. RSA 2048비트 키를 사용하는 자체 서명 SSL 인증서를 만들어 컴퓨터 인증서 저장소에 저장합니다.

    $DnsName="PUBLIC_FQDN"
    $Certificate = New-SelfSignedCertificate `
      -Subject $DnsName `
      -KeyAlgorithm RSA `
      -KeyLength 2048 `
      -KeyExportPolicy NonExportable `
      -KeyUsage DigitalSignature, KeyEncipherment `
      -Provider 'Microsoft Platform Crypto Provider' `
      -NotAfter (Get-Date).AddDays(365) `
      -Type SSLServerAuthentication `
      -CertStoreLocation 'Cert:\LocalMachine\My' `
      -DnsName $DnsName
    

    PUBLIC_FQDN을 AD FS의 정규화된 공개 도메인 이름으로 바꿉니다.

  4. AD FS가 토큰 서명 인증서로 사용하는 다른 RSA 2048비트 인증서를 만듭니다.

    $SigningCertificate = New-SelfSignedCertificate `
      -Subject "ADFS Signing" `
      -KeyAlgorithm RSA `
      -KeyLength 2048 `
      -KeyExportPolicy NonExportable `
      -KeyUsage DigitalSignature, KeyEncipherment `
      -Provider 'Microsoft RSA SChannel Cryptographic Provider' `
      -NotAfter (Get-Date).AddDays(365) `
      -DnsName $DnsName `
      -CertStoreLocation 'Cert:\LocalMachine\My'
    
  5. 분산 키 관리자(DKM) 컨테이너를 만듭니다.

    $CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName
    $DkmContainer = New-ADObject `
      -Name ((New-Guid).Guid) `
      -Type Container `
      -Path "CN=ADFS Data,$CloudOuPath" `
      -PassThru
    
  6. 이전에 설정한 AD FS 사용자의 사용자 인증 정보를 다시 입력합니다.

    $AdfsCredential = Get-Credential -UserName "$env:userdomain\USER" -Message 'PASSWORD'
    
  7. 이전에 만든 인증서 및 DKM 컨테이너를 사용하여 AD FS를 설치합니다.

    Install-ADFSFarm `
      -CertificateThumbprint $Certificate.Thumbprint `
      -SigningCertificateThumbprint $SigningCertificate.Thumbprint `
      -DecryptionCertificateThumbprint $SigningCertificate.Thumbprint `
      -FederationServiceName $DnsName `
      -ServiceAccountCredential $AdfsCredential `
      -OverwriteConfiguration `
      -AdminConfiguration @{"DKMContainerDn"=$DkmContainer.DistinguishedName}
    

    이 명령어는 다음 경고 메시지를 표시할 수 있습니다.

    WARNING: A machine restart is required to complete ADFS service configuration. For more information, see:
    https://go.microsoft.com/fwlink/?LinkId=798725
    
    WARNING: The SSL certificate subject alternative names do not support host name 'PUBLIC_FQDN'.
    Configuring certificate authentication binding on port '49443' and hostname 'PUBLIC_FQDN'.
    
    WARNING: An error occurred during an attempt to set the SPN for the specified service account. Set the SPN for the
    service account manually.  For more information about setting the SPN of the service account manually, see the AD FS
    Deployment Guide.  Error message: An error occurred during an attempt to set the SPN for the specified service account.
    You do not have sufficient privileges in the domain to set the SPN.
    
    WARNING: The SSL certificate does not contain all UPN suffix values that exist in the enterprise.  Users with UPN
    suffix values not represented in the certificate will not be able to Workplace-Join their devices.  For more
    information, see http://go.microsoft.com/fwlink/?LinkId=311954.
    

    이미 SPN을 설정했고 인증서 기반 인증을 사용하지 않으므로 이러한 경고는 무시해도 됩니다.

  8. 통합 Windows 인증(IWA)을 사용하여 AD FS에 인증하려는 경우 다음 명령어를 실행하여 토큰 바인딩을 사용 중지합니다.

    Set-ADFSProperties -ExtendedProtectionTokenCheck None
    Restart-Service -Name adfssrv
    

    부하 분산기 뒤에 AD FS를 배포하고 부하 분산기는 TLS 연결을 종료하므로 토큰 바인딩을 사용 중지해야 합니다.

이 단계에서 권한 관련 문제가 발생하면 Google Cloud 지원팀에 문의하세요.

TLS 구성

백엔드에 연결을 설정할 때 HTTPS 부하 분산기는 서버 이름 표시(SNI) 확장 프로그램을 사용하지 않습니다. SNI 없이 AD FS가 연결을 수락하도록 하려면 인증서 대체를 구성해야 합니다.

  1. PowerShell에서 AD FS의 SSL 서버 인증서 바인딩을 확인합니다.

    netsh http show sslcert hostnameport=PUBLIC_FQDN:443
    

    PUBLIC_FQDN을 AD FS의 정규화된 공개 도메인 이름으로 바꿉니다.

  2. 바인딩에 대체 인증서를 구성합니다.

    netsh http add sslcert ipport=0.0.0.0:443 certhash=CERTIFICATE_HASH "appid=APP_ID" "certstorename=MY"
    

    다음을 바꿉니다.

    • CERTIFICATE_HASH: 이전 명령어에 표시된 인증서 해시
    • APP_ID: 이전 명령어에 표시된 애플리케이션 ID(중괄호 포함)
  3. 컴퓨터를 다시 시작하여 설치를 완료합니다.

    Restart-Computer
    

    다시 시작이 완료될 때까지 1분 정도 기다립니다.

AD FS 테스트

AD FS 서비스가 배포되었지만 아직 HTTPS 부하 분산기를 사용하여 서비스에 액세스할 수 있는지 확인해야 합니다.

  1. Cloud Shell 세션으로 돌아갑니다.
  2. SSL 인증서가 ACTIVE 상태인지 확인합니다.

    gcloud compute ssl-certificates describe CERTIFICATE_NAME \
        --global \
        --format="get(managed.status)"
    

    인증서가 PROVISIONING 상태인 경우 AD FS에 대해 만든 DNS 레코드를 전파하는 데 추가 시간이 필요할 수 있습니다. 자세한 내용은 Google 관리형 인증서 문제 해결을 참조하세요.

  3. 로컬 컴퓨터에서 브라우저를 열고 다음 URL로 이동합니다.

    https://PUBLIC_FQDN/adfs/ls?wa=wsignout1.0
    

    PUBLIC_FQDN을 AD FS의 정규화된 공개 도메인 이름으로 바꿉니다.

    AD FS가 성공적으로 배포되었음을 나타내는 You have successfully signed out 메시지가 표시되는지 확인합니다.

통합 Windows 인증(IWA)을 사용하려는 경우 AD FS의 Kerberos 티켓을 받을 수 있는지 확인하세요.

  1. 원격 데스크톱을 사용하여 VM 인스턴스 또는 다른 도메인에 가입한 VM에 연결하고 도메인 사용자 인증 정보를 사용하여 로그인합니다.
  2. Start(시작) 버튼을 마우스 오른쪽 버튼으로 클릭하고(또는 Win+X 누름) Windows PowerShell을 클릭합니다.
  3. klist 명령어를 사용하여 AD FS에 대해 서비스 티켓을 요청합니다.

    klist get http/PUBLIC_FQDN
    

    출력에 AD FS 티켓이 포함되었는지 확인합니다.

    #1>     Client: USER @ DOMAIN
            Server: http/PUBLIC_FQDN @ DOMAIN
            KerbTicket Encryption Type: ...
    

AD FS를 사용할 수 있습니다. 서비스 사용 및 구성에 대한 자세한 내용은 AD FS 작업을 참조하세요.