Implemente uma floresta do Active Directory no Compute Engine

Last reviewed 2024-07-11 UTC

Este documento descreve como implementar uma floresta do Active Directory no Compute Engine de uma forma que siga as práticas recomendadas descritas no artigo Práticas recomendadas para executar o Active Directory no Google Cloud.

Este guia destina-se a administradores e engenheiros de DevOps. Parte do princípio de que tem um conhecimento sólido do Active Directory e conhecimentos básicos deGoogle Cloud rede e segurança.

Arquitetura

A implementação consiste em dois projetos:

Esta arquitetura permite-lhe fazer o seguinte:

  • Implemente cargas de trabalho do Windows adicionais em projetos separados e permita que usem a rede VPC partilhada e a floresta do Active Directory.
  • Integrar a floresta do Active Directory com uma floresta no local existente para implementar o padrão de floresta de recursos.

Antes de começar

Para seguir as instruções neste guia, certifique-se de que tem o seguinte:

  • Intervalos CIDR de sub-redes para duas sub-redes:

    • Sub-rede dos controladores de domínio. Esta sub-rede contém os controladores de domínio. A utilização de uma sub-rede dedicada para controladores de domínio ajuda a distinguir o tráfego do controlador de domínio do tráfego de outros servidores quando gere regras de firewall ou analisa registos de rede.

      Recomendamos um intervalo CIDR de sub-rede com o tamanho /28 ou /29.

    • Sub-rede de recursos. Esta sub-rede contém servidores e estações de trabalho administrativas. Use um intervalo CIDR de sub-rede suficientemente grande para acomodar todos os servidores que planeia implementar.

    Certifique-se de que as suas sub-redes não se sobrepõem a nenhuma sub-rede no local e permita espaço suficiente para crescimento.

  • Um nome de domínio DNS e um nome de domínio NetBIOS para o domínio raiz da floresta do Active Directory. Para mais informações sobre como escolher um nome, consulte as convenções de nomenclatura da Microsoft.

Implemente uma rede partilhada

Nesta secção, cria um novo projeto e usa-o para implementar uma rede de VPC partilhada. Mais tarde, vai usar esta rede para implementar os controladores de domínio do Active Directory.

Criar um projeto

Agora, cria um novo projeto e usa-o para implementar uma rede de VPC partilhada.

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the Compute Engine and Cloud DNS APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

Para receber as autorizações de que precisa para implementar uma rede partilhada, peça ao seu administrador que lhe conceda as seguintes funções da IAM no projeto ou na pasta principal:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Elimine a VPC predefinida

Por predefinição, o Compute Engine cria uma rede predefinida em cada novo projeto que criar. Esta rede está configurada no modo automático, o que significa que é pré-atribuída uma sub-rede a cada região e é-lhe automaticamente atribuído um intervalo CIDR.

Nesta secção, substitui esta rede VPC por uma rede de modo personalizado que contém duas sub-redes e que usa intervalos CIDR personalizados.

  1. Na Google Cloud consola, abra o Cloud Shell.

    Ative o Cloud Shell

  2. Inicie o PowerShell:

    pwsh
    
  3. Configure a CLI gcloud para usar o novo projeto:

    gcloud config set project PROJECT_ID
    

    Substitua PROJECT_ID pelo ID do seu projeto.

  4. Elimine todas as regras de firewall associadas à VPC predefinida:

    $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. Elimine a VPC predefinida:

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

Crie uma rede VPC no modo personalizado

Agora, cria uma rede VPC de modo personalizado no projeto anfitrião de VPC.

  1. No PowerShell, inicialize as seguintes variáveis:

    $VpcName = "VPC_NAME"
    $Region = "REGION"
    $SubnetRangeDomainControllers = "DC_CIDR"
    $SubnetRangeResources = "RESOURCES_CIDR"
    

    Substitua o seguinte:

    • VPC_NAME: o nome da VPC.
    • REGION: a região na qual implementar os controladores de domínio do Active Directory.
    • DC_CIDR: o intervalo de sub-rede a usar para a sub-rede dos controladores de domínio.
    • RESOURCES_CIDR: o intervalo de sub-rede a usar para a sub-rede de recursos.

    Exemplo:

    $VpcName = "ad"
    $Region = "us-central1"
    $SubnetRangeDomainControllers = "10.0.0.0/28"
    $SubnetRangeResources = "10.0.1.0/24"
    
  2. Crie a VPC e configure-a para ser usada como uma rede de VPC partilhada:

    $ProjectId = gcloud config get-value core/project
    & gcloud compute networks create $VpcName --subnet-mode custom
    & gcloud compute shared-vpc enable $ProjectId
    
  3. Crie as sub-redes e ative o acesso privado à Google para que o Windows possa ativar sem acesso à Internet.

    & 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
    

Implemente sub-redes e regras de firewall

Agora, cria regras de firewall para permitir a comunicação do Active Directory na VPC.

  1. Permita ligações RDP a todas as instâncias de VM através do encaminhamento TCP do IAP do Google Cloud:

    & 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. Permita consultas DNS do Cloud DNS para controladores de domínio.

    & 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
    

    Esta regra de firewall é necessária para que a zona de encaminhamento de DNS privado funcione.

  3. Permitir a replicação do Active Directory entre controladores de domínio:

    & 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. Permita inícios de sessão do Active Directory a partir de VMs que se encontram na sub-rede de recursos para controladores de domínio:

    & 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. Se planeia configurar o LDAP seguro, permita ligações LDAP seguras a partir de VMs que se encontram na sub-rede de recursos para controladores de domínio:

    & 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
    

    Só precisa desta regra de firewall se planear configurar o LDAP seguro.

  6. (Opcional) Crie uma regra de firewall que registe todas as tentativas de acesso falhadas. Os registos podem ser úteis para diagnosticar problemas de conetividade, mas podem gerar um volume significativo de dados de registo.

    & 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
    

Implemente a floresta do Active Directory

Nesta secção, cria um novo projeto de serviço e anexa-o ao projeto anfitrião da VPC partilhada que criou anteriormente. Em seguida, usa o projeto de serviço para implementar uma nova floresta do Active Directory com dois controladores de domínio.

Criar um projeto

Agora, cria um novo projeto e usa-o para implementar as VMs do controlador de domínio do Active Directory.

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the Compute Engine and Secret Manager APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

Para receber as autorizações de que precisa para implementar a floresta do Active Directory, peça ao seu administrador para lhe conceder as seguintes funções do IAM no projeto:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Prepare a configuração

O passo seguinte é preparar a configuração para a implementação do Active Directory.

  1. Se fechou anteriormente a sessão do PowerShell, abra o Cloud Shell.

    Ative o Cloud Shell

  2. Inicie o PowerShell:

    pwsh
    
  3. Configure a CLI gcloud para usar o novo projeto:

    gcloud config set project DC_PROJECT_ID
    

    Substitua DC_PROJECT_ID pelo ID do seu projeto.

  4. Use o PowerShell para criar as seguintes variáveis:

    $AdDnsDomain = "DNS_DOMAIN"
    $AdNetbiosDomain = "NETBIOS_DOMAIN"
    $VpcProjectId = "VPCHOST_PROJECT_ID"
    $VpcName = "VPC_NAME"
    $Region = "REGION"
    $Zones = "REGION-a", "REGION-b"
    

    Substitua o seguinte:

    • DNS_DOMAIN: o nome do domínio raiz da floresta do Active Directory, por exemplo, cloud.example.com.
    • NETBIOS_DOMAIN: o nome do domínio NetBIOS para o domínio raiz da floresta, por exemplo, CLOUD.
    • VPCHOST_PROJECT_ID: o ID do projeto anfitrião da VPC que criou anteriormente.
    • VPC_NAME: nome da rede VPC partilhada que criou anteriormente.
    • REGION: região na qual implementar os controladores de domínio do Active Directory. Tenha em atenção que os nomes das zonas baseiam-se nos nomes da região que especificar. Pode expandir a VPC e o seu domínio para abranger regiões adicionais em qualquer altura.

    Exemplo:

    $AdDnsDomain = "cloud.example.com"
    $AdNetbiosDomain = "CLOUD"
    $VpcProjectId = "vpc-project-123"
    $VpcName = "ad"
    $Region = "us-west1"
    $Zones = "us-west1-a", "us-west1-b"
    

Crie uma zona de encaminhamento de DNS privado

Agora, reserva dois endereços IP estáticos para os controladores de domínio e cria uma zona de encaminhamento de DNS privado que encaminha todas as consultas DNS para o domínio do Active Directory para estes endereços IP.

  1. Associe o projeto à rede VPC partilhada:

    $ProjectId = gcloud config get-value core/project
    & gcloud compute shared-vpc associated-projects add $ProjectId --host-project $VpcProjectId
    
  2. Reserve dois endereços IP internos estáticos na sub-rede dos controladores de domínio:

    $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. Crie uma zona de encaminhamento privado do Cloud DNS no projeto anfitrião da VPC e configure a zona para encaminhar consultas DNS para os dois endereços IP reservados:

    & 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"
    

Crie uma palavra-passe DSRM

Agora, define a palavra-passe do Modo de restauro do serviço de diretório (DSRM) e armazena-a no Secret Manager. Em seguida, concede às VMs do controlador de domínio acesso temporário a este segredo para que possam usá-lo para implementar a floresta do Active Directory.

  1. Gere uma palavra-passe aleatória e armazene-a num segredo do 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. Crie a conta de serviço para as instâncias de VM do controlador de domínio:

    $DcServiceAccount = gcloud iam service-accounts create ad-domaincontroller `
      --display-name "AD Domain Controller" `
      --format "value(email)"
    
  3. Conceda à conta de serviço autorização para ler o segredo durante a próxima hora:

    $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')"
    

Implemente controladores de domínio

Agora, implementa duas instâncias de VM e cria uma nova floresta e um novo domínio do Active Directory. Para minimizar o número de passos manuais, usa scripts de arranque.

  1. No PowerShell, execute o seguinte comando para gerar um script de arranque:

    '
    $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
    

    O script faz o seguinte:

    • Leia a palavra-passe do DSRM a partir do Secret Manager.
    • Promova a VM a um controlador de domínio.
    • Configure as definições de DNS para que cada controlador de domínio use o endereço de loopback como um servidor DNS.
    • Desative o IPv6.
    • Ative a proteção LSA.
  2. Crie uma instância de VM para o primeiro controlador de domínio:

    $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
    

    Este comando faz o seguinte:

    • Crie uma VM do Windows Server 2022 protegida.
    • Atribua a conta de serviço ad-domaincontroller à VM para que possa aceder à palavra-passe do DSRM.
    • Configure o agente convidado para desativar o gestor de contas. Para mais informações sobre a configuração do agente convidado, consulte o artigo Ativar e desativar funcionalidades da instância do Windows.
    • Permita que a MV instale as funcionalidades do Windows AD-Domain-Services e DNS durante a fase de especialização do sysprep.
    • Permita que a VM execute o script de arranque que criou anteriormente.
  3. Crie outra instância de VM para o segundo controlador de domínio e coloque-a numa zona diferente:

    & 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. Monitorize o processo de inicialização do primeiro controlador de domínio vendo a respetiva saída da porta de série:

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

    Aguarde cerca de 10 minutos até ver a mensagem Restarting to apply all settings..., e, em seguida, prima Ctrl+C.

  5. Monitorize o processo de inicialização do segundo controlador de domínio vendo a respetiva saída da porta de série:

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

    Aguarde cerca de 10 minutos até ver a mensagem Restarting to apply all settings..., e, em seguida, prima Ctrl+C.

A floresta e o domínio do Active Directory estão agora prontos a usar.

Estabeleça ligação a um controlador de domínio

Agora, pode personalizar a floresta do Active Directory estabelecendo ligação a um dos controladores de domínio.

  1. No PowerShell, aceda à palavra-passe do utilizador Administrator:

    gcloud secrets versions access latest --secret ad-password
    
  2. Estabeleça ligação ao dc-1 através do RDP e inicie sessão como utilizador do Administrator.

    Como a instância de VM não tem endereços IP públicos, tem de estabelecer ligação através do encaminhamento TCP do Identity-Aware Proxy.

O que se segue?