Déployer Active Directory Federation Services

Ce guide explique comment déployer Microsoft Active Directory Federation Services (AD FS) pour Windows Server 2019 dans un domaine Microsoft AD géré.

Le schéma suivant illustre le déploiement :

Architecture

Les utilisateurs communiquent avec un équilibreur de charge HTTPS qui utilise un certificat géré par Google pour mettre fin aux connexions SSL. L'équilibreur de charge transfère les connexions à une instance de VM qui exécute Microsoft AD FS pour Windows Server 2019 et qui est associée à un domaine Microsoft AD géré. La communication entre l'équilibreur de charge et l'instance de VM est sécurisée à l'aide d'un certificat SSL autosigné.

Le déploiement utilise une seule instance AD FS et la base de données interne Windows, ce qui la rend adaptée aux petits environnements. Pour les environnements présentant des exigences de fiabilité ou de sécurité accrues, envisagez de déployer plusieurs instances AD FS dans une configuration de ferme et de déployer des proxys de fédération.

Avant de commencer

Pour suivre ce guide, vous aurez besoin des éléments suivants :

Assurez-vous de bien connaître les exigences relatives au déploiement d'AD FS.

Préparer le projet et le réseau

Vous allez maintenant préparer votre projet Google Cloud et votre VPC pour le déploiement d'AD FS.

Créez une instance de VM

Créez un compte de service et une instance de VM pour exécuter AD FS :

  1. Dans Cloud Console, ouvrez Cloud Shell.

    Activer Cloud Shell

  2. Initialisez les variables suivantes :

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    Où :

    • VPC_NAME est le nom de votre VPC.
    • SUBNET_NAME est le nom du sous-réseau dans lequel déployer AD FS.
  3. Définissez votre ID de projet par défaut :

    gcloud config set project PROJECT_ID
    

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud.

  4. Définissez votre région et votre zone par défaut :

    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
    

    Où :

    • REGION est l'ID de la région dans laquelle vous souhaitez effectuer le déploiement.
    • ZONE est l'ID de la zone dans laquelle vous souhaitez effectuer le déploiement.
  5. Créez un compte de service :

    gcloud iam service-accounts create ad-federation-services
    
  6. Créez une instance de VM qui exécute Windows Server 2019 et utilise un script de spécialisation pour installer automatiquement le rôle serveur AD FS:

    gcloud compute instances create adfs-1 \
      --machine-type n2-standard-8 \
      --image-family windows-2019 \
      --image-project windows-cloud \
      --boot-disk-size 50 \
      --boot-disk-type pd-ssd \
      --subnet $SUBNET_NAME \
      --service-account ad-federation-services@$(gcloud config get-value core/project).iam.gserviceaccount.com \
      --metadata sysprep-specialize-script-ps1="Add-WindowsFeature ADFS-Federation -IncludeManagementTools;Add-WindowsFeature RSAT-AD-PowerShell;Add-WindowsFeature RSAT-ADDS-Tools"
    
    1. Surveillez le processus d'initialisation de la VM en consultant la sortie de son port série :

      gcloud compute instances tail-serial-port-output adfs-1
      

      Attendez environ trois minutes avant que la sortie Instance setup finished s'affiche, puis appuyez sur Ctrl+C. À ce stade, l'instance de VM est prête à être utilisée.

    2. Créez un nom d'utilisateur et un mot de passe pour l'instance de VM.

    3. Connectez-vous à la VM à l'aide du Bureau à distance en vous servant du nom d'utilisateur et du mot de passe créés à l'étape précédente.

    4. Effectuez un clic droit sur le bouton Start (Démarrer) (ou appuyez sur Win+X), puis cliquez sur Windows PowerShell (Admin).

    5. Confirmez l'invite d'élévation en cliquant sur Yes (Oui).

    6. Rattachez l'ordinateur au domaine Active Directory, puis redémarrez-le :

      Add-Computer -Domain DOMAIN -Restart
      

      Remplacez DOMAIN par le nom DNS du domaine Active Directory.

      Attendez environ une minute la fin du redémarrage.

Créer un équilibreur de charge

Vous allez maintenant créer un équilibreur de charge qui permet aux utilisateurs d'accéder à AD FS à l'aide d'une seule adresse IP virtuelle.

Pour associer l'instance de VM qui exécute AD FS à l'équilibreur de charge, commencez par créer un groupe d'instances non géré, puis attribuez-le à l'équilibreur de charge :

  1. Revenez à la session Cloud Shell que vous avez précédemment ouverte.
  2. Créez le groupe d'instances non géré :

    gcloud compute instance-groups unmanaged create adfs &&
    gcloud compute instance-groups set-named-ports adfs --named-ports=http:443
    
  3. Ajoutez l'instance de VM existante au groupe d'instances :

    gcloud compute instance-groups unmanaged add-instances adfs --instances adfs-1
    
  4. Créez une vérification d'état qui teste le port HTTPS d'AD FS :

    gcloud compute health-checks create tcp adfs-health-check --port 443
    
  5. Créez un service backend d'équilibreur de charge qui utilise la vérification d'état HTTP et le groupe d'instances géré que vous avez créé précédemment :

    gcloud compute backend-services create adfs-backend \
      --health-checks adfs-health-check \
      --port-name http \
      --protocol HTTPS \
      --global && \
    gcloud compute backend-services add-backend adfs-backend \
      --instance-group adfs \
      --global \
      --instance-group-zone $(gcloud config get-value compute/zone)
    
  6. Réservez une adresse IP externe statique pour l'équilibreur de charge :

    gcloud compute addresses create adfs-external --global
    
  7. Créez un certificat SSL géré pour l'équilibreur de charge :

    gcloud compute ssl-certificates create adfs-external \
      --domains PUBLIC_FQDN \
      --global
    

    PUBLIC_FQDN est le nom de domaine public complet que vous souhaitez utiliser pour AD FS, par exemple login.example.com.

  8. Créez une interface d'équilibrage de charge qui utilise l'adresse IP externe et transfère le trafic vers le service de backend :

    gcloud compute url-maps create adfs \
      --default-service adfs-backend && \
    gcloud compute target-https-proxies create adfs-proxy \
      --ssl-certificates adfs-external \
      --url-map adfs && \
    gcloud compute forwarding-rules create adfs \
      --global \
      --address adfs-external \
      --target-https-proxy adfs-proxy \
      --ports 443
    
  9. Créez une règle de pare-feu pour autoriser le trafic de l'équilibreur de charge vers l'instance de VM qui exécute AD FS :

    gcloud compute firewall-rules create allow-https-to-adfs \
      --allow tcp:443 \
      --network $VPC_NAME \
      --source-ranges 130.211.0.0/22,35.191.0.0/16 \
      --target-service-accounts ad-federation-services@$(gcloud config get-value core/project).iam.gserviceaccount.com
    

    Les plages sources sont les plages d'adresses IP de l'équilibreur de charge interne. Pour en savoir plus, consultez la page Configurer une règle de pare-feu.

  10. Recherchez l'adresse IP de l'équilibreur de charge :

    gcloud compute addresses describe adfs-external \
       --global \
       --format=value\(address\)
    
  11. Créez un enregistrement DNS A dans votre zone DNS publique qui pointe vers l'adresse IP de l'équilibreur de charge. Le nom complet de l'enregistrement DNS doit correspondre à celui que vous avez utilisé pour le certificat SSL.

Déployer AD FS

Vous allez maintenant déployer le rôle de serveur AD FS sur l'instance de VM adfs-1. Comme vous ne disposez pas des droits d'administrateur de domaine dans un domaine Microsoft AD géré, vous ne pouvez pas utiliser Server Manager pour effectuer l'installation. Vous devez plutôt utiliser PowerShell.

Créer un utilisateur du service

Vous allez maintenant créer un compte utilisateur dans Active Directory pour le service AD FS :

  1. Connectez-vous à l'instance de VM adfs-1 à l'aide du Bureau à distance, en utilisant vos identifiants d'administrateur délégué.
  2. Effectuez un clic droit sur le bouton Start (Démarrer) (ou appuyez sur Win+X) et cliquez sur Windows PowerShell (Admin).
  3. Définissez un mot de passe aléatoire pour le compte de service AD FS:

    $AdfsCredential = Get-Credential -UserName adfssvc -Message 'Enter password'
    
  4. Créez un utilisateur Active Directory adfssvc :

    $CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName
    $AdfsUser = New-ADuser `
      -Name adfssvc `
      -DisplayName 'AD FS service account' `
      -AccountPassword $AdfsCredential.Password `
      -Path "$CloudOuPath" `
      -PasswordNeverExpires $True `
      -PassThru | Enable-ADAccount -PassThru
    
  5. Ajoutez l'utilisateur au groupe Administrateurs local :

    Add-LocalGroupMember `
     -Group "Administrators" `
     -Member "$env:userdomain\adfssvc"
    
  6. Attribuez un nom au compte principal du service :

    setspn -a http/PUBLIC_FQDN adfssvc
    

    PUBLIC_FQDN est le nom de domaine complet et public d'AD FS.

  7. Créer un conteneur vide dans Active Directory Vous utiliserez ce conteneur ultérieurement lorsque vous installerez AD FS :

    New-ADObject `
      -Type Container `
      -Name "ADFS Data" `
      -Path $CloudOuPath
    
  8. Accordez à l'utilisateur AD FS un contrôle total sur le conteneur :

    dsacls.exe "CN=ADFS Data,$CloudOuPath" /G $env:userdomain\adfssvc:GA /I:T
    

Installer AD FS

Vous allez maintenant installer AD FS sur adfs-1 :

  1. Démarrez une session PowerShell en tant qu'utilisateur ADFS :

    runas /u:$env:userdomain\adfssvc powershell
    

    La nouvelle session PowerShell s'exécute désormais en tant qu'utilisateur AD FS, mais sans privilèges élevés.

  2. Dans la nouvelle session PowerShell, démarrez une deuxième session PowerShell avec élévation de privilèges :

    Start-Process PowerShell -Verb RunAs
    

    Vous devez exécuter toutes les étapes suivantes dans cette nouvelle session PowerShell avec élévation de privilèges.

  3. Créez un certificat SSL autosigné qui utilise une clé RSA de 2 048 bits et stockez-le dans le magasin de certificats de l'ordinateur :

    $DnsName="PUBLIC_FQDN"
    $Certificate = New-SelfSignedCertificate `
      -Subject $DnsName `
      -KeyAlgorithm RSA `
      -KeyLength 2048 `
      -KeyExportPolicy NonExportable `
      -KeyUsage DigitalSignature, KeyEncipherment `
      -Provider 'Microsoft Platform Crypto Provider' `
      -NotAfter (Get-Date).AddDays(365) `
      -Type SSLServerAuthentication `
      -CertStoreLocation 'Cert:\LocalMachine\My' `
      -DnsName $DnsName
    

    PUBLIC_FQDN est le nom de domaine complet et public d'AD FS.

  4. Créez un autre certificat RSA 2 048 bits qu'AD FS utilise comme certificat de signature de jetons :

    $SigningCertificate = New-SelfSignedCertificate `
      -Subject "ADFS Signing" `
      -KeyAlgorithm RSA `
      -KeyLength 2048 `
      -KeyExportPolicy NonExportable `
      -KeyUsage DigitalSignature, KeyEncipherment `
      -Provider 'Microsoft RSA SChannel Cryptographic Provider' `
      -NotAfter (Get-Date).AddDays(365) `
      -DnsName $DnsName `
      -CertStoreLocation 'Cert:\LocalMachine\My'
    
  5. Créez un conteneur de gestionnaire de clés distribué (DKM) :

    $CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName
    $DkmContainer = New-ADObject `
      -Name ((New-Guid).Guid) `
      -Type Container `
      -Path "CN=ADFS Data,$CloudOuPath" `
      -PassThru
    
  6. Saisissez à nouveau les identifiants de l'utilisateur AD FS que vous avez définis précédemment :

    $AdfsCredential = Get-Credential -UserName "$env:userdomain\adfssvc" -Message 'Enter password'
    
  7. Installez AD FS à l'aide des certificats et du conteneur DKM que vous avez créés précédemment :

    Install-ADFSFarm `
      -CertificateThumbprint $Certificate.Thumbprint `
      -SigningCertificateThumbprint $SigningCertificate.Thumbprint `
      -DecryptionCertificateThumbprint $SigningCertificate.Thumbprint `
      -FederationServiceName $DnsName `
      -ServiceAccountCredential $AdfsCredential `
      -OverwriteConfiguration `
      -AdminConfiguration @{"DKMContainerDn"=$DkmContainer.DistinguishedName}
    

    La commande peut afficher les messages d'avertissement suivants:

    WARNING: A machine restart is required to complete ADFS service configuration. For more information, see:
    https://go.microsoft.com/fwlink/?LinkId=798725
    
    WARNING: The SSL certificate subject alternative names do not support host name 'PUBLIC_FQDN'.
    Configuring certificate authentication binding on port '49443' and hostname 'PUBLIC_FQDN'.
    
    WARNING: An error occurred during an attempt to set the SPN for the specified service account. Set the SPN for the
    service account manually.  For more information about setting the SPN of the service account manually, see the AD FS
    Deployment Guide.  Error message: An error occurred during an attempt to set the SPN for the specified service account.
    You do not have sufficient privileges in the domain to set the SPN.
    
    WARNING: The SSL certificate does not contain all UPN suffix values that exist in the enterprise.  Users with UPN
    suffix values not represented in the certificate will not be able to Workplace-Join their devices.  For more
    information, see http://go.microsoft.com/fwlink/?LinkId=311954.
    

    Vous pouvez ignorer ces avertissements, car vous avez déjà défini le SPN et l'authentification à l'aide de l'authentification basée sur des certificats.

  8. Si vous prévoyez d'utiliser l'authentification Windows intégrée (IWA) pour vous authentifier auprès d'AD FS, exécutez la commande suivante pour désactiver la liaison de jeton:

    Set-ADFSProperties –ExtendedProtectionTokenCheck None
    Restart-Service -Name adfssrv
    

    La désactivation d'une liaison de jeton est nécessaire, car vous déployez AD FS derrière un équilibreur de charge et celui-ci met fin aux connexions TLS.

Configurer TLS

Lorsque vous établissez des connexions aux backends, l'équilibreur de charge HTTPS n'utilise pas l'extension SNI (Server Name indication). Pour permettre à AD FS d'accepter une connexion sans SNI, vous devez configurer une solution de remplacement de certificat :

  1. Dans PowerShell, affichez les liaisons de certificats du serveur SSL pour AD FS :

    netsh http show sslcert hostnameport=PUBLIC_FQDN:443
    

    PUBLIC_FQDN est le nom de domaine public complet de AD FS.

  2. Configurez un certificat de remplacement pour la liaison :

    netsh http add sslcert ipport=0.0.0.0:443 certhash=CERTIFICATE_HASH "appid=APP_ID" "certstorename=MY"
    

    Où :

    • CERTIFICATE_HASH correspond au hachage de certificat affiché dans la commande précédente.
    • APP_ID est l'ID application affiché dans la commande précédente, y compris les accolades.
  3. Redémarrez l'ordinateur pour terminer l'installation :

    Restart-Computer
    

    Attendez environ une minute la fin du redémarrage.

Tester AD FS

Le service AD FS est maintenant déployé, mais vous devez encore vérifier que le service est accessible via l'équilibreur de charge HTTPS :

  1. Revenez à la session Cloud Shell.
  2. Vérifiez que le certificat SSL est à l'état ACTIVE :

    gcloud compute ssl-certificates describe adfs-external \
        --global \
        --format="get(managed.status)"
    

    Si l'état du certificat est PROVISIONING, la propagation de l'enregistrement DNS que vous avez créé pour AD FS peut prendre un certain temps. Pour en savoir plus, consultez la section Résoudre les problèmes liés aux certificats gérés par Google.

  3. Sur votre ordinateur local, ouvrez un navigateur et accédez à l'URL suivante:

    https://PUBLIC_FQDN/adfs/ls?wa=wsignout1.0
    

    Remplacez PUBLIC_FQDN par le nom de domaine public complet de AD FS.

    Vérifiez que le message Vous êtes bien déconnecté s'affiche, indiquant que AD FS a bien été déployé.

Si vous prévoyez d'utiliser l'authentification Windows intégrée (IWA), vérifiez que vous pouvez obtenir un ticket Kerberos pour AD FS:

  1. Connectez-vous à l'instance de VM adfs-1 ou à une autre VM associée au domaine à l'aide du Bureau à distance, puis connectez-vous à l'aide des identifiants du domaine.
  2. Effectuez un clic droit sur le bouton Start (Démarrer) (ou appuyez sur Win+X) et cliquez sur Windows PowerShell.
  3. Utilisez la commande klist pour demander un ticket de service pour AD FS:

    klist get http/PUBLIC_FQDN
    

    Vérifiez que la sortie contient un ticket pour AD FS:

    #1>     Client: USER @ DOMAIN
            Server: http/PUBLIC_FQDN @ DOMAIN
            KerbTicket Encryption Type: ...
    

AD FS est maintenant prêt à être utilisé. Pour en savoir plus sur l'utilisation et la configuration du service, consultez la page Opérations AD FS.