このドキュメントでは、Google Cloud で Active Directory を実行するためのベスト プラクティスに記載されているベストプラクティスに従って、 Compute Engine 上に Active Directory フォレストをデプロイする方法を説明します。
このガイドは、管理者と DevOps エンジニアを対象としています。Active Directory を十分に理解し、 ネットワーキングとセキュリティの Google Cloud 基本的な知識があることを前提としています。
アーキテクチャ
デプロイメントは次の 2 つのプロジェクトで構成されます。
- Active Directory 用の共有 VPC ネットワーク、プライベート DNS 転送ゾーン、ファイアウォール ルールを含むホスト プロジェクト。
- 2 つのゾーンにデプロイされた 2 つのドメイン コントローラを含むサービス プロジェクト。
このアーキテクチャでは、次のことができます。
- 追加の Windows ワークロードを別のプロジェクトにデプロイし、共有 VPC ネットワークと Active Directory フォレストを使用できるようにします。
- Active Directory フォレストを既存のオンプレミス フォレストと統合して、リソース フォレスト パターンを実装します。
始める前に
このガイドの手順に沿って操作するには、次のものが必要です。
2 つのサブネットのサブネット CIDR 範囲:
ドメイン コントローラ サブネット 。このサブネットにはドメイン コントローラが含まれています。 ドメイン コントローラ専用のサブネットを使用すると、ファイアウォール ルールを管理したり、ネットワーク ログを分析したりするときに、ドメイン コントローラのトラフィックを他のサーバー トラフィックと区別できます。
サブネット CIDR の範囲は
/28または/29のサイズにすることをおすすめします。リソース サブネット 。このサブネットには、サーバーと管理ワークステーションが含まれています。デプロイする予定のすべてのサーバーに対応できる十分な大きさのサブネット CIDR の範囲を使用します。
サブネットがオンプレミス サブネットと重複しないようにし、拡張に対応できる十分なスペースを確保してください。
Active Directory フォレスト ルートドメインの DNS ドメイン名と NetBIOS ドメイン名。名前の選択の詳細については、 Microsoft の命名規則をご覧ください。
共有ネットワークをデプロイする
このセクションでは、新しいプロジェクトを作成し、それを使用して共有 VPC ネットワークをデプロイします。後で、このネットワークを使用して Active Directory ドメイン コントローラをデプロイします。
プロジェクトを作成
新しいプロジェクトを作成し、それを使用して共有 VPC ネットワークをデプロイします。
-
コンソールの Google Cloud プロジェクト セレクタページで、 Google Cloud プロジェクトを選択または作成します。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択には特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。ロールを付与する方法を学習する。
Compute Engine API と Cloud DNS API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を学習する。
共有ネットワークをデプロイするために必要な権権限を取得するには、プロジェクトまたは親フォルダに対する次の 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 をデプロイします。
-
コンソールの Google Cloud プロジェクト セレクタページで、 Google Cloud プロジェクトを選択または作成します。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択には特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。ロールを付与する方法を学習する。
Compute Engine API と Secret Manager API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を学習する。
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 限定公開転送ゾーンを作成し、DNS クエリを予約済みの 2 つの IP アドレスに転送するようにゾーンを構成します。
& 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 Mode(DSRM) パスワードを定義し、Secret Managerに保存します。次に、ドメイン コントローラ VM にこのシークレットへの一時的なアクセス権を付与して、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 $ActiveDirectoryNetbiosDomain ` -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 保護を有効にします。
最初のドメイン コントローラ用の 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
このコマンドは次の処理を行います。
- シールドされた Windows Server 2022 VM を作成します。
ad-domaincontrollerサービス アカウントを VM に割り当てて、DSRM パスワードにアクセスできるようにします。- アカウント マネージャーを無効にするようにゲスト エージェントを構成します。ゲスト エージェントの構成の詳細については、 Windows インスタンスの機能の有効化と無効化をご覧ください。
- VM が sysprep の specialize フェーズで Windows 機能
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
シリアルポートの出力を表示して、最初のドメイン コントローラの初期化プロセスをモニタリングします。
& 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 転送を介して接続する必要があります。