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. コンソールの Google Cloud プロジェクト セレクタページで、 Google Cloud プロジェクトを選択または作成します。

    プロジェクトを選択または作成するために必要なロール

    • プロジェクトを選択する: プロジェクトの選択には特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール (roles/resourcemanager.projectCreator)が必要です。これには resourcemanager.projects.create 権限が含まれています。ロールを付与する方法を学習する

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

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

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

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を学習する

    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 プロジェクト セレクタページで、 Google Cloud プロジェクトを選択または作成します。

    プロジェクトを選択または作成するために必要なロール

    • プロジェクトを選択する: プロジェクトの選択には特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール (roles/resourcemanager.projectCreator)が必要です。これには resourcemanager.projects.create 権限が含まれています。ロールを付与する方法を学習する

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

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

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

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を学習する

    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 限定公開転送ゾーンを作成し、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 を作成します。
    • ad-domaincontroller サービス アカウントを VM に割り当てて、DSRM パスワードにアクセスできるようにします。
    • アカウント マネージャーを無効にするようにゲスト エージェントを構成します。ゲスト エージェントの構成の詳細については、 Windows インスタンスの機能の有効化と無効化をご覧ください。
    • VM が sysprep の specialize フェーズで 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 転送を介して接続する必要があります。

次のステップ