Déployer une forêt Active Directory sur Compute Engine

Last reviewed 2023-05-10 UTC

Ce document explique comment déployer une forêt Active Directory sur Compute Engine de manière à suivre les bonnes pratiques décrites sur la page Bonnes pratiques pour exécuter Active Directory sur Google Cloud.

Ce guide est destiné aux administrateurs et aux ingénieurs en DevOps. Nous partons du principe que vous disposez d'une connaissance approfondie d'Active Directory et des connaissances de base de la mise en réseau et de la sécurité Google Cloud.

Architecture

Le déploiement comprend deux projets:

Cette architecture vous permet d'effectuer les opérations suivantes:

  • Déployez des charges de travail Windows supplémentaires dans des projets distincts et laissez-les utiliser le réseau VPC partagé et la forêt Active Directory.
  • Intégrez la forêt Active Directory avec une forêt sur site existante pour mettre en œuvre le modèle de forêt de ressources.

Avant de commencer

Pour suivre les instructions de ce guide, assurez-vous de disposer des éléments suivants:

  • Plages CIDR de sous-réseaux pour deux sous-réseaux:

    • Sous-réseau des contrôleurs de domaine. Ce sous-réseau contient les contrôleurs de domaine. L'utilisation d'un sous-réseau dédié aux contrôleurs de domaine vous aide à distinguer le trafic du contrôleur de domaine de l'autre trafic de serveur lorsque vous gérez des règles de pare-feu ou analysez les journaux réseau.

      Nous vous recommandons une plage CIDR de sous-réseau de taille /28 ou /29.

    • Sous-réseau de ressources. Ce sous-réseau contient des serveurs et des postes de travail administratifs. Utilisez une plage CIDR de sous-réseau suffisamment grande pour accueillir tous les serveurs que vous prévoyez de déployer.

    Assurez-vous que vos sous-réseaux ne chevauchent aucun sous-réseau local et laissez suffisamment de place pour la croissance.

  • Un nom de domaine DNS et un nom de domaine NetBIOS pour le domaine racine de la forêt Active Directory. Pour en savoir plus sur le choix d'un nom, consultez la page Conventions d'attribution de noms Microsoft.

Déployer un réseau partagé

Dans cette section, vous allez créer un projet et l'utiliser pour déployer un réseau VPC partagé. Vous utiliserez ensuite ce réseau pour déployer les contrôleurs de domaine Active Directory.

Créer un projet

Vous allez maintenant créer un projet et l'utiliser pour déployer un réseau VPC partagé.

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Activer les API Compute Engine and Cloud DNS.

    Activer les API

Pour obtenir les autorisations nécessaires pour déployer un réseau partagé, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet ou le dossier parent :

Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Supprimer le VPC par défaut

Par défaut, Compute Engine crée un réseau par défaut dans chaque nouveau projet que vous créez. Ce réseau est configuré en mode automatique, ce qui signifie qu'un sous-réseau est préalloué pour chaque région et automatiquement affecté à une plage CIDR.

Dans cette section, vous allez remplacer ce réseau VPC par un réseau en mode personnalisé contenant deux sous-réseaux et utilisant des plages CIDR personnalisées.

  1. Dans la console Google Cloud, ouvrez Cloud Shell.

    Activer Cloud Shell

  2. Lancez PowerShell :

    pwsh
    
  3. Configurez la CLI gcloud pour utiliser le nouveau projet:

    gcloud config set project PROJECT_ID
    

    Remplacez PROJECT_ID par l'ID de votre projet.

  4. Supprimez toutes les règles de pare-feu associées au VPC par défaut:

    $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. Supprimez le VPC par défaut :

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

Créer un réseau VPC en mode personnalisé

Vous allez maintenant créer un réseau VPC en mode personnalisé dans votre projet hôte VPC.

  1. Dans PowerShell, initialisez les variables suivantes:

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

    Remplacez les éléments suivants :

    • VPC_NAME: nom du VPC.
    • REGION : la région dans laquelle déployer les contrôleurs de domaine Active Directory.
    • DC_CIDR: plage de sous-réseau à utiliser pour le sous-réseau des contrôleurs de domaine.
    • RESOURCES_CIDR : plage de sous-réseau à utiliser pour le sous-réseau de ressources.

    Exemple :

    $VpcName = "ad"
    $Region = "us-central1"
    $SubnetRangeDomainControllers = "10.0.0.0/28"
    $SubnetRangeResources = "10.0.1.0/24"
    
  2. Créez le VPC et configurez-le pour qu'il soit utilisé en tant que réseau VPC partagé:

    $ProjectId = gcloud config get-value core/project
    & gcloud compute networks create $VpcName --subnet-mode custom
    & gcloud compute shared-vpc enable $ProjectId
    
  3. Créez les sous-réseaux et activez l'accès privé à Google afin que Windows puisse l'activer sans accès à 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
    

Déployer des sous-réseaux et des règles de pare-feu

Vous allez maintenant créer des règles de pare-feu afin d'autoriser la communication Active Directory au sein du VPC.

  1. Autorisez les connexions RDP à toutes les instances de VM via le transfert TCP Cloud IAP:

    & 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. Autoriser les requêtes DNS depuis Cloud DNS vers les contrôleurs de domaine.

    & 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
    

    Cette règle de pare-feu est nécessaire au bon fonctionnement de la zone de transfert DNS privée.

  3. Autorisez la réplication Active Directory entre les contrôleurs de domaine:

    & 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. Autorisez les ouvertures de session Active Directory à partir des VM situées dans le sous-réseau de ressources vers les contrôleurs de domaine:

    & 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. Si vous prévoyez de configurer le protocole LDAP sécurisé, autorisez les connexions LDAP sécurisées à partir des VM situées dans le sous-réseau de ressources vers les contrôleurs de domaine:

    & 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
    

    Vous n'avez besoin de cette règle de pare-feu que si vous prévoyez de configurer le protocole LDAP sécurisé.

  6. (Facultatif) Créez une règle de pare-feu qui consigne toutes les tentatives d'accès ayant échoué. Les journaux peuvent être utiles pour diagnostiquer les problèmes de connectivité, mais ils peuvent produire un volume de données de journal important.

    & 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
    

Déployer la forêt Active Directory

Dans cette section, vous allez créer un projet de service et l'associer au projet hôte de VPC partagé que vous avez créé précédemment. Vous utiliserez ensuite le projet de service pour déployer une nouvelle forêt Active Directory avec deux contrôleurs de domaine.

Créer un projet

Vous allez maintenant créer un projet et l'utiliser pour déployer les VM du contrôleur de domaine Active Directory.

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  3. Activer les API Compute Engine and Secret Manager.

    Activer les API

Pour obtenir les autorisations nécessaires pour déployer la forêt Active Directory, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet :

Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Préparer la configuration

L'étape suivante consiste à préparer la configuration pour le déploiement Active Directory.

  1. Si vous avez précédemment fermé la session PowerShell, ouvrez Cloud Shell.

    Activer Cloud Shell

  2. Lancez PowerShell :

    pwsh
    
  3. Configurez la CLI gcloud pour utiliser le nouveau projet:

    gcloud config set project DC_PROJECT_ID
    

    Remplacez DC_PROJECT_ID par l'ID de votre projet.

  4. Utilisez PowerShell pour créer les variables suivantes:

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

    Remplacez les éléments suivants :

    • DNS_DOMAIN: nom de domaine racine de la forêt Active Directory, par exemple cloud.example.com.
    • NETBIOS_DOMAIN: nom de domaine NetBIOS du domaine racine de la forêt, par exemple CLOUD.
    • VPCHOST_PROJECT_ID: ID de projet du projet hôte VPC que vous avez créé précédemment.
    • VPC_NAME: nom du réseau VPC partagé que vous avez créé précédemment.
    • REGION: région dans laquelle déployer les contrôleurs de domaine Active Directory. Notez que les noms des zones sont basés sur les noms de la région que vous spécifiez. Vous pouvez étendre le VPC et votre domaine pour couvrir des régions supplémentaires à tout moment.

    Exemple :

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

Créer une zone de transfert DNS privée

Vous réservez maintenant deux adresses IP statiques pour vos contrôleurs de domaine et créez une zone de transfert DNS privée qui transfère toutes les requêtes DNS du domaine Active Directory vers ces adresses IP.

  1. Associez le projet au réseau VPC partagé:

    $ProjectId = gcloud config get-value core/project
    & gcloud compute shared-vpc associated-projects add $ProjectId --host-project $VpcProjectId
    
  2. Réservez deux adresses IP internes statiques dans le sous-réseau des contrôleurs de domaine:

    $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. Créez une zone de transfert privée Cloud DNS dans le projet hôte VPC et configurez-la pour transférer les requêtes DNS vers les deux adresses IP réservées:

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

Créer un mot de passe DSRM

Définissez maintenant le mot de passe du mode de restauration du service d'annuaire (DSRM) et stockez-le dans Secret Manager. Accordez ensuite aux VM du contrôleur de domaine un accès temporaire à ce secret afin qu'elles puissent l'utiliser pour déployer la forêt Active Directory.

  1. Générez un mot de passe aléatoire et stockez-le dans un secret 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. Créez le compte de service pour les instances de VM du contrôleur de domaine:

    $DcServiceAccount = gcloud iam service-accounts create ad-domaincontroller `
      --display-name "AD Domain Controller" `
      --format "value(email)"
    
  3. Accordez au compte de service l'autorisation de lire le secret pour l'heure suivante:

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

Déployer des contrôleurs de domaine

Vous allez maintenant déployer deux instances de VM et créer une forêt et un domaine Active Directory. Pour réduire le nombre d'étapes manuelles, utilisez des scripts de démarrage.

  1. Dans PowerShell, exécutez la commande suivante pour générer un script de démarrage:

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

    Le script a les effets suivants :

    • Lisez le mot de passe DSRM depuis Secret Manager.
    • Convertissez la VM en contrôleur de domaine.
    • Configurez les paramètres DNS afin que chaque contrôleur de domaine utilise l'adresse de rebouclage en tant que serveur DNS.
    • Désactivez IPv6.
    • Activez la protection LSA.
  2. Créez une instance de VM pour le premier contrôleur de domaine:

    $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
    

    Cette commande effectue les opérations suivantes :

    • Créez une VM Windows Server 2022 protégée.
    • Attribuez le compte de service ad-domaincontroller à la VM pour qu'elle puisse accéder au mot de passe DSRM.
    • Configurez l'agent invité pour désactiver le gestionnaire de comptes. Pour en savoir plus sur la configuration de l'agent invité, consultez la page Activer et désactiver les fonctionnalités d'instance Windows.
    • Laissez la VM installer les fonctionnalités Windows AD-Domain-Services et DNS pendant la phase de spécialisation sysprep.
    • Laissez la VM exécuter le script de démarrage que vous avez créé précédemment.
  3. Créez une autre instance de VM pour le deuxième contrôleur de domaine et placez-la dans une zone différente:

    & 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. Surveillez le processus d'initialisation du premier contrôleur de domaine en affichant sa sortie du port série:

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

    Attendez environ 10 minutes jusqu'à ce que le message Restarting to apply all settings... s'affiche, puis appuyez sur Ctrl+C.

  5. Surveillez le processus d'initialisation du deuxième contrôleur de domaine en affichant sa sortie du port série:

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

    Attendez environ 10 minutes jusqu'à ce que le message Restarting to apply all settings... s'affiche, puis appuyez sur Ctrl+C.

La forêt et le domaine Active Directory sont maintenant prêts à être utilisés.

Se connecter à un contrôleur de domaine

Vous pouvez maintenant personnaliser la forêt Active Directory en vous connectant à l'un des contrôleurs de domaine.

  1. Dans PowerShell, accédez au mot de passe de l'utilisateur Administrator:

    gcloud secrets versions access latest --secret ad-password
    
  2. Connectez-vous en utilisant dc-1 à l'aide de RDP, puis connectez-vous en tant qu'utilisateur Administrator.

    Comme l'instance de VM ne possède pas d'adresse IP publique, vous devez vous connecter via le transfert TCP Identity-Aware Proxy.

Étapes suivantes