為 VM 設定 Active Directory,讓 VM 自動加入網域

Last reviewed 2024-10-31 UTC

本文說明如何設定 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 使用者可能符合申請免費試用的資格。

完成這份文件後,您可以刪除已建立的資源,避免繼續產生費用。詳情請參閱「清除所用資源」。

事前準備

本文假設您已在 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 存取權

如果您使用自管網域控制器,還需要以下項目:

實作這種做法

在內部部署環境中,您可以使用答案檔案 (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 專用指令碼會啟動下圖所示的程序。

由 sysprep 專用指令碼啟動的程序。

這個程序的運作方式如下:

  1. 建立 VM 執行個體後,Windows 會首次啟動。在專屬設定傳遞的過程中,Windows 會執行 sysprep 專屬指令碼片段。專用指令碼會叫用 register-computer Cloud Run 應用程式,並下載用於控管網域加入程序的 PowerShell 指令碼。
  2. Windows 會叫用下載的 PowerShell 指令碼。
  3. PowerShell 指令碼會呼叫中繼資料伺服器,取得可安全地識別 VM 執行個體的 ID 權杖。
  4. 指令碼會再次呼叫 register-computer 應用程式,傳遞 ID 權杖來驗證自身。
  5. 應用程式會驗證 ID 權杖,並擷取 VM 執行個體的名稱、區域和Google Cloud 專案 ID。
  6. 應用程式會驗證 Active Directory 網域是否已設定為允許指定專案的 VM 執行個體加入網域。為了完成這項驗證,應用程式會尋找並連線至 Active Directory 網域控制器,檢查機構單位 (OU) 的名稱是否與 ID 權杖中的 Google Cloud 專案 ID 相符。如果找到符合的 OU,則專案的 VM 執行個體會獲得授權,可加入指定 OU 中的 Active Directory 網域。
  7. 應用程式會驗證 Google Cloud 專案是否已設定為允許 VM 執行個體加入 Active Directory。為了完成這項驗證,應用程式會檢查是否能使用 Compute Engine API 存取 VM 執行個體。
  8. 如果所有檢查都通過,應用程式就會在 Active Directory 中預先建立電腦帳戶。應用程式會將 VM 執行個體的名稱、區域和 ID 儲存為電腦帳戶物件中的屬性,以便與 VM 執行個體建立關聯。
  9. 接著,應用程式會使用 Kerberos 密碼設定通訊協定,為電腦帳戶指派隨機密碼。
  10. 電腦名稱和密碼會透過 TLS 安全管道傳回至 Windows 執行個體。
  11. 使用預先設定的電腦帳戶,PowerShell 指令碼會將電腦加入網域。
  12. 專屬設定通過後,機器會自行重新啟動。

本程序的其餘部分會逐步引導您完成自動網域加入功能的設定步驟。

準備 Active Directory 網域

首先,請準備 Active Directory 網域。如要完成這個步驟,您需要具備 Active Directory 網域的管理員存取權。

選用:限制可加入網域的電腦

您可能會想限制哪些使用者可以將電腦加入網域。根據預設,預設網域控制器政策的群組政策物件 (GPO) 設定會將 Add workstations to domain 使用者權限授予所有已驗證的使用者。任何擁有該使用者權限的使用者,都可以將電腦加入網域。由於您會自動將電腦加入 Active Directory 網域,因此全面授予這類存取權會造成不必要的安全風險。

如要限制可將電腦加入 Active Directory 網域的使用者,請變更預設網域控制站政策 GPO 的預設設定:

  1. 使用 RDP 用戶端登入具有 Active Directory 網域管理員存取權的電腦。
  2. 開啟群組原則管理主控台 (GPMC)。
  3. 依序前往「森林」 >「網域」 >「domain-name >「群組政策物件」,其中 domain-name 是 Active Directory 網域的名稱。
  4. 在「Default Domain Controller Policy」上按一下滑鼠右鍵,然後點選「Edit」
  5. 在群組原則管理編輯器控制台中,依序前往「Computer Configuration」 >「Policies」 >「Windows Settings」 >「Security Settings」 >「Local Policies」 >「User Rights Assignment」
  6. 按兩下「將工作站加入網域」
  7. 在「資源」中,從清單中移除「已驗證的使用者」
  8. 如要讓管理員手動加入網域 (選用),請按一下「新增使用者或群組」,然後將管理群組新增至清單。
  9. 按一下 [確定]

您現在可以關閉群組原則管理編輯器主控台和 GPMC。

初始化目錄結構

您現在可以建立一個 OU,做為所有專案專屬 OU 的容器:

  1. 使用 RDP 用戶端登入具有 Active Directory 網域管理員存取權的電腦。
  2. 開啟已啟用進階權限的 PowerShell 工作階段。
  3. 建立新的機構單位:

    $ParentOrgUnitPath = (Get-ADDomain).ComputersContainer
    $ProjectsOrgUnitPath = New-ADOrganizationalUnit `
      -Name 'Projects' `
      -Path $ParentOrgUnitPath `
      -PassThru
    

建立 Active Directory 使用者帳戶

如要存取 Active Directory 和預先登錄的電腦帳戶,register-computer 應用程式需要 Active Directory 使用者帳戶:

  1. 建立名為 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
    
  2. 授予 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 }
    

    這個指令可能需要幾分鐘才能完成。

  3. 授予 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
    
  4. 顯示 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 密鑰

  1. 在 Google Cloud 控制台中,開啟 Cloud Shell。

    開啟 Cloud Shell

  2. 啟動 PowerShell:

    pwsh
    
  3. 初始化下列變數,將 domain-project-id 替換為您的網域專案 ID:

    $DomainProjectId = "domain-project-id"
    
  4. 將網域專案設為預設專案:

    & gcloud config set project $DomainProjectId
    
  5. 啟用 Secret Manager API:

    & gcloud services enable secretmanager.googleapis.com
    
  6. 輸入 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:

  1. 在 Cloud Shell 中,複製 GitHub 存放區。

    & git clone https://github.com/GoogleCloudPlatform/gce-automated-ad-join.git
    cd gce-automated-ad-join/ad-joining
    
  2. 初始化下列變數:

    $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-nameProjects OU 的專屬名稱。
  3. 啟用 Cloud Run 和 Cloud Build API:

    & gcloud services enable run.googleapis.com cloudbuild.googleapis.com
    
  4. 為 Cloud Run 應用程式建立服務帳戶 register-computer-app

    & gcloud iam service-accounts create register-computer-app `
      --display-name="register computer Cloud Run app"
    
  5. 建立服務帳戶 build-service 來執行 Cloud Build 觸發條件:

    & gcloud iam service-accounts create build-service `
      --display-name="Cloud Build build agent"
    
  6. 允許 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"
    
  7. 授予 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
    
  8. 使用檔案 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
    
  9. 建構應用程式並部署至 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
    

    部署作業可能需要幾分鐘才能完成。

  10. 判斷 Cloud Run 應用程式的網址:

    $RegisterUrl = (gcloud run services describe register-computer `
      --platform managed `
      --region $ServerlessRegion `
      --format=value`(status.url`))
    Write-Host $RegisterUrl
    

    請記下網址。您每次建立應加入 Active Directory 的 VM 執行個體時,都需要使用這個值。

  11. 請叫用 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:

  1. 使用遠端桌面通訊協定用戶端,登入具有 Active Directory 網域管理權限的電腦。
  2. 在 Active Directory 使用者和電腦 MMC 嵌入式管理單元中,前往 Projects OU。
  3. 在 OU 上按一下滑鼠右鍵,然後依序選取「New」 >「Organizational Unit」
  4. 在「New Object」對話方塊中,輸入要部署 VM 的Google Cloud 專案 ID。
  5. 按一下 [確定]

接著,請授予 register-computer 應用程式對Google Cloud 專案的存取權:

  1. 在 Cloud Shell 中啟動 PowerShell:

    pwsh
    
  2. 初始化下列變數:

    $ProjectId = "project-id"
    $DomainProjectId = "domain-project-id"
    

    取代

    • project-id 與Google Cloud 專案 ID 搭配使用,以便在該專案中部署 VM
    • domain-project-id 替換為您的網域專案 ID
  3. 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 執行個體:

  1. 返回 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 應用程式的區域。
  2. 設定預設專案和可用區:

    & gcloud config set project $ProjectId
    & gcloud config set compute/zone $Zone
    
  3. 再次查詢 Cloud Run 應用程式的網址:

    $RegisterUrl = (gcloud run services describe register-computer `
      --platform managed `
      --region $ServerlessRegion `
      --format value`(status.url`) `
      --project $DomainProjectId)
    
  4. 傳遞可讓 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'))
    
  5. 監控啟動程序:

    & 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

  1. 使用遠端桌面通訊協定用戶端,登入具有 Active Directory 網域管理權限的電腦。
  2. 開啟「Active Directory 使用者和電腦」MMC 嵌入式管理單元。
  3. 在選單中,確認已啟用「View」 >「Advanced Features」
  4. 前往以您建立 VM 執行個體的 Google Cloud 專案 ID 命名的 OU。
  5. 按兩下 join-01 帳戶。
  6. 在「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 應用程式的記錄:

  1. 前往 Google Cloud 控制台的「Cloud Run」。

    前往 Cloud Run

  2. 按一下 register-computer 應用程式。

  3. 在選單中按一下「記錄」

刪除執行個體

確認 VM 執行個體已加入 Active Directory 網域後,請刪除該執行個體。

  • 刪除執行個體:

    & gcloud compute instances delete join-01 --quiet
    

建立及加入代管執行個體群組

您也可以確認 MIG 中的執行個體是否能自動加入您的網域。

  1. 傳遞可讓 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'))"
    
  2. 建立使用執行個體範本的代管執行個體群組:

    & 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 網域後,您可以按照下列步驟刪除受管理群組和執行個體範本:

  1. 在 Cloud Shell 中刪除執行個體群組:

    & gcloud compute instance-groups managed delete group-01 --quiet
    
  2. 刪除執行個體範本:

    & 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 小時自動觸發一次清理作業:

  1. 在 Cloud Shell 中,啟用網域專案的 Cloud Scheduler API:

    & gcloud services enable cloudscheduler.googleapis.com
    
  2. AppEngineLocation 設為要部署 Cloud Scheduler 的有效 App Engine 位置

    $AppEngineLocation = "location"
    

    location 替換為您為 VPC 資源選取的 App Engine 區域,例如 us-central。如果該區域無法做為 App Engine 位置,請選擇地理位置上離您最近的位置。詳情請參閱「地區和區域」。

  3. 初始化 App Engine:

    & gcloud app create --region $AppEngineLocation --project $DomainProjectId
    
  4. 建立 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 工作。

  1. 前往 Google Cloud 控制台的 Cloud Scheduler。

    前往 Cloud Scheduler

  2. 針對您建立的 cleanup-computer-accounts 工作,請按一下「立即執行」

    幾秒後,「結果」欄會顯示「成功」,表示清理作業已順利完成。如果結果欄未在幾秒內自動更新,請按一下「Refresh」按鈕。

如要進一步瞭解系統清除哪些帳戶,請查看 register-computer 應用程式的記錄。

  1. 前往 Google Cloud 控制台的「Cloud Run」。

    前往 Cloud Run

  2. 按一下 register-computer 應用程式。

  3. 按一下選單中的「記錄」

    記錄項目指出,您用來測試網域加入作業的 VM 執行個體電腦帳戶已識別為過時,並已移除。

清除所用資源

如果您將這份文件做為其他參考架構和部署作業的基準,請參閱其他文件,瞭解何時執行清除步驟。

如果您不想保留本文件中使用的 Google Cloud 設定,可以按照下列步驟還原此設定:

  1. 在 Cloud Shell 中刪除 Cloud Scheduler 工作:

    & gcloud scheduler jobs delete cleanup-computer-accounts `
      --project $DomainProjectId
    
  2. 刪除 Cloud Run 應用程式:

    & gcloud run services delete register-computer `
      --platform managed `
      --project $DomainProjectId `
      --region $ServerlessRegion
    
  3. 刪除 Secret Manager 密鑰:

    gcloud secrets delete ad-password --project $DomainProjectId
    
  4. 刪除 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 變更

  1. 使用 RDP 用戶端,登入具有 Active Directory 網域管理員存取權的電腦。
  2. 在 Active Directory 使用者和電腦 MMC 嵌入式管理單元中,前往 Projects OU。
  3. 刪除 register-computer Active Directory 使用者帳戶。
  4. 刪除您用於測試自動加入網域功能的 OU。

後續步驟