本文說明如何設定 Active Directory 和 Compute Engine,讓 Windows 虛擬機器 (VM) 執行個體自動加入 Active Directory 網域。
將 Windows 虛擬機器加入 Active Directory 的程序自動化,有助於簡化 Windows 伺服器的佈建程序。您也可以透過這種方式,在使用 Active Directory 管理存取權和設定的同時,運用自動調度資源的優點。
本文件適用於系統管理員,並假設您熟悉 Active Directory 和 Google Cloud 網路。
您可以按照本文件中的程序建立設定,以便在 Google Cloud中使用 Windows 伺服器執行其他工作。舉例來說,完成這個程序後,您就可以在 Windows 容器中部署使用 Windows 驗證的 ASP.NET 應用程式。
如果您使用受管理的 Microsoft AD,且不需要自動清除過時的電腦帳戶,請考慮使用自動加入網域功能加入 Windows VM。詳情請參閱「自動將 Windows VM 加入網域」。
目標
- 部署 Cloud Run 應用程式,讓所選專案的 VM 執行個體自動加入 Active Directory 網域。
- 建立 Cloud Scheduler 工作,定期掃描 Active Directory 網域,找出並移除過時的電腦帳戶。
- 建立自動調度資源的代管執行個體群組 (MIG),以測試加入網域的 VM 執行個體設定。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
本文中的操作說明旨在將您的資源使用量保持在 Google Cloud的一律免費方案限制之內。 您可以使用 Pricing Calculator 根據預測用量產生預估費用。
完成這份文件後,您可以刪除已建立的資源,避免繼續產生費用。詳情請參閱「清除所用資源」。
事前準備
本文假設您已在 Google Cloud 上部署 Active Directory,方法是使用 Managed Service for Microsoft Active Directory (Managed Microsoft AD) 或在 Google Cloud上部署自管理網域控制站。
如要完成程序,請確認你有以下項目:
- 對 Active Directory 網域具備管理員存取權,包括建立使用者、群組和機構單位 (OU) 的權限。
- 在部署 Active Directory 網域控制器的虛擬私有雲網路中,找出未使用的 /28 CIDR IP 範圍。您可以使用這個 IP 範圍設定無伺服器虛擬私有雲存取。
- 用來部署 Windows 執行個體的子網路。您必須將子網路設為使用私人 Google 存取權。
如果您使用自管網域控制器,還需要以下項目:
- 私人 DNS 轉送區域,可將 DNS 查詢轉送至 Active Directory 網域控制器。
實作這種做法
在內部部署環境中,您可以使用答案檔案 (unattend.xml
) 和JoinDomain
自訂設定,自動將新電腦加入網域。雖然您可以在 Google Cloud中使用相同的程序,但這種做法有一些限制:
- 如要使用自訂的
unattend.xml
檔案,您必須維護自訂的 Compute Engine 映像檔。使用 Windows 更新功能讓自訂映像檔保持最新狀態,需要持續維護或設定自動化功能。除非您基於其他原因而需要維護自訂圖片,否則這項額外作業可能不太合理。 - 使用
JoinDomain
自訂功能可將圖片與單一 Active Directory 網域建立關聯,因為網域名稱必須在unattend.xml
中指定。如果您維護多個 Active Directory 網域或樹系 (例如個別的測試和實際執行環境),可能需要為每個網域維護多個自訂映像檔。 - 將 Windows 電腦加入網域時,使用者憑證必須具備在目錄中建立電腦物件的權限。如果您在
unattend.xml
中使用JoinDomain
自訂功能,則必須在unattend.xml
中以純文字形式嵌入這些憑證。這些嵌入的憑證可能會讓圖片成為攻擊者的潛在目標。雖然您可以設定適當的 Identity and Access Management (IAM) 權限來控管映像檔的存取權,但管理自訂映像檔的存取權會增加不必要的複雜度。
本文件的方法不使用答案檔案,因此不需要特別準備圖片。請改為在建立 VM 執行個體時使用下列 sysprep 專用指令碼:
iex((New-Object System.Net.WebClient).DownloadString('https://DOMAIN'))
這個 sysprep 專用指令碼會啟動下圖所示的程序。
這個程序的運作方式如下:
- 建立 VM 執行個體後,Windows 會首次啟動。在專屬設定傳遞的過程中,Windows 會執行 sysprep 專屬指令碼片段。專用指令碼會叫用
register-computer
Cloud Run 應用程式,並下載用於控管網域加入程序的 PowerShell 指令碼。 - Windows 會叫用下載的 PowerShell 指令碼。
- PowerShell 指令碼會呼叫中繼資料伺服器,取得可安全地識別 VM 執行個體的 ID 權杖。
- 指令碼會再次呼叫
register-computer
應用程式,傳遞 ID 權杖來驗證自身。 - 應用程式會驗證 ID 權杖,並擷取 VM 執行個體的名稱、區域和Google Cloud 專案 ID。
- 應用程式會驗證 Active Directory 網域是否已設定為允許指定專案的 VM 執行個體加入網域。為了完成這項驗證,應用程式會尋找並連線至 Active Directory 網域控制器,檢查機構單位 (OU) 的名稱是否與 ID 權杖中的 Google Cloud 專案 ID 相符。如果找到符合的 OU,則專案的 VM 執行個體會獲得授權,可加入指定 OU 中的 Active Directory 網域。
- 應用程式會驗證 Google Cloud 專案是否已設定為允許 VM 執行個體加入 Active Directory。為了完成這項驗證,應用程式會檢查是否能使用 Compute Engine API 存取 VM 執行個體。
- 如果所有檢查都通過,應用程式就會在 Active Directory 中預先建立電腦帳戶。應用程式會將 VM 執行個體的名稱、區域和 ID 儲存為電腦帳戶物件中的屬性,以便與 VM 執行個體建立關聯。
- 接著,應用程式會使用 Kerberos 密碼設定通訊協定,為電腦帳戶指派隨機密碼。
- 電腦名稱和密碼會透過 TLS 安全管道傳回至 Windows 執行個體。
- 使用預先設定的電腦帳戶,PowerShell 指令碼會將電腦加入網域。
- 專屬設定通過後,機器會自行重新啟動。
本程序的其餘部分會逐步引導您完成自動網域加入功能的設定步驟。
準備 Active Directory 網域
首先,請準備 Active Directory 網域。如要完成這個步驟,您需要具備 Active Directory 網域的管理員存取權。
選用:限制可加入網域的電腦
您可能會想限制哪些使用者可以將電腦加入網域。根據預設,預設網域控制器政策的群組政策物件 (GPO) 設定會將 Add workstations to domain
使用者權限授予所有已驗證的使用者。任何擁有該使用者權限的使用者,都可以將電腦加入網域。由於您會自動將電腦加入 Active Directory 網域,因此全面授予這類存取權會造成不必要的安全風險。
如要限制可將電腦加入 Active Directory 網域的使用者,請變更預設網域控制站政策 GPO 的預設設定:
- 使用 RDP 用戶端登入具有 Active Directory 網域管理員存取權的電腦。
- 開啟群組原則管理主控台 (GPMC)。
- 依序前往「森林」 >「網域」 >「domain-name」 >「群組政策物件」,其中 domain-name 是 Active Directory 網域的名稱。
- 在「Default Domain Controller Policy」上按一下滑鼠右鍵,然後點選「Edit」。
- 在群組原則管理編輯器控制台中,依序前往「Computer Configuration」 >「Policies」 >「Windows Settings」 >「Security Settings」 >「Local Policies」 >「User Rights Assignment」。
- 按兩下「將工作站加入網域」。
- 在「資源」中,從清單中移除「已驗證的使用者」。
- 如要讓管理員手動加入網域 (選用),請按一下「新增使用者或群組」,然後將管理群組新增至清單。
- 按一下 [確定]。
您現在可以關閉群組原則管理編輯器主控台和 GPMC。
初始化目錄結構
您現在可以建立一個 OU,做為所有專案專屬 OU 的容器:
- 使用 RDP 用戶端登入具有 Active Directory 網域管理員存取權的電腦。
- 開啟已啟用進階權限的 PowerShell 工作階段。
建立新的機構單位:
$ParentOrgUnitPath = (Get-ADDomain).ComputersContainer $ProjectsOrgUnitPath = New-ADOrganizationalUnit ` -Name 'Projects' ` -Path $ParentOrgUnitPath ` -PassThru
建立 Active Directory 使用者帳戶
如要存取 Active Directory 和預先登錄的電腦帳戶,register-computer
應用程式需要 Active Directory 使用者帳戶:
建立名為
register-computer
的 Active Directory 使用者帳戶,並指派隨機密碼,然後將其放入Projects
OU:# Generate a random password $Password = [Guid]::NewGuid().ToString()+"-"+[Guid]::NewGuid().ToString() # Create user $UpnSuffix = (Get-ADDomain).DNSRoot $RegisterComputerUser = New-ADUser ` -Name "register-computer Cloud Run app" ` -GivenName "Register" ` -Surname "Computer" ` -Path $ProjectsOrgUnitPath ` -SamAccountName "register-computer" ` -UserPrincipalName "register-computer@$UpnSuffix" ` -AccountPassword (ConvertTo-SecureString "$Password" -AsPlainText -Force) ` -PasswordNeverExpires $True ` -Enabled $True ` -PassThru
授予
register-computer
帳戶管理Projects
OU 和子 OU 中電腦帳戶和群組所需的最低權限:$AcesForContainerAndDescendents = @( "CCDC;Computer", # Create/delete computers "CCDC;Group" # Create/delete users ) $AcesForDescendents = @( "LC;;Computer" , # List child objects "RC;;Computer" , # Read security information "WD;;Computer" , # Change security information "WP;;Computer" , # Write properties "RP;;Computer" , # Read properties "CA;Reset Password;Computer", # ... "CA;Change Password;Computer", # ... "WS;Validated write to service principal name;Computer", "WS;Validated write to DNS host name;Computer", "LC;;Group", # List child objects "RC;;Group", # Read security information "WD;;Group", # Change security information "WP;;Group", # Write properties "RP;;Group" # Read properties ) $AcesForContainerAndDescendents | % { dsacls.exe $ProjectsOrgUnitPath /G "${RegisterComputerUser}:${_}" /I:T | Out-Null } $AcesForDescendents | % { dsacls.exe $ProjectsOrgUnitPath /G "${RegisterComputerUser}:${_}" /I:S | Out-Null }
這個指令可能需要幾分鐘才能完成。
授予
register-computer
帳戶刪除 DNS 記錄的權限:代管的 Microsoft AD
Add-ADGroupMember -Identity "Cloud Service DNS Administrators" -Members ${RegisterComputerUser}
自行管理的網域
$DnsPartition=(Get-ADDomain).SubordinateReferences | Where-Object {$_.StartsWith('DC=DomainDnsZones')} $DnsContainer="DC=$((Get-ADDomain).DNSRoot),CN=MicrosoftDNS,$DnsPartition" dsacls $DnsContainer /G "${RegisterComputerUser}:SD" /I:S
顯示
Projects
OU 路徑和register-computer
Active Directory 使用者帳戶產生的密碼。請記下這些值,因為後續步驟會用到。Write-Host "Password: $Password" Write-Host "Projects OU: $ProjectsOrgUnitPath"
準備 Google Cloud 專案
您現在可以設定網域專案:
- 如果您使用 Managed Microsoft AD,您的網域專案就是您部署 Managed Microsoft AD 的專案。
- 如果您使用自管的 Active Directory,您的網域專案就是執行 Active Directory 網域控制器的專案。如為共用虛擬私有雲,則此專案必須與 VPC 主專案相同。
您可以使用這個網域專案執行下列操作:
- 建立包含
register-computer
Active Directory 使用者帳戶密碼的 Secret Manager 密鑰。 - 部署
register-computer
應用程式。 - 設定 Cloud Scheduler,以便觸發清理過時電腦帳戶的作業。
建議您根據最低權限原則授予網域專案存取權。
建立 Secret Manager 密鑰
在 Google Cloud 控制台中,開啟 Cloud Shell。
啟動 PowerShell:
pwsh
初始化下列變數,將
domain-project-id
替換為您的網域專案 ID:$DomainProjectId = "
domain-project-id
"將網域專案設為預設專案:
& gcloud config set project $DomainProjectId
啟用 Secret Manager API:
& gcloud services enable secretmanager.googleapis.com
輸入
register-computer
Active Directory 使用者帳戶的密碼,並儲存在 Secret Manager 密鑰中:$RegisterComputerCredential = (Get-Credential -Credential 'register-computer') $TempFile = New-TemporaryFile Set-Content $TempFile $($RegisterComputerCredential.GetNetworkCredential().Password) -NoNewLine & gcloud secrets create ad-password --data-file $TempFile Remove-Item $TempFile
授予 Kerberos 和 LDAP 的存取權
為了管理網域加入作業,register-computer
應用程式會使用下列通訊協定存取網域控制器:
- LDAP (TCP/389) 或 LDAPS (TCP/636)
- Kerberos (UDP/88、TCP/88)
Kerberos 密碼變更 (UDP/464、TCP/464)
代管的 Microsoft AD
您不需要設定任何防火牆規則。
自行管理的網域
建立防火牆規則,允許存取網域控制站。
您可以根據已指派給網域控制器的網路標記套用規則,也可以使用服務帳戶套用規則。
依聯播網代碼劃分
& gcloud compute firewall-rules create allow-adkrb-from-serverless-to-dc ` --direction INGRESS ` --action allow ` --rules udp:88,tcp:88,tcp:389,tcp:636,udp:464,tcp:464 ` --source-ranges $ServerlessIpRange ` --target-tags dc-tag ` --network $VpcName ` --project vpc-project-id ` --priority 10000
更改下列內容:
dc-tag
:指派給網域控制器 VM 的網路標記。vpc-project-id
:虛擬私有雲端網路定義所在專案的 ID。如果您使用共用虛擬私有雲,請使用 VPC 主專案;否則,請使用網域專案的 ID。
依服務帳戶
& gcloud compute firewall-rules create allow-adkrb-from-serverless-to-dc ` --direction INGRESS ` --action allow ` --rules udp:88,tcp:88,tcp:389,tcp:636,udp:464,tcp:464 ` --source-ranges $ServerlessIpRange ` --target-service-accounts dc-sa ` --network $VpcName ` --project vpc-project-id ` --priority 10000
更改下列內容:
dc-sa
:網域控制站 VM 使用的服務帳戶電子郵件地址。vpc-project-id
:VPC 定義所在專案的 ID。如果您使用共用虛擬私有雲,請使用 VPC 主專案;否則,請使用網域專案的 ID。
部署 Cloud Run 應用程式
您現在可以設定 Cloud Build,將 register-computer
應用程式部署至 Cloud Run:
在 Cloud Shell 中,複製 GitHub 存放區。
& git clone https://github.com/GoogleCloudPlatform/gce-automated-ad-join.git cd gce-automated-ad-join/ad-joining
初始化下列變數:
$ServerlessRegion = "
serverless-region
" $VpcName = "vpc-name
" $VpcSubnet = "subnet-name
" $AdDomain = "dns-domain-name
" $AdNetbiosDomain = "netbios-domain-name
" $ProjectsOrgUnitPath = "projects-ou-distinguished-name
"更改下列內容:
serverless-region
:部署register-computer
應用程式的區域。該區域不必與您計畫部署 VM 執行個體的區域相同。vpc-name
:包含 Active Directory 網域控制站的 VPC 網路名稱。subnet-name
:用於直接虛擬私有雲存取的vpc-name
子網路。子網路必須與serverless-region
位於相同區域。dns-domain-name
:Active Directory 網域的 DNS 網域名稱。netbios-domain-name
:Active Directory 網域的 NetBIOS 名稱。projects-ou-distinguished-name
:Projects
OU 的專屬名稱。
啟用 Cloud Run 和 Cloud Build API:
& gcloud services enable run.googleapis.com cloudbuild.googleapis.com
為 Cloud Run 應用程式建立服務帳戶
register-computer-app
:& gcloud iam service-accounts create register-computer-app ` --display-name="register computer Cloud Run app"
建立服務帳戶
build-service
來執行 Cloud Build 觸發條件:& gcloud iam service-accounts create build-service ` --display-name="Cloud Build build agent"
允許 Cloud Run 服務帳戶讀取包含 Active Directory 密碼的機密:
& gcloud secrets add-iam-policy-binding ad-password ` --member "serviceAccount:register-computer-app@$DomainProjectId.iam.gserviceaccount.com" ` --role "roles/secretmanager.secretAccessor"
授予 Cloud Build 部署至 Cloud Run 的必要權限:
$DomainProjectNumber = (gcloud projects describe $DomainProjectId --format='value(projectNumber)') & gcloud iam service-accounts add-iam-policy-binding register-computer-app@$DomainProjectId.iam.gserviceaccount.com ` --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" ` --role "roles/iam.serviceAccountUser" & gcloud projects add-iam-policy-binding $DomainProjectId ` --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" ` --role roles/cloudbuild.builds.builder & gcloud projects add-iam-policy-binding $DomainProjectId ` --member "serviceAccount:build-service@$DomainProjectId.iam.gserviceaccount.com" ` --role roles/run.admin
使用檔案
cloudbuild.yaml
做為範本,建立符合您環境的自訂 Cloud Run 建構設定:$Build = (Get-Content cloudbuild.yaml) $Build = $Build.Replace('__SERVERLESS_REGION__', "$ServerlessRegion") $Build = $Build.Replace('__PROJECTS_DN__', "$ProjectsOrgUnitPath") $Build = $Build.Replace('__AD_DOMAIN__', "$AdDomain") $Build = $Build.Replace('__AD_NETBIOS_DOMAIN__', "$AdNetbiosDomain") $Build = $Build.Replace('__SERVICE_ACCOUNT_EMAIL__', "register-computer-app@$DomainProjectId.iam.gserviceaccount.com") $Build = $Build.Replace('__SERVERLESS_NETWORK__', "$VpcName") $Build = $Build.Replace('__SERVERLESS_SUBNET__', "$VpcSubnet") $Build | Set-Content .\cloudbuild.hydrated.yaml
建構應用程式並部署至 Cloud Run:
& gcloud builds submit . ` --config cloudbuild.hydrated.yaml ` --substitutions _IMAGE_TAG=$(git rev-parse --short HEAD) ` --service-account "projects/$DomainProjectId/serviceAccounts/build-service@$DomainProjectId.iam.gserviceaccount.com" ` --default-buckets-behavior regional-user-owned-bucket
部署作業可能需要幾分鐘才能完成。
判斷 Cloud Run 應用程式的網址:
$RegisterUrl = (gcloud run services describe register-computer ` --platform managed ` --region $ServerlessRegion ` --format=value`(status.url`)) Write-Host $RegisterUrl
請記下網址。您每次建立應加入 Active Directory 的 VM 執行個體時,都需要使用這個值。
請叫用 Cloud Run 應用程式,確認部署作業是否成功:
Invoke-RestMethod $RegisterUrl
系統會顯示 PowerShell 指令碼。這個指令碼會在將 VM 加入網域的專屬階段中執行。
啟用自動加入網域的專案
除非 VM 專案已啟用自動網域加入功能,否則 register-computer
應用程式不會允許 VM 執行個體加入 Active Directory 網域。這項安全措施可防止連線至未經授權的專案的 VM 存取您的網域。
如要讓專案自動加入網域,您必須執行下列操作:
- 在 Active Directory 中建立 OU,其名稱應與Google Cloud 專案 ID 相符。
- 授予
register-computer
應用程式存取Google Cloud 專案的權限。
首先建立 OU:
- 使用遠端桌面通訊協定用戶端,登入具有 Active Directory 網域管理權限的電腦。
- 在 Active Directory 使用者和電腦 MMC 嵌入式管理單元中,前往
Projects
OU。 - 在 OU 上按一下滑鼠右鍵,然後依序選取「New」 >「Organizational Unit」。
- 在「New Object」對話方塊中,輸入要部署 VM 的Google Cloud 專案 ID。
- 按一下 [確定]。
接著,請授予 register-computer
應用程式對Google Cloud 專案的存取權:
在 Cloud Shell 中啟動 PowerShell:
pwsh
初始化下列變數:
$ProjectId = "
project-id
" $DomainProjectId = "domain-project-id
"取代
project-id
與Google Cloud 專案 ID 搭配使用,以便在該專案中部署 VM- 將
domain-project-id
替換為您的網域專案 ID
將
Compute Viewer
角色授予專案的register-computer-app
服務帳戶:& gcloud projects add-iam-policy-binding $ProjectId ` --member "serviceAccount:register-computer-app@$DomainProjectId.iam.gserviceaccount.com" ` --role "roles/compute.viewer"
您的專案現在已可支援自動加入網域功能。
測試網域彙整
您現在可以透過以下方式確認設定是否正常運作:
- 建立自動加入 Active Directory 網域的單一 VM 執行個體
- 建立自動加入 Active Directory 網域的 VM 執行個體代管執行個體群組
建立及加入單一 VM 執行個體
建立自動加入 Active Directory 網域的 VM 執行個體:
返回 Cloud Shell 中的 PowerShell 工作階段,並初始化下列變數:
$Region = "vpc-region-to-deploy-vm" $Zone = "zone-to-deploy-vm" $Subnet = "vpc-subnet-to-deploy-vm" $ServerlessRegion = "
serverless-region
"更改下列內容:
vpc-region-to-deploy-vm
:要部署 VM 執行個體的地區。vpc-subnet-to-deploy-vm
:要部署 VM 執行個體的子網路。zone-to-deploy-vm
:要部署 VM 執行個體的可用區。serverless-region
:您部署 Cloud Run 應用程式的區域。
設定預設專案和可用區:
& gcloud config set project $ProjectId & gcloud config set compute/zone $Zone
再次查詢 Cloud Run 應用程式的網址:
$RegisterUrl = (gcloud run services describe register-computer ` --platform managed ` --region $ServerlessRegion ` --format value`(status.url`) ` --project $DomainProjectId)
傳遞可讓 VM 加入網域的 specialize 指令碼片段,藉此建立執行個體:
共用虛擬私有雲
$VpchostProjectId = (gcloud compute shared-vpc get-host-project $ProjectId --format=value`(name`)) & gcloud compute instances create join-01 ` --image-family windows-2019-core ` --image-project windows-cloud ` --machine-type n1-standard-2 ` --no-address ` --subnet projects/$VpchostProjectId/regions/$Region/subnetworks/$Subnet ` --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
獨立 VPC
& gcloud compute instances create join-01 ` --image-family=windows-2019-core ` --image-project=windows-cloud ` --machine-type=n1-standard-2 ` --no-address ` --subnet $Subnet ` --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
如果您想使用自訂主機名稱,請在指令中加入
--hostname
參數。如果您使用的是 Windows Server 2019 之前的版本,TLS 1.2 可能會預設為停用,這可能導致專用指令碼片段失敗。如要啟用 TLS 1.2,請改用下列指令碼片段:
[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12;iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))
監控啟動程序:
& gcloud compute instances tail-serial-port-output join-01
大約一分鐘後,電腦就會加入 Active Directory 網域。輸出結果會與下列內容相似:
Domain : corp.example.com DomainController : dc-01.corp.example.com. OrgUnitPath : OU=test-project-123,OU=Projects,DC=corp,DC=example,DC=com WARNING: The changes will take effect after you restart the computer Computer successfully joined to domain
如要停止觀察啟動程序,請按下
CTRL+C
。
確認 VM 已加入 Active Directory
- 使用遠端桌面通訊協定用戶端,登入具有 Active Directory 網域管理權限的電腦。
- 開啟「Active Directory 使用者和電腦」MMC 嵌入式管理單元。
- 在選單中,確認已啟用「View」 >「Advanced Features」。
- 前往以您建立 VM 執行個體的 Google Cloud 專案 ID 命名的 OU。
- 按兩下
join-01
帳戶。 在「Properties」對話方塊中,按一下「Attribute Editor」分頁。
電腦帳戶會加上額外的 LDAP 屬性註解。這些屬性可讓您追蹤電腦物件和 Compute Engine 執行個體之間的關聯。
確認清單包含下列 LDAP 屬性和值。
LDAP 屬性 值 msDS-cloudExtensionAttribute1
Google Cloud 專案 ID msDS-cloudExtensionAttribute2
Compute Engine 區域 msDS-cloudExtensionAttribute3
Compute Engine 執行個體名稱 msDS-cloudExtensionAttribute
屬性是通用屬性,不會由 Active Directory 本身使用。
診斷錯誤
如果 VM 執行個體無法加入網域,請檢查 register-computer
應用程式的記錄:
前往 Google Cloud 控制台的「Cloud Run」。
按一下
register-computer
應用程式。在選單中按一下「記錄」。
刪除執行個體
確認 VM 執行個體已加入 Active Directory 網域後,請刪除該執行個體。
刪除執行個體:
& gcloud compute instances delete join-01 --quiet
建立及加入代管執行個體群組
您也可以確認 MIG 中的執行個體是否能自動加入您的網域。
傳遞可讓 VM 加入網域的 specialize 指令碼,藉此建立執行個體範本:
共用虛擬私有雲
$VpchostProjectId = (gcloud compute shared-vpc get-host-project $ProjectId --format=value`(name`)) & gcloud compute instance-templates create ad-2019core-n1-std-2 ` --image-family windows-2019-core ` --image-project windows-cloud ` --no-address ` --machine-type n1-standard-2 ` --subnet projects/$VpchostProjectId/regions/$Region/subnetworks/$Subnet ` --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
獨立 VPC
& gcloud compute instance-templates create ad-2019core-n1-std-2 ` --image-family windows-2019-core ` --image-project windows-cloud ` --no-address ` --machine-type n1-standard-2 ` --subnet projects/$ProjectId/regions/$Region/subnetworks/$Subnet ` --metadata "sysprep-specialize-script-ps1=iex((New-Object System.Net.WebClient).DownloadString('$RegisterUrl'))"
建立使用執行個體範本的代管執行個體群組:
& gcloud compute instance-groups managed create group-01 ` --template ad-2019core-n1-std-2 ` --size=3
請稍候幾分鐘,然後使用 Active Directory 使用者與電腦 MMC 嵌入式管理單元,確認已在 Active Directory 中建立四個新物件:
- 3 個電腦帳戶,對應至代管執行個體群組的 3 個 VM 執行個體。
- 1 個名為
group-01
的群組,其中包含 3 個電腦帳戶。如果您打算使用群組代管服務帳戶 (gMSA),可以使用這個群組將存取權授予 gMSA。
確認 MIG 中的 VM 執行個體可加入 Active Directory 網域後,您可以按照下列步驟刪除受管理群組和執行個體範本:
在 Cloud Shell 中刪除執行個體群組:
& gcloud compute instance-groups managed delete group-01 --quiet
刪除執行個體範本:
& gcloud compute instance-templates delete ad-2019core-n1-std-2 --quiet
排定清理過時的電腦帳戶
自動化電腦加入網域的程序,可減少設定新伺服器的負擔,並讓您在受管理的執行個體群組中使用加入網域的伺服器。不過,隨著時間的推移,網域中可能會累積過期的電腦帳戶。
為避免這種情況發生,建議您設定 register-computer
應用程式,定期掃描 Active Directory 網域,找出並自動移除過時的帳戶及其相關 DNS 記錄。
register-computer
應用程式可以使用電腦帳戶的 msDS-cloudExtensionAttribute
屬性,找出哪些電腦帳戶已過時。這些屬性包含 Compute Engine 中對應 VM 執行個體的專案、區域和執行個體名稱。針對每個電腦帳戶,應用程式可以檢查對應的 VM 執行個體是否仍可用。如果不是,則系統會將電腦帳戶視為過時並予以移除。
如要觸發電腦帳戶清理作業,您必須叫用 Cloud Run 應用程式的 /cleanup
端點。為避免未授權使用者觸發清理作業,您必須使用 register-computer-app
服務帳戶驗證這項要求。
設定 Cloud Scheduler
下列步驟說明如何設定 Cloud Scheduler 並搭配使用 Pub/Sub,以便每 24 小時自動觸發一次清理作業:
在 Cloud Shell 中,啟用網域專案的 Cloud Scheduler API:
& gcloud services enable cloudscheduler.googleapis.com
將
AppEngineLocation
設為要部署 Cloud Scheduler 的有效 App Engine 位置:$AppEngineLocation = "
location
"將
location
替換為您為 VPC 資源選取的 App Engine 區域,例如us-central
。如果該區域無法做為 App Engine 位置,請選擇地理位置上離您最近的位置。詳情請參閱「地區和區域」。初始化 App Engine:
& gcloud app create --region $AppEngineLocation --project $DomainProjectId
建立 Cloud Scheduler 工作:
& gcloud scheduler jobs create http cleanup-computer-accounts ` --schedule "every 24 hours" ` --uri "$RegisterUrl/cleanup" ` --oidc-service-account-email register-computer-app@$DomainProjectId.iam.gserviceaccount.com ` --oidc-token-audience "$RegisterUrl/" ` --project $DomainProjectId
這個工作會每 24 小時呼叫一次
register-computer
應用程式,並使用register-computer-app
服務帳戶進行驗證。
觸發清理作業
如要驗證清理過時電腦帳戶的設定,您可以手動觸發 Cloud Scheduler 工作。
前往 Google Cloud 控制台的 Cloud Scheduler。
針對您建立的
cleanup-computer-accounts
工作,請按一下「立即執行」。幾秒後,「結果」欄會顯示「成功」,表示清理作業已順利完成。如果結果欄未在幾秒內自動更新,請按一下「Refresh」按鈕。
如要進一步瞭解系統清除哪些帳戶,請查看 register-computer
應用程式的記錄。
前往 Google Cloud 控制台的「Cloud Run」。
按一下
register-computer
應用程式。按一下選單中的「記錄」。
記錄項目指出,您用來測試網域加入作業的 VM 執行個體電腦帳戶已識別為過時,並已移除。
清除所用資源
如果您將這份文件做為其他參考架構和部署作業的基準,請參閱其他文件,瞭解何時執行清除步驟。
如果您不想保留本文件中使用的 Google Cloud 設定,可以按照下列步驟還原此設定:
在 Cloud Shell 中刪除 Cloud Scheduler 工作:
& gcloud scheduler jobs delete cleanup-computer-accounts ` --project $DomainProjectId
刪除 Cloud Run 應用程式:
& gcloud run services delete register-computer ` --platform managed ` --project $DomainProjectId ` --region $ServerlessRegion
刪除 Secret Manager 密鑰:
gcloud secrets delete ad-password --project $DomainProjectId
刪除 LDAP 和 Kerberos 存取權的防火牆規則:
gcloud compute firewall-rules delete allow-adkrb-from-serverless-to-dc --project=
vpc-project-id
將
vpc-project-id
替換為 VPC 定義所在專案的 ID。如果您使用共用虛擬私有雲,請使用 VPC 主專案;否則,請使用網域專案的 ID。
還原 Active Directory 變更
- 使用 RDP 用戶端,登入具有 Active Directory 網域管理員存取權的電腦。
- 在 Active Directory 使用者和電腦 MMC 嵌入式管理單元中,前往
Projects
OU。 - 刪除
register-computer
Active Directory 使用者帳戶。 - 刪除您用於測試自動加入網域功能的 OU。
後續步驟
- 如要使用自動網域加入功能,將 Windows VM 加入代管的 Microsoft AD 網域,請參閱「自動將 Windows VM 加入網域」一文。
- 請參閱在 Google Cloud上部署 Active Directory 資源樹系的最佳做法。
- 如需更多參考架構、圖表和最佳做法,請瀏覽 雲端架構中心。