Implementar AD FS en un dominio de Microsoft AD gestionado

En esta guía se describe cómo puedes implementar Servicios de federación de Active Directory (AD FS) de Microsoft para Windows Server 2019 en un dominio de Servicio gestionado para Microsoft Active Directory.

En el siguiente diagrama se muestra la implementación:

Arquitectura

Los usuarios se comunican con un balanceador de carga HTTPS que usa un certificado gestionado por Google para finalizar las conexiones SSL. El balanceador de carga reenvía las conexiones a una instancia de VM que ejecuta Microsoft AD FS para Windows Server 2019 y que se ha unido al dominio de Microsoft AD gestionado. La comunicación entre el balanceador de carga y la instancia de VM se protege mediante un certificado SSL autofirmado.

La implementación usa una sola instancia de AD FS y la base de datos interna de Windows, por lo que es adecuada para entornos pequeños. En entornos con mayores requisitos de fiabilidad o seguridad, considera la posibilidad de implementar varias instancias de AD FS en una configuración de granja y desplegar proxies de federación.

Antes de empezar

Preparar el proyecto y la red

Debes preparar tu Google Cloud proyecto y tu red de VPC para implementar AD FS.

Crea una instancia de VM

Crea una cuenta de servicio y una instancia de VM para ejecutar AD FS:

  1. En la Google Cloud consola, abre Cloud Shell.

    Activar Cloud Shell

  2. Configura tu ID de proyecto predeterminado:

    gcloud config set project PROJECT_ID
    

    Sustituye PROJECT_ID por el ID de tu Google Cloud proyecto.

  3. Define tu región y zona predeterminadas:

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

    Haz los cambios siguientes:

    • REGION: el ID de la región en la que quieres implementar.
    • ZONE: el ID de la zona en la que quieres implementar el servicio.
  4. Crea una cuenta de servicio:

    gcloud iam service-accounts create SA_NAME
    

    Sustituye SA_NAME por el nombre de la cuenta de servicio.

  5. Crea una instancia de VM que ejecute Windows Server 2019 y use un script de especialización para instalar automáticamente el rol de servidor de AD FS:

    gcloud compute instances create VM_NAME \
      --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 SA_NAME@$(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"
    

    Haz los cambios siguientes:

    • VM_NAME: nombre de la instancia de VM.
    • SUBNET_NAME: nombre de la subred en la que se va a implementar AD FS.
    • SA_NAME: nombre de la cuenta de servicio.

    Para configurar la instancia de VM y unirla a tu dominio de Active Directory, sigue estos pasos:

    1. Monitoriza el proceso de inicialización de la VM consultando la salida de su puerto serie:

      gcloud compute instances tail-serial-port-output VM_NAME
      

      Espera unos 3 minutos hasta que veas el resultado Instance setup finished, y, a continuación, pulsa Ctrl+C. En este punto, la instancia de VM ya se puede usar.

    2. Crea un nombre de usuario y una contraseña para la instancia de VM.

    3. Conéctate a la VM mediante Escritorio remoto e inicia sesión con el nombre de usuario y la contraseña que has creado en el paso anterior.

    4. Haz clic con el botón derecho en el botón Inicio (o pulsa Win+X) y, a continuación, en Windows PowerShell (Administrador).

    5. Confirma la solicitud de elevación haciendo clic en .

    6. Une el ordenador a tu dominio de Active Directory y reinícialo:

      Add-Computer -Domain DOMAIN -Restart
      

      Sustituye DOMAIN por el nombre DNS de tu dominio de Active Directory.

      Espera aproximadamente 1 minuto a que se complete el reinicio.

Crear un balanceador de carga

Debes crear un balanceador de carga que permita a los usuarios acceder a AD FS mediante una única dirección IP virtual.

Para asociar la instancia de VM que ejecuta AD FS con el balanceador de carga, primero debes crear un grupo de instancias sin gestionar y, a continuación, asignar este grupo de instancias al balanceador de carga:

  1. Vuelve a tu sesión de Cloud Shell.
  2. Crea el grupo de instancias sin gestionar:

    gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME &&
    gcloud compute instance-groups set-named-ports INSTANCE_GROUP_NAME --named-ports=http:443
    

    Sustituye INSTANCE_GROUP_NAME por el nombre del grupo que quieras crear.

  3. Añade la instancia de VM al grupo de instancias:

    gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances VM_NAME
    
  4. Crea una comprobación del estado que sondee el puerto HTTPS de AD FS:

    gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port 443
    

    Sustituye HEALTH_CHECK_NAME por el nombre de la comprobación del estado.

  5. Crea un servicio de backend de balanceador de carga que utilice la comprobación del estado de HTTPS y el grupo de instancias que has creado anteriormente:

    gcloud compute backend-services create BACKEND_SERVICE_NAME \
      --health-checks HEALTH_CHECK_NAME \
      --port-name http \
      --protocol HTTPS \
      --global && \
    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --instance-group INSTANCE_GROUP_NAME \
      --global \
      --instance-group-zone $(gcloud config get-value compute/zone)
    

    Sustituye BACKEND_SERVICE_NAME por el nombre del servicio de backend.

  6. Reserva una dirección IP externa estática para el balanceador de carga:

    gcloud compute addresses create ADDRESS_NAME --global
    

    Sustituye ADDRESS_NAME por el nombre que quieras asociar a esta dirección.

  7. Crea un certificado SSL gestionado para el balanceador de carga:

    gcloud compute ssl-certificates create CERTIFICATE_NAME \
      --domains PUBLIC_FQDN \
      --global
    

    Haz los cambios siguientes:

    • CERTIFICATE_NAME: nombre del certificado SSL gestionado.
    • PUBLIC_FQDN: Nombre de dominio completo (FQDN) público que quieras usar para AD FS. Por ejemplo, login.example.com.
  8. Crea un frontend de balanceador de carga que use la dirección IP externa y reenvíe el tráfico al servicio de backend:

    gcloud compute url-maps create URL_MAP_NAME \
      --default-service BACKEND_SERVICE_NAME && \
    gcloud compute target-https-proxies create PROXY_NAME \
      --ssl-certificates CERTIFICATE_NAME \
      --url-map URL_MAP_NAME && \
    gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
      --global \
      --address ADDRESS_NAME \
      --target-https-proxy PROXY_NAME \
      --ports 443
    

    Haz los cambios siguientes:

    • URL_MAP_NAME: nombre del mapa de URLs del balanceador de carga.
    • PROXY_NAME: nombre del proxy de destino del balanceador de carga.
    • FORWARDING_RULE_NAME: nombre de la regla de reenvío del balanceador de carga.
  9. Crea una regla de cortafuegos para permitir el tráfico del balanceador de carga a la instancia de VM que ejecuta AD FS:

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

    Haz los cambios siguientes:

    • FIREWALL_RULE_NAME: nombre de la regla de cortafuegos.
    • VPC_NAME: nombre de tu red de VPC.
    • SA_NAME: nombre de la cuenta de servicio.

    Los intervalos de origen son los intervalos de IP del balanceador de carga interno. Para obtener más información, consulta Configurar una regla de cortafuegos.

  10. Busca la dirección IP del balanceador de carga:

    gcloud compute addresses describe ADDRESS_NAME \
       --global \
       --format=value\(address\)
    
  11. Crea un registro A de DNS en tu zona de DNS pública que apunte a la dirección IP del balanceador de carga. El nombre completo del registro DNS debe coincidir con el nombre que hayas usado para el certificado SSL.

Desplegar AD FS

Debes desplegar el rol de servidor AD FS en la instancia de VM. Como no tienes derechos de Domain Admins en un dominio de Microsoft AD gestionado, no puedes usar el Administrador del servidor para realizar la instalación y debes usar PowerShell.

Crear un usuario de servicio

Debes crear una cuenta de usuario en Active Directory para el servicio AD FS:

  1. Conéctate a la instancia de VM mediante Escritorio remoto e inicia sesión con las credenciales de administrador delegado.
  2. Haz clic con el botón derecho en el botón Inicio (o pulsa Win+X) y, a continuación, en Windows PowerShell (Administrador).
  3. Define una contraseña aleatoria para la cuenta de servicio de AD FS:

    $AdfsCredential = Get-Credential -UserName USER -Message 'PASSWORD'
    

    Haz los cambios siguientes:

    • USER: nombre de un usuario de Active Directory.
    • PASSWORD: la contraseña del usuario de Active Directory.
  4. Crea un usuario de Active Directory:

    $CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName
    $AdfsUser = New-ADuser `
      -Name USER `
      -DisplayName 'AD FS service account' `
      -AccountPassword $AdfsCredential.Password `
      -Path "$CloudOuPath" `
      -PasswordNeverExpires $True `
      -PassThru | Enable-ADAccount -PassThru
    
  5. Añade el usuario al grupo Administradores local:

    Add-LocalGroupMember `
     -Group "Administrators" `
     -Member "$env:userdomain\USER"
    
  6. Asigna un nombre principal de servicio:

    setspn -a http/PUBLIC_FQDN USER
    

    Sustituye PUBLIC_FQDN por el nombre de dominio público completo de AD FS.

  7. Crea un contenedor vacío en Active Directory. Necesitarás usar este contenedor más adelante cuando instales AD FS:

    New-ADObject `
      -Type Container `
      -Name "ADFS Data" `
      -Path $CloudOuPath
    
  8. Concede al usuario de AD FS control total sobre el contenedor:

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

Instalar AD FS

Puedes instalar AD FS en la instancia de VM:

  1. Inicia una sesión de PowerShell como usuario de ADFS:

    runas /u:$env:userdomain\USER powershell
    

    La nueva sesión de PowerShell se ejecuta como usuario de AD FS, pero sin privilegios elevados.

  2. En la nueva sesión de PowerShell, inicia una segunda sesión de PowerShell con privilegios elevados:

    Start-Process PowerShell -Verb RunAs
    

    Debes ejecutar todos los pasos posteriores en esta nueva sesión de PowerShell con privilegios elevados.

  3. Crea un certificado SSL autofirmado que use una clave RSA de 2048 bits y almacénalo en el almacén de certificados del ordenador:

    $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
    

    Sustituye PUBLIC_FQDN por el nombre de dominio público completo de AD FS.

  4. Crea otro certificado RSA de 2048 bits que AD FS utilice como certificado de firma de tokens:

    $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. Crea un contenedor de Distributed Key Manager (DKM):

    $CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName
    $DkmContainer = New-ADObject `
      -Name ((New-Guid).Guid) `
      -Type Container `
      -Path "CN=ADFS Data,$CloudOuPath" `
      -PassThru
    
  6. Vuelve a introducir las credenciales del usuario de AD FS que configuraste anteriormente:

    $AdfsCredential = Get-Credential -UserName "$env:userdomain\USER" -Message 'PASSWORD'
    
  7. Instala AD FS con los certificados y el contenedor DKM que has creado anteriormente:

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

    El comando puede mostrar los siguientes mensajes de advertencia:

    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.
    

    Puede ignorar estas advertencias porque ya ha definido el SPN y no está usando la autenticación basada en certificados.

  8. Si tienes previsto usar la autenticación integrada de Windows (IWA) para autenticarte en AD FS, ejecuta el siguiente comando para inhabilitar el enlace de tokens:

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

    Es necesario inhabilitar el enlace de tokens porque vas a implementar AD FS detrás de un balanceador de carga y este finaliza las conexiones TLS.

Si tienes algún problema relacionado con los permisos al seguir estos pasos, ponte en contacto con el Google Cloud equipo de Asistencia.

Configurar TLS

Cuando se establecen conexiones con backends, el balanceador de carga HTTPS no usa la extensión de indicador del nombre de servidor (SNI). Para permitir que AD FS acepte conexiones sin SNI, debes configurar una alternativa de certificado:

  1. En PowerShell, consulta los enlaces de certificados de servidor SSL de AD FS:

    netsh http show sslcert hostnameport=PUBLIC_FQDN:443
    

    Sustituye PUBLIC_FQDN por el nombre de dominio público completo de AD FS.

  2. Configura un certificado de respaldo para la vinculación:

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

    Haz los cambios siguientes:

    • CERTIFICATE_HASH: el hash del certificado que se muestra en el comando anterior.
    • APP_ID: el ID de aplicación que se muestra en el comando anterior, incluidas las llaves.
  3. Reinicia el ordenador para completar la instalación:

    Restart-Computer
    

    Espera aproximadamente 1 minuto a que se complete el reinicio.

Probar AD FS

El servicio AD FS se ha implementado, pero aún tienes que verificar que se puede acceder a él mediante el balanceador de carga HTTPS:

  1. Vuelve a la sesión de Cloud Shell.
  2. Comprueba que el certificado SSL esté en estado ACTIVE:

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

    Si el certificado está en estado PROVISIONING, es posible que el registro DNS que has creado para AD FS necesite más tiempo para propagarse. Para obtener más información, consulta el artículo Solucionar problemas con los certificados gestionados por Google.

  3. En tu ordenador local, abre un navegador y ve a la siguiente URL:

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

    Sustituye PUBLIC_FQDN por el nombre de dominio público completo de AD FS.

    Comprueba que aparece el mensaje You have successfully signed out, que indica que AD FS se ha implementado correctamente.

Si tienes previsto usar la autenticación integrada de Windows (IWA), comprueba que puedes obtener un ticket de Kerberos para AD FS:

  1. Conéctate a la instancia de VM o a otra VM unida al dominio mediante Escritorio remoto e inicia sesión con las credenciales del dominio.
  2. Haz clic con el botón derecho en el botón Inicio (o pulsa Win+X) y, a continuación, en Windows PowerShell.
  3. Usa el comando klist para solicitar un ticket de servicio de AD FS:

    klist get http/PUBLIC_FQDN
    

    Verifica que el resultado incluya un ticket para AD FS:

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

AD FS ya se puede usar. Para obtener información sobre cómo usar y configurar el servicio, consulta Operaciones de AD FS.