Active Directory フェデレーション サービスのデプロイ

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

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

アーキテクチャ

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

デプロイでは、単一の AD FS インスタンスと Windows 内部データベースが使用されるため、小規模環境に適しています。信頼性またはセキュリティの需要が増加している環境の場合は、複数の AD FS インスタンスをファーム構成でデプロイし、連携プロキシをデプロイすることを検討してください。

始める前に

このガイドを完了するには、次の準備が必要です。

AD FS のデプロイの要件についてよくご確認ください。

プロジェクトとネットワークの準備

ここでは、AD FS のデプロイ用に Google Cloud プロジェクトと VPC を準備します。

VM インスタンスを作成する

AD FS を実行するサービス アカウントと VM インスタンスを作成します。

  1. Cloud ConsoleCloud Shell を開きます。

    Cloud Shell をアクティブにする

  2. 次の変数を初期化します。

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    ここで

    • VPC_NAME は VPC の名前です。
    • SUBNET_NAME は、AD FS をデプロイするサブネット名です。
  3. デフォルトのプロジェクト ID を設定します。

    gcloud config set project PROJECT_ID
    

    PROJECT_ID は、Google Cloud プロジェクトの ID に置き換えます。

  4. デフォルトのリージョンとゾーンを設定します。

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

    ここで

    • REGION は、デプロイするリージョンの ID です。
    • ZONE は、デプロイするゾーンの ID です。
  5. サービス アカウントを作成します。

    gcloud iam service-accounts create ad-federation-services
    
  6. Windows Server 2019 を実行し、特別なスクリプトを使用する VM インスタンスを作成して、自動的に AD FS サーバーのロールをインストールします。

    gcloud compute instances create adfs-1 \
      --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 ad-federation-services@$(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"
    
    1. シリアルポートの出力を表示して、VM の初期化プロセスをモニタリングします。

      gcloud compute instances tail-serial-port-output adfs-1
      

      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 adfs &&
    gcloud compute instance-groups set-named-ports adfs --named-ports=http:443
    
  3. 既存の VM インスタンスをインスタンス グループに追加します。

    gcloud compute instance-groups unmanaged add-instances adfs --instances adfs-1
    
  4. AD FS の HTTPS ポートを調査するヘルスチェックを作成します。

    gcloud compute health-checks create tcp adfs-health-check --port 443
    
  5. HTTPS ヘルスチェックと前の手順で作成したインスタンス グループを使用するロードバランサ バックエンド サービスを作成します。

    gcloud compute backend-services create adfs-backend \
      --health-checks adfs-health-check \
      --port-name http \
      --protocol HTTPS \
      --global && \
    gcloud compute backend-services add-backend adfs-backend \
      --instance-group adfs \
      --global \
      --instance-group-zone $(gcloud config get-value compute/zone)
    
  6. ロードバランサ用の静的外部 IP アドレスを予約します。

    gcloud compute addresses create adfs-external --global
    
  7. ロードバランサ用のマネージド SSL 証明書を作成します。

    gcloud compute ssl-certificates create adfs-external \
      --domains DNS_DOMAIN \
      --global
    

    ここで、DNS_DOMAIN は AD FS 用に使用する外部 DNS 名です。このドメイン名は、Active Directory で使用されるドメイン名とは異なる場合があります。

  8. 外部 IP アドレスを使用して、バックエンド サービスにトラフィックを転送するロードバランサ フロントエンドを作成します。

    gcloud compute url-maps create adfs \
      --default-service adfs-backend && \
    gcloud compute target-https-proxies create adfs-proxy \
      --ssl-certificates adfs-external \
      --url-map adfs && \
    gcloud compute forwarding-rules create adfs \
      --global \
      --address adfs-external \
      --target-https-proxy adfs-proxy \
      --ports 443
    
  9. ロードバランサから AD FS を実行する VM インスタンスへのトラフィックを許可するファイアウォール ルールを作成します。

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

    ソース範囲は、内部ロードバランサの IP 範囲です。詳細については、ファイアウォール ルールを構成するをご覧ください。

  10. ロードバランサの IP アドレスを調べます。

    gcloud compute addresses describe adfs-external \
       --global \
       --format=value\(address\)
    
  11. 一般公開 DNS ゾーンに、ロードバランサの IP アドレスを指す DNS A レコードを作成します。DNS レコードの完全修飾名は、SSL 証明書で使用した名前と一致している必要があります。

AD FS のデプロイ

ここで、AD FS サーバーのロールを VM インスタンス adfs-1 にデプロイします。マネージド Microsoft AD ドメインにドメイン管理者権限がないため、サーバー マネージャーを使用してインストールを行うことはできず、代わりに PowerShell を使用する必要があります。

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

ここで、Active Directory で AD FS サービス用のユーザー アカウントを作成します。

  1. リモート デスクトップを使用して VM インスタンス adfs-1 に接続し、委任された管理者認証情報を使用してログインします。
  2. [スタート] ボタンを右クリックするか Win + X を押して、[Windows PowerShell(管理者)] をクリックします。
  3. AD FS サービス アカウント用のパスワードを設定します。

    $AdfsCredential = Get-Credential -UserName adfssvc -Message 'Enter password'
    
  4. Active Directory ユーザー adfssvc を作成します。

    $CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName
    $AdfsUser = New-ADuser `
      -Name adfssvc `
      -DisplayName 'AD FS service account' `
      -AccountPassword $AdfsCredential.Password `
      -Path "$CloudOuPath" `
      -PasswordNeverExpires $True `
      -PassThru | Enable-ADAccount -PassThru
    
  5. ユーザーをローカル管理者グループに追加します。

    Add-LocalGroupMember `
     -Group "Administrators" `
     -Member "$env:userdomain\adfssvc"
    
  6. サービス プリンシパル名を割り当てます。

    setspn -a http/$env:userdomain adfssvc
    
  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\adfssvc:GA /I:T
    

AD FS をインストールする

ここで、AD FS を adfs-1 にインストールします。

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

    runas /u:$env:userdomain\adfssvc powershell
    

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

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

    Start-Process PowerShell -Verb RunAs
    

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

  3. RSA 2048 ビットの鍵を使用する自己署名 SSL 証明書を作成し、コンピュータの証明書ストアに保存します。

    $DnsName="DNS_DOMAIN"
    $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
    

    ここで、DNS_DOMAIN は AD FS 用に使用する外部 DNS 名です。このドメイン名は、Active Directory で使用されるドメイン名とは異なる場合があります。

  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\adfssvc" -Message 'Enter 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}
    

TLS の構成

バックエンドへの接続を確立するときに、HTTPS ロードバランサはサーバー名表示(SNI)拡張機能を使用しません。AD FS が SNI なしで接続を受け入れるには、証明書の代替を構成する必要があります。

  1. PowerShell で、AD FS 用の SSL サーバー証明書バインディングを表示します。

    netsh http show sslcert hostnameport=DNS_DOMAIN:443
    

    ここで、DNS_DOMAIN は AD FS の外部 DNS 名です。

  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 adfs-external \
        --global \
        --format="get(managed.status)"
    

    証明書が PROVISIONING 状態の場合は、AD FS 用に作成した DNS レコードが反映されるまでにさらに時間がかかる場合があります。詳細については、Google マネージド証明書のトラブルシューティングをご覧ください。

  3. ローカル PC でブラウザを開き、https://DNS_DOMAIN/adfs/ls?wa=wsignout1.0 に移動します。ここで、DNS_DOMAIN は AD FS 用に構成した外部 DNS 名です。

    AD FS が正常にデプロイされたことを示す「You have successfully signed out」というメッセージが表示されることを確認します。

これで、AD FS を使用できるようになりました。サービスの使用と構成の詳細については、AD FS オペレーションをご覧ください。