マネージド Microsoft AD ドメインに AD FS をデプロイする

このガイドでは、Managed Service for Microsoft Active Directory ドメインに Windows Server 2019 用の Microsoft Active Directory フェデレーション サービス(AD FS)をデプロイする方法について説明します。

この環境を次の図に示します。

アーキテクチャ

ユーザーは、Google マネージド証明書を使用して、SSL 接続を終了する HTTPS ロードバランサと通信します。ロードバランサは、Windows Server 2019 用の Microsoft AD FS を実行し、マネージド Microsoft AD ドメインに参加している VM インスタンスに接続を転送します。ロードバランサと VM インスタンス間の通信は、自己署名 SSL 証明書を使用して保護されます。

デプロイでは単一の AD FS インスタンスと Windows 内部データベースが使用されるため、小規模な環境に適しています。信頼性またはセキュリティの需要が高い環境の場合は、複数の 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. [スタート] ボタンを右クリックするか 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 を使用する必要があります。

サービス ユーザーを作成する

AD FS サービス用のユーザー アカウントを Active Directory に作成する必要があります。

  1. リモート デスクトップを使用して VM インスタンスに接続し、委任された管理者の認証情報でログインします。
  2. [スタート] ボタンを右クリックするか 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 をインストールする

AD FS を VM インスタンスにインストールできます。

  1. ADFS ユーザーとして PowerShell セッションを開始します。

    runas /u:$env:userdomain\USER powershell
    

    新しい PowerShell セッションは、AD FS ユーザーとして実行されますが、昇格された権限はありません。

  2. 新しい PowerShell セッションで、2 番目の、昇格した PowerShell セッションを開始します。

    Start-Process PowerShell -Verb RunAs
    

    新しい昇格した PowerShell セッションで、後続のすべての手順を実行する必要があります。

  3. 2,048 ビットの RSA 鍵を使用する自己署名 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 がトークン署名証明書として使用する別の 2,048 ビットの RSA 証明書を作成します。

    $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 ロードバランサは Server Name Indication(SNI)拡張機能を使用しません。AD FS が SNI なしで接続を受け入れるには、証明書の代替を構成する必要があります。

  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. [スタート] ボタンを右クリックするか 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 オペレーションをご覧ください。