このドキュメントでは、Google Cloud で Active Directory を実行するためのベスト プラクティスに記載されているベストプラクティスに従って、Compute Engine上にActive Directoryフォレストをデプロイする方法を説明します。
このガイドは、管理者と DevOps エンジニアを対象としています。読者は Active Directory に関する深い知識を持ち、Google Cloud ネットワーキングとセキュリティに関する基本的な知識があることを前提としています。
アーキテクチャ
デプロイは 2 つのプロジェクトで構成されています。
- 共有 VPC ネットワーク、限定公開 DNS 転送ゾーン、Active Directory 用 ファイアウォール ルールを含むホスト プロジェクト。
- 2 つのゾーンにデプロイされる 2 つのドメイン コントローラを含むサービス プロジェクト。
このアーキテクチャでは、次のことが可能です。
- 追加の Windows ワークロードを別々のプロジェクトにデプロイし、共有 VPC ネットワークと Active Directory フォレストを使用できるようにします。
- Active Directory フォレストを既存のオンプレミス フォレストと統合して、リソース フォレスト パターンを実装する。
始める前に
このガイドの手順に従うには、次のものが必要です。
2 つのサブネットのサブネット CIDR 範囲:
ドメイン コントローラのサブネット。このサブネットにはドメイン コントローラが含まれています。ドメイン コントローラに専用のサブネットを使用すると、ファイアウォール ルールの管理やネットワーク ログの分析で、ドメイン コントローラのトラフィックと他のサーバー トラフィックを区別できます。
サイズは
/28
または/29
のサブネット CIDR 範囲をおすすめします。リソース サブネットこのサブネットには、サーバーと管理ワークステーションが含まれます。 デプロイを予定しているすべてのサーバーに対応できる十分な大きさのサブネット CIDR 範囲を使用します。
サブネットがオンプレミス サブネットと重複せず、拡張に十分な余地があることを確認してください。
Active Directory フォレスト ルートドメインの DNS ドメイン名と NetBIOS ドメイン名。名前の選択の詳細については、Microsoft の命名規則をご覧ください。
共有ネットワークをデプロイする
このセクションでは、新しいプロジェクトを作成し、そのプロジェクトを使用して共有 VPC ネットワークをデプロイします。後でこのネットワークを使用して、Active Directory ドメイン コントローラをデプロイします。
プロジェクトを作成
次に、新しいプロジェクトを作成し、そのプロジェクトを使用して共有 VPC ネットワークをデプロイします。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine and Cloud DNS APIs.
共有ネットワークのデプロイに必要な権限を取得するには、プロジェクトまたは親フォルダに次の IAM ロールを付与するよう管理者に依頼してください。
- Compute ネットワーク管理者(
roles/compute.networkAdmin
) - Compute セキュリティ管理者(
roles/compute.securityAdmin
) - Compute Shared VPC 管理者(
roles/compute.xpnAdmin
) - DNS 管理者(
roles/dns.admin
)
ロールの付与の詳細については、アクセスの管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
デフォルト VPC を削除する
デフォルトでは、Compute Engine は新しく作成した各プロジェクトにデフォルト ネットワークを作成します。このネットワークは自動モードで構成されます。つまり、サブネットはリージョンごとに事前に割り当てられ、CIDR 範囲が自動的に割り当てられます。
このセクションでは、この VPC ネットワークを 2 つのサブネットを含み、カスタム CIDR 範囲を使用するカスタムモード ネットワークに置き換えます。
Google Cloud コンソールで Cloud Shell を開きます。
PowerShell を起動します。
pwsh
新しいプロジェクトを使用するように gcloud CLI を構成します。
gcloud config set project PROJECT_ID
PROJECT_ID は、プロジェクトの ID に置き換えます。
デフォルト VPC に関連付けられているすべてのファイアウォール ルールを削除します。
$ProjectId = gcloud config get-value core/project & gcloud compute firewall-rules list ` --filter "network=default" ` --format "value(name)" | % { gcloud compute firewall-rules delete --quiet $_ --project $ProjectId }
デフォルト VPC を削除します。
& gcloud compute networks list --format "value(name)" | % { gcloud compute networks delete $_ --quiet }
カスタムモードの VPC ネットワークを作成します。
VPC ホスト プロジェクトにカスタムモードの VPC ネットワークを作成します。
PowerShell で、次の変数を初期化します。
$VpcName = "VPC_NAME" $Region = "REGION" $SubnetRangeDomainControllers = "DC_CIDR" $SubnetRangeResources = "RESOURCES_CIDR"
以下を置き換えます。
VPC_NAME
: VPC の名前。REGION
: Active Directory ドメイン コントローラをデプロイするリージョンに置き換えます。DC_CIDR
: ドメイン コントローラのサブネットに使用するサブネット範囲。RESOURCES_CIDR
: リソース サブネットに使用するサブネット範囲に置き換えます。
例:
$VpcName = "ad" $Region = "us-central1" $SubnetRangeDomainControllers = "10.0.0.0/28" $SubnetRangeResources = "10.0.1.0/24"
VPC を作成し、共有 VPC ネットワークとして使用するように構成します。
$ProjectId = gcloud config get-value core/project & gcloud compute networks create $VpcName --subnet-mode custom & gcloud compute shared-vpc enable $ProjectId
サブネットを作成し、限定公開の Google アクセスを有効にして、Windows がインターネット アクセスなしで有効化できるようにします。
& gcloud compute networks subnets create domain-controllers ` --network $VpcName ` --range $SubnetRangeDomainControllers ` --region $Region ` --enable-private-ip-google-access & gcloud compute networks subnets create resources ` --network $VpcName ` --range $SubnetRangeResources ` --region $Region ` --enable-private-ip-google-access
サブネットとファイアウォール ルールのデプロイ
VPC 内での Active Directory 通信を許可するファイアウォール ルールを作成します。
Cloud IAP TCP 転送を介したすべての VM インスタンスへの RDP 接続を許可します。
& gcloud compute firewall-rules create allow-rdp-ingress-from-iap ` --direction INGRESS ` --action allow ` --rules tcp:3389 ` --enable-logging ` --source-ranges 35.235.240.0/20 ` --network $VpcName ` --priority 10000
Cloud DNS からドメイン コントローラへの DNS クエリを許可します。
& gcloud compute firewall-rules create allow-dns-ingress-from-clouddns ` --direction INGRESS ` --action=allow ` --rules udp:53,tcp:53 ` --enable-logging ` --source-ranges 35.199.192.0/19 ` --target-tags ad-domaincontroller ` --network $VpcName ` --priority 10000
限定公開 DNS 転送ゾーンが機能するには、このファイアウォール ルールが必要です。
ドメイン コントローラ間の Active Directory レプリケーションを許可します。
& gcloud compute firewall-rules create allow-replication-between-addc ` --direction INGRESS ` --action allow ` --rules "icmp,tcp:53,udp:53,tcp:88,udp:88,udp:123,tcp:135,tcp:389,udp:389,tcp:445,udp:445,tcp:49152-65535" ` --enable-logging ` --source-tags ad-domaincontroller ` --target-tags ad-domaincontroller ` --network $VpcName ` --priority 10000
リソース サブネット内の VM からドメイン コントローラへの Active Directory ログオンを許可します。
& gcloud compute firewall-rules create allow-logon-ingress-to-addc ` --direction INGRESS ` --action allow ` --rules "icmp,tcp:53,udp:53,tcp:88,udp:88,udp:123,tcp:135,tcp:389,udp:389,tcp:445,udp:445,tcp:464,udp:464,tcp:3268,udp:3268,tcp:9389,tcp:49152-65535" ` --enable-logging ` --source-ranges $SubnetRangeResources ` --target-tags ad-domaincontroller ` --network $VpcName ` --priority 10000
セキュア LDAP を構成する場合は、リソース サブネット内にある VM からドメイン コントローラへのセキュア LDAP 接続を許可します。
& gcloud compute firewall-rules create allow-ldaps-ingress-to-addc ` --direction INGRESS ` --action allow ` --rules tcp:636 ` --enable-logging ` --source-ranges $SubnetRangeResources ` --target-tags ad-domaincontroller ` --network $VpcName ` --priority 10000
ファイアウォール ルールが必要になるのは、セキュア LDAP を構成する場合のみです。
(省略可)失敗したすべてのアクセス試行を記録するファイアウォール ルールを作成します。ログは接続の問題を診断するのに役立ちますが、大量のログデータを生成する可能性があります。
& gcloud compute firewall-rules create deny-ingress-from-all ` --direction INGRESS ` --action deny ` --rules tcp:0-65535,udp:0-65535 ` --enable-logging ` --source-ranges 0.0.0.0/0 ` --network $VpcName ` --priority 65000
Active Directory フォレストをデプロイする
このセクションでは、新しいサービス プロジェクトを作成し、以前に作成した共有 VPC ホスト プロジェクトに接続します。次に、サービス プロジェクトを使用して、2 つのドメイン コントローラを持つ新しい Active Directory フォレストをデプロイします。
プロジェクトを作成
新しいプロジェクトを作成し、そのプロジェクトを使用して Active Directory ドメイン コントローラ VM をデプロイします。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine and Secret Manager APIs.
Active Directory フォレストをデプロイするために必要な権限を取得するには、プロジェクトに対する次の IAM ロールの付与を管理者に依頼してください。
-
Compute インスタンス管理者(v1)(
roles/compute.instanceAdmin.v1
) - サービス アカウント管理者(
roles/iam.serviceAccountAdmin
) - サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) - Secret Manager 管理者(
roles/secretmanager.admin
) - IAP で保護されたトンネル ユーザー(
roles/iap.tunnelResourceAccessor
)
ロールの付与の詳細については、アクセスの管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
構成の準備
次の手順では、Active Directory のデプロイの構成を準備します。
以前に PowerShell セッションを閉じている場合は、Cloud Shell を開きます。
PowerShell を起動します。
pwsh
新しいプロジェクトを使用するように gcloud CLI を構成します。
gcloud config set project DC_PROJECT_ID
DC_PROJECT_ID は、プロジェクトの ID に置き換えます。
PowerShell を使用して、次の変数を作成します。
$AdDnsDomain = "DNS_DOMAIN" $AdNetbiosDomain = "NETBIOS_DOMAIN" $VpcProjectId = "VPCHOST_PROJECT_ID" $VpcName = "VPC_NAME" $Region = "REGION" $Zones = "REGION-a", "REGION-b"
以下を置き換えます。
DNS_DOMAIN
: Active Directory フォレストのフォレスト ルートドメイン名(例:cloud.example.com
)。NETBIOS_DOMAIN
: フォレスト ルートドメインの NetBIOS ドメイン名(CLOUD
など)。VPCHOST_PROJECT_ID
: 以前に作成した VPC ホスト プロジェクトのプロジェクト ID。VPC_NAME
: 前に作成した共有 VPC ネットワークの名前。REGION
: Active Directory ドメイン コントローラをデプロイするリージョン。ゾーンの名前は、指定したリージョンの名前に基づくことに注意してください。VPC とドメインを拡張することで、いつでも追加のリージョンに対応できます。
例:
$AdDnsDomain = "cloud.example.com" $AdNetbiosDomain = "CLOUD" $VpcProjectId = "vpc-project-123" $VpcName = "ad" $Region = "us-west1" $Zones = "us-west1-a", "us-west1-b"
限定公開 DNS 転送ゾーンを作成する
ドメイン コントローラに 2 つの静的 IP アドレスを予約し、Active Directory ドメインのすべての DNS クエリをこれらの IP アドレスに転送するプライベート DNS 転送ゾーンを作成します。
プロジェクトを共有 VPC ネットワークに接続します。
$ProjectId = gcloud config get-value core/project & gcloud compute shared-vpc associated-projects add $ProjectId --host-project $VpcProjectId
ドメイン コントローラのサブネットで 2 つの静的内部 IP アドレスを予約します。
$AddressOfDc1 = gcloud compute addresses create dc-1 ` --region $Region ` --subnet "projects/$VpcProjectId/regions/$Region/subnetworks/domain-controllers" ` --format value`(address`) $AddressOfDc2 = gcloud compute addresses create dc-2 ` --region $Region ` --subnet "projects/$VpcProjectId/regions/$Region/subnetworks/domain-controllers" ` --format value`(address`)
VPC ホスト プロジェクトに Cloud DNS プライベート転送ゾーンを作成し、2 つの予約済み IP アドレスに DNS クエリを転送するようにゾーンを構成します。
& gcloud dns managed-zones create $AdDnsDomain.Replace(".", "-") ` --project $VpcProjectId ` --dns-name $AdDnsDomain ` --description "Active Directory forwarding zone" ` --networks $VpcName ` --visibility private ` --forwarding-targets "$AddressOfDc1,$AddressOfDc2"
DSRM パスワードを作成する
次に、Directory Service Restore モード(DSRM)のパスワードを定義し、Secret Manager に保存します。次に、ドメイン コントローラ VM にこの Secret への一時的なアクセス権を付与し、それを使用して Active Directory フォレストをデプロイできるようにします。
ランダムなパスワードを生成し、Secret Manager のシークレットに保存します。
# Generate a random password. $DsrmPassword = [Guid]::NewGuid().ToString()+"-"+[Guid]::NewGuid().ToString() $TempFile = New-TemporaryFile Set-Content $TempFile "$DsrmPassword" -NoNewLine & gcloud secrets create ad-password --data-file $TempFile Remove-Item $TempFile
ドメイン コントローラの VM インスタンスのサービス アカウントを作成します。
$DcServiceAccount = gcloud iam service-accounts create ad-domaincontroller ` --display-name "AD Domain Controller" ` --format "value(email)"
サービス アカウントに、今後 1 時間シークレットを読み取る権限を付与します。
$Expiry = [DateTime]::UtcNow.AddHours(1).ToString("o") & gcloud secrets add-iam-policy-binding ad-password ` --member=serviceAccount:$($DcServiceAccount) ` --role=roles/secretmanager.secretAccessor ` --condition="title=Expires after 1h,expression=request.time < timestamp('$Expiry')"
ドメイン コントローラーをデプロイする
2 つの VM インスタンスをデプロイし、新しい Active Directory フォレストとドメインを作成します。手動のステップ数を最小限に抑えるには、起動スクリプトを使用します。
PowerShell で次のコマンドを実行して、起動スクリプトを生成します。
' $ErrorActionPreference = "Stop" # # Only run the script if the VM is not a domain controller already. # if ((Get-CimInstance -ClassName Win32_OperatingSystem).ProductType -eq 2) { exit } # # Read configuration from metadata. # Import-Module "${Env:ProgramFiles}\Google\Compute Engine\sysprep\gce_base.psm1" $ActiveDirectoryDnsDomain = Get-MetaData -Property "attributes/ActiveDirectoryDnsDomain" -instance_only $ActiveDirectoryNetbiosDomain = Get-MetaData -Property "attributes/ActiveDirectoryNetbiosDomain" -instance_only $ActiveDirectoryFirstDc = Get-MetaData -Property "attributes/ActiveDirectoryFirstDc" -instance_only $ProjectId = Get-MetaData -Property "project-id" -project_only $Hostname = Get-MetaData -Property "hostname" -instance_only $AccessToken = (Get-MetaData -Property "service-accounts/default/token" | ConvertFrom-Json).access_token # # Read the DSRM password from secret manager. # $Secret = (Invoke-RestMethod ` -Headers @{ "Metadata-Flavor" = "Google"; "x-goog-user-project" = $ProjectId; "Authorization" = "Bearer $AccessToken"} ` -Uri "https://secretmanager.googleapis.com/v1/projects/$ProjectId/secrets/ad-password/versions/latest:access") $DsrmPassword = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Secret.payload.data)) $DsrmPassword = ConvertTo-SecureString -AsPlainText $DsrmPassword -force # # Promote. # Write-Host "Setting administrator password..." Set-LocalUser -Name Administrator -Password $DsrmPassword if ($ActiveDirectoryFirstDc -eq $env:COMPUTERNAME) { Write-Host "Creating a new forest $ActiveDirectoryDnsDomain ($ActiveDirectoryNetbiosDomain)..." Install-ADDSForest ` -DomainName $ActiveDirectoryDnsDomain ` -DomainNetbiosName $DomainNetbiosName ` -SafeModeAdministratorPassword $DsrmPassword ` -DomainMode Win2008R2 ` -ForestMode Win2008R2 ` -InstallDns ` -CreateDnsDelegation:$False ` -NoRebootOnCompletion:$True ` -Confirm:$false } else { do { Write-Host "Waiting for domain to become available..." Start-Sleep -s 60 & ipconfig /flushdns | Out-Null & nltest /dsgetdc:$ActiveDirectoryDnsDomain | Out-Null } while ($LASTEXITCODE -ne 0) Write-Host "Adding DC to $ActiveDirectoryDnsDomain ($ActiveDirectoryNetbiosDomain)..." Install-ADDSDomainController ` -DomainName $ActiveDirectoryDnsDomain ` -SafeModeAdministratorPassword $DsrmPassword ` -InstallDns ` -Credential (New-Object System.Management.Automation.PSCredential ("Administrator@$ActiveDirectoryDnsDomain", $DsrmPassword)) ` -NoRebootOnCompletion:$true ` -Confirm:$false } # # Configure DNS. # Write-Host "Configuring DNS settings..." Get-Netadapter| Disable-NetAdapterBinding -ComponentID ms_tcpip6 Set-DnsClientServerAddress ` -InterfaceIndex (Get-NetAdapter -Name Ethernet).InterfaceIndex ` -ServerAddresses 127.0.0.1 # # Enable LSA protection. # New-ItemProperty ` -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" ` -Name "RunAsPPL" ` -Value 1 ` -PropertyType DWord Write-Host "Restarting to apply all settings..." Restart-Computer ' | Out-File dc-startup.ps1 -Encoding ASCII
このスクリプトは次のことを行います。
- Secret Manager から DSRM パスワードを読み取ります。
- VM をドメイン コントローラに昇格させます。
- 各ドメイン コントローラが DNS サーバーとしてループバック アドレスを使用するように、DNS 設定を構成します。
- IPv6 を無効にします。
- LSA 保護を有効にします。
1 番目のドメイン コントローラの VM インスタンスを作成します。
$Subnet = "projects/$VpcProjectId/regions/$Region/subnetworks/domain-controllers" $Metadata = ` "ActiveDirectoryDnsDomain=$AdDnsDomain", "ActiveDirectoryNetbiosDomain=$AdNetbiosDomain", "ActiveDirectoryFirstDc=dc-1", "sysprep-specialize-script-ps1=Install-WindowsFeature AD-Domain-Services; Install-WindowsFeature DNS", "disable-account-manager=true" -join "," & gcloud compute instances create dc-1 ` --image-family windows-2022 ` --image-project windows-cloud ` --machine-type n2-standard-8 ` --tags ad-domaincontroller ` --metadata "$Metadata" ` --metadata-from-file windows-startup-script-ps1=dc-startup.ps1 ` --no-address ` --network-interface "no-address,private-network-ip=$AddressOfDc1,subnet=$Subnet" ` --service-account $DcServiceAccount ` --scopes cloud-platform ` --zone $Zones[0] ` --shielded-integrity-monitoring ` --shielded-secure-boot ` --shielded-vtpm ` --deletion-protection
このコマンドは次の処理を行います。
- Shielded Windows Server 2022 VM を作成します。
ad-domaincontroller
サービス アカウントを VM に割り当てて、DSRM パスワードにアクセスできるようにします。- アカウント マネージャーを無効にするようにゲスト エージェントを構成します。ゲスト エージェントの構成の詳細については、Windows インスタンス機能の有効化と無効化をご覧ください。
- Sysprep の specialize フェーズで、VM に
AD-Domain-Services
の機能とDNS
のインストールを許可します。 - VM に以前作成した起動スクリプトを実行します。
2 番目のドメイン コントローラ用の別の VM インスタンスを作成し、別のゾーンに配置します。
& gcloud compute instances create dc-2 ` --image-family windows-2022 ` --image-project windows-cloud ` --machine-type n2-standard-8 ` --tags ad-domaincontroller ` --metadata "$Metadata" ` --metadata-from-file windows-startup-script-ps1=dc-startup.ps1 ` --no-address ` --network-interface "no-address,private-network-ip=$AddressOfDc2,subnet=$Subnet" ` --service-account $DcServiceAccount ` --scopes cloud-platform ` --zone $Zones[1] ` --shielded-integrity-monitoring ` --shielded-secure-boot ` --shielded-vtpm ` --deletion-protection
シリアルポートの出力を表示して、1 番目のドメイン コントローラの初期化プロセスをモニタリングします。
& gcloud compute instances tail-serial-port-output dc-1 --zone $Zones[0]
「
Restarting to apply all settings...
」というメッセージが表示されるまで 10 分ほど待ち、表示されたらCtrl+C
を押します。シリアルポートの出力を表示して、2 番目のドメイン コントローラの初期化プロセスをモニタリングします。
& gcloud compute instances tail-serial-port-output dc-2 --zone $Zones[1]
「
Restarting to apply all settings...
」というメッセージが表示されるまで 10 分ほど待ち、表示されたらCtrl+C
を押します。
Active Directory フォレストとドメインを使用できるようになりました。
ドメイン コントローラに接続する
いずれかのドメイン コントローラに接続して、Active Directory フォレストをカスタマイズできるようになりました。
PowerShell で、
Administrator
ユーザーのパスワードにアクセスします。gcloud secrets versions access latest --secret ad-password
RDP を使用して
dc-1
に接続し、Administrator
ユーザーとしてログオンします。VM インスタンスにはパブリック IP アドレスがないため、Identity-Aware Proxy TCP 転送を介して接続する必要があります。