Compute Engine に Active Directory フォレストをデプロイする

Last reviewed 2023-05-10 UTC

このドキュメントでは、Google Cloud で Active Directory を実行するためのベスト プラクティスに記載されているベストプラクティスに従って、Compute Engine上にActive Directoryフォレストをデプロイする方法を説明します。

このガイドは、管理者と DevOps エンジニアを対象としています。読者は Active Directory に関する深い知識を持ち、Google Cloud ネットワーキングとセキュリティに関する基本的な知識があることを前提としています。

アーキテクチャ

デプロイは 2 つのプロジェクトで構成されています。

このアーキテクチャでは、次のことが可能です。

  • 追加の Windows ワークロードを別々のプロジェクトにデプロイし、共有 VPC ネットワークと Active Directory フォレストを使用できるようにします。
  • Active Directory フォレストを既存のオンプレミス フォレストと統合して、リソース フォレスト パターンを実装する。

始める前に

このガイドの手順に従うには、次のものが必要です。

  • 2 つのサブネットのサブネット CIDR 範囲:

    • ドメイン コントローラのサブネット。このサブネットにはドメイン コントローラが含まれています。ドメイン コントローラに専用のサブネットを使用すると、ファイアウォール ルールの管理やネットワーク ログの分析で、ドメイン コントローラのトラフィックと他のサーバー トラフィックを区別できます。

      サイズは /28 または /29 のサブネット CIDR 範囲をおすすめします。

    • リソース サブネットこのサブネットには、サーバーと管理ワークステーションが含まれます。 デプロイを予定しているすべてのサーバーに対応できる十分な大きさのサブネット CIDR 範囲を使用します。

    サブネットがオンプレミス サブネットと重複せず、拡張に十分な余地があることを確認してください。

  • Active Directory フォレスト ルートドメインの DNS ドメイン名と NetBIOS ドメイン名。名前の選択の詳細については、Microsoft の命名規則をご覧ください。

共有ネットワークをデプロイする

このセクションでは、新しいプロジェクトを作成し、そのプロジェクトを使用して共有 VPC ネットワークをデプロイします。後でこのネットワークを使用して、Active Directory ドメイン コントローラをデプロイします。

プロジェクトを作成

次に、新しいプロジェクトを作成し、そのプロジェクトを使用して共有 VPC ネットワークをデプロイします。

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Compute Engine and Cloud DNS API を有効にします。

    API を有効にする

共有ネットワークのデプロイに必要な権限を取得するには、プロジェクトまたは親フォルダに次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセスの管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

デフォルト VPC を削除する

デフォルトでは、Compute Engine は新しく作成した各プロジェクトにデフォルト ネットワークを作成します。このネットワークは自動モードで構成されます。つまり、サブネットはリージョンごとに事前に割り当てられ、CIDR 範囲が自動的に割り当てられます。

このセクションでは、この VPC ネットワークを 2 つのサブネットを含み、カスタム CIDR 範囲を使用するカスタムモード ネットワークに置き換えます。

  1. Google Cloud コンソールCloud Shell を開きます。

    Cloud Shell をアクティブにする

  2. PowerShell を起動します。

    pwsh
    
  3. 新しいプロジェクトを使用するように gcloud CLI を構成します。

    gcloud config set project PROJECT_ID
    

    PROJECT_ID は、プロジェクトの ID に置き換えます。

  4. デフォルト 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 }
    
  5. デフォルト VPC を削除します。

    & gcloud compute networks list --format "value(name)" |
      % { gcloud compute networks delete $_ --quiet }
    

カスタムモードの VPC ネットワークを作成します。

VPC ホスト プロジェクトにカスタムモードの VPC ネットワークを作成します。

  1. 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"
    
  2. VPC を作成し、共有 VPC ネットワークとして使用するように構成します。

    $ProjectId = gcloud config get-value core/project
    & gcloud compute networks create $VpcName --subnet-mode custom
    & gcloud compute shared-vpc enable $ProjectId
    
  3. サブネットを作成し、限定公開の 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 通信を許可するファイアウォール ルールを作成します。

  1. 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
    
  2. 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 転送ゾーンが機能するには、このファイアウォール ルールが必要です。

  3. ドメイン コントローラ間の 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
    
  4. リソース サブネット内の 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
    
  5. セキュア 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 を構成する場合のみです。

  6. (省略可)失敗したすべてのアクセス試行を記録するファイアウォール ルールを作成します。ログは接続の問題を診断するのに役立ちますが、大量のログデータを生成する可能性があります。

    & 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 をデプロイします。

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Compute Engine and Secret Manager API を有効にします。

    API を有効にする

Active Directory フォレストをデプロイするために必要な権限を取得するには、プロジェクトに対する次の IAM ロールの付与を管理者に依頼してください。

ロールの付与の詳細については、アクセスの管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

構成の準備

次の手順では、Active Directory のデプロイの構成を準備します。

  1. 以前に PowerShell セッションを閉じている場合は、Cloud Shell を開きます。

    Cloud Shell をアクティブにする

  2. PowerShell を起動します。

    pwsh
    
  3. 新しいプロジェクトを使用するように gcloud CLI を構成します。

    gcloud config set project DC_PROJECT_ID
    

    DC_PROJECT_ID は、プロジェクトの ID に置き換えます。

  4. 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 転送ゾーンを作成します。

  1. プロジェクトを共有 VPC ネットワークに接続します。

    $ProjectId = gcloud config get-value core/project
    & gcloud compute shared-vpc associated-projects add $ProjectId --host-project $VpcProjectId
    
  2. ドメイン コントローラのサブネットで 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`)
    
  3. 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 フォレストをデプロイできるようにします。

  1. ランダムなパスワードを生成し、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
    
  2. ドメイン コントローラの VM インスタンスのサービス アカウントを作成します。

    $DcServiceAccount = gcloud iam service-accounts create ad-domaincontroller `
      --display-name "AD Domain Controller" `
      --format "value(email)"
    
  3. サービス アカウントに、今後 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 フォレストとドメインを作成します。手動のステップ数を最小限に抑えるには、起動スクリプトを使用します。

  1. 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 保護を有効にします。
  2. 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 に以前作成した起動スクリプトを実行します。
  3. 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
    
  4. シリアルポートの出力を表示して、1 番目のドメイン コントローラの初期化プロセスをモニタリングします。

    & gcloud compute instances tail-serial-port-output dc-1 --zone $Zones[0]
    

    Restarting to apply all settings...」というメッセージが表示されるまで 10 分ほど待ち、表示されたら Ctrl+C を押します。

  5. シリアルポートの出力を表示して、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 フォレストをカスタマイズできるようになりました。

  1. PowerShell で、Administrator ユーザーのパスワードにアクセスします。

    gcloud secrets versions access latest --secret ad-password
    
  2. RDP を使用して dc-1 に接続し、Administrator ユーザーとしてログオンします。

    VM インスタンスにはパブリック IP アドレスがないため、Identity-Aware Proxy TCP 転送を介して接続する必要があります。

次のステップ