本指南說明如何在 Managed Service for Microsoft Active Directory 網域中,部署 Microsoft Active Directory Federation Services (AD FS) for Windows Server 2019。
下圖說明瞭部署作業:
使用者會與HTTPS 負載平衡器通訊,該負載平衡器會使用 Google 代管的憑證終止 SSL 連線。負載平衡器會將連線轉送至執行 Windows Server 2019 的 Microsoft AD FS 且已加入 Managed Microsoft AD 網域的 VM 執行個體。使用自行簽署的 SSL 憑證,確保負載平衡器與 VM 執行個體之間的通訊安全無虞。
此部署作業會使用單一 AD FS 例項和 Windows 內部資料庫,因此適合小型環境。如果環境需要更高的可靠性或安全性,請考慮在群組設定中部署多個 AD FS 執行個體,並部署聯合代理伺服器。
事前準備
- 建立代管的 Microsoft AD 網域。
- 擷取 Managed Microsoft AD 網域的委派管理員帳戶憑證。根據預設,委派的管理員帳戶名稱為
setupadmin
。 - 建立公開 DNS 區域。您可以使用這個區域為 AD FS 建立公開 DNS 名稱。
- 請務必熟悉部署 AD FS 的規定。
準備專案和網路
您需要為 AD FS 部署作業準備 Google Cloud 專案和虛擬私有雲網路。
建立 VM 執行個體
建立服務帳戶和 VM 執行個體,以便執行 AD FS:
在 Google Cloud 主控台中,開啟 Cloud Shell。
設定預設的專案 ID:
gcloud config set project PROJECT_ID
將
PROJECT_ID
替換為您的 Google Cloud 專案 ID。設定預設地區和區域:
gcloud config set compute/region REGION gcloud config set compute/zone ZONE
更改下列內容:
REGION
:要部署的區域 ID。ZONE
:您要部署的區域 ID。
建立服務帳戶:
gcloud iam service-accounts create SA_NAME
將
SA_NAME
改為服務帳戶名稱。建立執行 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 網域,請完成下列步驟:
查看 VM 的序列埠輸出內容,監控 VM 的初始化程序:
gcloud compute instances tail-serial-port-output VM_NAME
等待約 3 分鐘,直到您看到輸出
Instance setup finished
,然後按下 Ctrl + C。此時,VM 執行個體已可供使用。為 VM 執行個體建立使用者名稱和密碼。
使用遠端桌面連線至 VM,然後使用上一步中建立的使用者名稱和密碼登入。
在「開始」按鈕上按一下滑鼠右鍵 (或按下 Win + X 鍵),然後按一下「Windows PowerShell (系統管理員)」。
按一下「是」,確認權限提升提示。
將電腦加入 Active Directory 網域並重新啟動:
Add-Computer -Domain DOMAIN -Restart
將
DOMAIN
替換為 Active Directory 網域的 DNS 名稱。等待約 1 分鐘,讓重新啟動程序完成。
建立負載平衡器
您需要建立負載平衡器,讓使用者透過單一虛擬 IP 位址存取 AD FS。
如要將執行 AD FS 的 VM 例項與負載平衡器建立關聯,請先建立非代管執行個體群組,然後將此執行個體群組指派給負載平衡器:
- 返回現有的 Cloud Shell 工作階段。
建立非代管執行個體群組:
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
替換為您要建立的群組名稱。將現有的 VM 執行個體新增至執行個體群組:
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances VM_NAME
建立可探測 AD FS HTTPS 通訊埠的健康狀態檢查:
gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port 443
將
HEALTH_CHECK_NAME
替換為健康狀態檢查的名稱。建立負載平衡器後端服務,來使用 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
替換為後端服務的名稱。為負載平衡器保留靜態外部 IP 位址:
gcloud compute addresses create ADDRESS_NAME --global
將
ADDRESS_NAME
替換為您要與此地址建立關聯的名稱。為負載平衡器建立代管安全資料傳輸層 (SSL) 憑證:
gcloud compute ssl-certificates create CERTIFICATE_NAME \ --domains PUBLIC_FQDN \ --global
更改下列內容:
CERTIFICATE_NAME
:代管 SSL 憑證的名稱。PUBLIC_FQDN
:您要用於 AD FS 的公開完整網域名稱 (FQDN)。例如:login.example.com
。
建立負載平衡器前端,使用外部 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
:負載平衡器的網址對應項目名稱。PROXY_NAME
:負載平衡器的目標 Proxy 名稱。FORWARDING_RULE_NAME
:負載平衡器的轉送規則名稱。
建立防火牆規則,允許從負載平衡器傳入執行 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
:虛擬私有雲網路的名稱。SA_NAME
:服務帳戶名稱。
來源範圍是內部負載平衡器的 IP 範圍。詳情請參閱「設定防火牆規則」。
查詢負載平衡器的 IP 位址:
gcloud compute addresses describe ADDRESS_NAME \ --global \ --format=value\(address\)
在公開 DNS 區域中建立 DNS
A
記錄,指向負載平衡器的 IP 位址。DNS 記錄的完整名稱必須與您用於 SSL 憑證的名稱相符。
部署 AD FS
您需要在 VM 執行個體上部署 AD FS 伺服器角色。由於您在受管理的 Microsoft AD 網域中沒有 Domain Admins
權限,因此無法使用「伺服器管理員」執行安裝作業,必須改用 PowerShell。
建立服務使用者
您必須在 Active Directory 中為 AD FS 服務建立使用者帳戶:
- 使用遠端桌面連線至 VM 執行個體,然後使用委派的管理員憑證登入。
- 在「開始」按鈕上按一下滑鼠右鍵 (或按下 Win + X 鍵),然後按一下「Windows PowerShell (系統管理員)」。
為 AD FS 服務帳戶設定隨機密碼:
$AdfsCredential = Get-Credential -UserName USER -Message 'PASSWORD'
更改下列內容:
USER
:Active Directory 使用者名稱。PASSWORD
:Active Directory 使用者的密碼。
建立 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
將使用者新增至本機管理員群組:
Add-LocalGroupMember ` -Group "Administrators" ` -Member "$env:userdomain\USER"
指派服務主體名稱:
setspn -a http/PUBLIC_FQDN USER
將
PUBLIC_FQDN
替換為 AD FS 的公開完整網域名稱。在 Active Directory 中建立空白容器。您稍後安裝 AD FS 時需要使用這個容器:
New-ADObject ` -Type Container ` -Name "ADFS Data" ` -Path $CloudOuPath
授予 AD FS 使用者容器的完全控制權:
dsacls.exe "CN=ADFS Data,$CloudOuPath" /G $env:userdomain\USER:GA /I:T
安裝 AD FS
您可以在 VM 執行個體上安裝 AD FS:
以 ADFS 使用者身分啟動 PowerShell 工作階段:
runas /u:$env:userdomain\USER powershell
新的 PowerShell 工作階段會以 AD FS 使用者身分執行,但沒有提升的權限。
在新 PowerShell 工作階段中,啟動第二個已提升權限的 PowerShell 工作階段:
Start-Process PowerShell -Verb RunAs
您必須在這個新的已提升權限 PowerShell 工作階段中執行所有後續步驟。
建立使用 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 的公開完整網域名稱。建立另一個 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'
建立分散式金鑰管理工具 (DKM) 容器:
$CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName $DkmContainer = New-ADObject ` -Name ((New-Guid).Guid) ` -Type Container ` -Path "CN=ADFS Data,$CloudOuPath" ` -PassThru
重新輸入先前設定的 AD FS 使用者憑證:
$AdfsCredential = Get-Credential -UserName "$env:userdomain\USER" -Message 'PASSWORD'
使用先前建立的憑證和 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,且未使用憑證式驗證,因此可以忽略這些警告。
如果您打算使用整合式 Windows 驗證 (IWA) 來驗證 AD FS,請執行下列指令來停用權杖繫結:
Set-ADFSProperties -ExtendedProtectionTokenCheck None Restart-Service -Name adfssrv
您必須停用權杖繫結,因為您會在負載平衡器後方部署 AD FS,而負載平衡器會終止 TLS 連線。
如果在執行這些步驟時遇到任何權限相關問題,請與 Google Cloud 支援團隊聯絡。
設定 TLS
建立連線至後端時,HTTPS 負載平衡器不會使用伺服器名稱指示 (SNI) 擴充功能。如要讓 AD FS 接受不含 SNI 的連線,您必須設定憑證備用方案:
在 PowerShell 中,查看 AD FS 的 SSL 伺服器憑證繫結:
netsh http show sslcert hostnameport=PUBLIC_FQDN:443
將
PUBLIC_FQDN
替換為 AD FS 的公開完整網域名稱。為繫結設定備用憑證:
netsh http add sslcert ipport=0.0.0.0:443 certhash=CERTIFICATE_HASH "appid=APP_ID" "certstorename=MY"
更改下列內容:
CERTIFICATE_HASH
:上一個指令中顯示的憑證雜湊。APP_ID
:上一個指令中顯示的應用程式 ID,包括大括號。
重新啟動電腦即可完成安裝程序:
Restart-Computer
等待約 1 分鐘,讓重新啟動程序完成。
測試 AD FS
已部署 AD FS 服務,但您仍必須驗證是否可以使用 HTTPS 負載平衡器存取服務:
- 返回 Cloud Shell 工作階段。
確認 SSL 憑證處於
ACTIVE
狀態:gcloud compute ssl-certificates describe CERTIFICATE_NAME \ --global \ --format="get(managed.status)"
如果憑證處於
PROVISIONING
狀態,您為 AD FS 建立的 DNS 記錄可能需要額外時間才能完成散發。詳情請參閱「排解 Google 管理憑證問題」。在本機電腦上開啟瀏覽器,然後前往下列網址:
https://PUBLIC_FQDN/adfs/ls?wa=wsignout1.0
將
PUBLIC_FQDN
替換為 AD FS 的公開完整網域名稱確認畫面上顯示
You have successfully signed out
訊息,表示已成功部署 AD FS。
如果您打算使用整合式 Windows 驗證 (IWA),請確認您可以取得 AD FS 的 Kerberos 票證:
- 使用遠端桌面連線至 VM 執行個體或其他已加入網域的 VM,然後使用網域憑證登入。
- 在「開始」按鈕上按一下滑鼠右鍵 (或按下 Win + X 鍵),然後按一下「Windows PowerShell」。
使用
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 作業」。