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:
- Um projeto anfitrião que contém uma rede de VPC partilhada, uma zona de encaminhamento de DNS privado e regras de firewall para o Active Directory.
- Um projeto de serviço que contém dois controladores de domínio implementados em duas zonas.
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.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles.
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:
-
Administrador de rede de Calcular (
roles/compute.networkAdmin
) -
Administrador de segurança do Compute (
roles/compute.securityAdmin
) -
Administrador da VPC partilhada do Compute (
roles/compute.xpnAdmin
) -
Administrador de DNS (
roles/dns.admin
)
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.
Na Google Cloud consola, abra o Cloud Shell.
Inicie o PowerShell:
pwsh
Configure a CLI gcloud para usar o novo projeto:
gcloud config set project PROJECT_ID
Substitua PROJECT_ID pelo ID do seu projeto.
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 }
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.
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"
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
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.
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
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.
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
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
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.
(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.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles.
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:
-
Administrador de instâncias do Compute (v1) (
roles/compute.instanceAdmin.v1
) -
Administrador da conta de serviço (
roles/iam.serviceAccountAdmin
) -
Utilizador da conta de serviço (
roles/iam.serviceAccountUser
) -
Administrador do Secret Manager (
roles/secretmanager.admin
) -
Utilizador do túnel protegido por CNA (
roles/iap.tunnelResourceAccessor
)
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.
Se fechou anteriormente a sessão do PowerShell, abra o Cloud Shell.
Inicie o PowerShell:
pwsh
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.
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.
Associe o projeto à rede VPC partilhada:
$ProjectId = gcloud config get-value core/project & gcloud compute shared-vpc associated-projects add $ProjectId --host-project $VpcProjectId
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`)
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.
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
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)"
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.
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.
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
eDNS
durante a fase de especialização do sysprep. - Permita que a VM execute o script de arranque que criou anteriormente.
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
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, primaCtrl+C
.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, primaCtrl+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.
No PowerShell, aceda à palavra-passe do utilizador
Administrator
:gcloud secrets versions access latest --secret ad-password
Estabeleça ligação ao
dc-1
através do RDP e inicie sessão como utilizador doAdministrator
.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?
- Saiba mais sobre os padrões de utilização do Active Directory num ambiente híbrido.
- Configure o Active Directory para que as VMs se juntem automaticamente a um domínio.
- Saiba mais sobre a utilização do Active Directory em firewalls.