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

Last reviewed 2024-07-11 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Compute Engine and Cloud DNS APIs.

    Enable the APIs

共有ネットワークをデプロイするために必要な権限を取得するには、プロジェクトまたは親フォルダに対する次の 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Compute Engine and Secret Manager APIs.

    Enable the APIs

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 の限定公開転送ゾーンを作成し、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 パスワードを作成する

ディレクトリ サービス復元モード(DSRM)パスワードを定義し、Secret Manager に保存します。次に、ドメイン コントローラ VM にこのシークレットへの一時的なアクセス権を付与し、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 $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 保護を有効にします。
  2. 最初のドメイン コントローラ用の 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 を作成します。
    • DSRM パスワードにアクセスできるように、ad-domaincontroller サービス アカウントを VM に割り当てます。
    • アカウント マネージャーを無効にするようにゲスト エージェントを構成します。ゲスト エージェントの構成の詳細については、Windows インスタンスの機能の有効化と無効化をご覧ください。
    • Sysprep の specialize フェーズで、VM に Windows 機能 AD-Domain-ServicesDNS をインストールさせます。
    • 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. シリアルポートの出力を表示して、最初のドメイン コントローラの初期化プロセスをモニタリングします。

    & 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 転送を使用して接続する必要があります。

次のステップ