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 範囲:

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

      サブネットの CIDR 範囲は /28 または /29 にすることをおすすめします。

    • リソース サブネットこのサブネットには、サーバーおよび管理ワークステーションがあります。デプロイするすべてのサーバーに十分対応できるサブネットの 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 を削除する

デフォルトでは、作成した新しいプロジェクトごとにデフォルト ネットワークが作成されます。このネットワークは自動モードで構成されています。つまり、サブネットは各リージョンに事前に割り振られ、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
    

    このファイアウォール ルールは、Secure 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 パスワードを作成する

次に、Directory Service Restore Mode(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 転送を介して接続する必要があります。

次のステップ