Implementa AD FS en un dominio de Microsoft AD administrado

En esta guía, se describe cómo implementar Microsoft Active Directory Federation Services (AD FS) para Windows Server 2019 en un dominio del servicio administrado para Microsoft Active Directory.

En el siguiente diagrama, se muestra la implementación:

Arquitectura

Los usuarios se comunican con un balanceador de cargas de HTTPS que usa un certificado administrado por Google para finalizar las conexiones SSL. El balanceador de cargas reenvía las conexiones a una instancia de VM que ejecuta Microsoft AD FS para Windows Server 2019 y que está unida al dominio de Microsoft AD administrado. La comunicación entre el balanceador de cargas y la instancia de VM se protege con 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. Para entornos con mayor confiabilidad o demandas de seguridad, considera implementar varias instancias de AD FS en una configuración de granja y, luego, implementar proxies de federación.

Antes de comenzar

Prepara el proyecto y la red

Debes preparar tu proyecto de Google Cloud y la red de VPC para la implementación de AD FS.

Crea una instancia de VM

sigue estos pasos para crear una cuenta de servicio y una instancia de VM para ejecutar AD FS:

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

    Activa Cloud Shell

  2. Establece tu ID del proyecto predeterminado:

    gcloud config set project PROJECT_ID
    

    Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

  3. Establece tu región y zona predeterminadas:

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

    Reemplaza lo siguiente:

    • REGION: Es el ID de la región en la que deseas realizar la implementación.
    • ZONE: El ID de la zona en la que deseas implementar.
  4. Crear una cuenta de servicio:

    gcloud iam service-accounts create SA_NAME
    

    Reemplaza SA_NAME por el nombre de la cuenta de servicio.

  5. Crea una instancia de VM que ejecute Windows Server 2019 y use una secuencia de comandos de specialize para instalar la función de servidor de AD FS de forma automática:

    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"
    

    Reemplaza lo siguiente:

    • VM_NAME: El nombre de la instancia de VM
    • SUBNET_NAME: Es el nombre de la subred en la que se implementará AD FS.
    • SA_NAME: el nombre de la cuenta de servicio.

    Para configurar la instancia de la VM y unirla a tu dominio de Active Directory, completa los siguientes pasos:

    1. Supervisa el proceso de inicialización de la VM cuando ves su salida de puerto en serie:

      gcloud compute instances tail-serial-port-output VM_NAME
      

      Espera unos 3 minutos hasta que veas el resultado Instance setup finished y presiona Ctrl + C. En este punto, la instancia de VM está lista para usarse.

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

    3. Conéctate a la VM mediante el escritorio remoto y accede con el nombre de usuario y la contraseña que creaste en el paso anterior.

    4. Haz clic con el botón derecho en el botón Iniciar (o presiona Windows+X) y, luego, en Windows PowerShell (Admin).

    5. Para confirmar el símbolo de elevación, haz clic en .

    6. Une la computadora a tu dominio de Active Directory y reiníciala:

      Add-Computer -Domain DOMAIN -Restart
      

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

      Espera aproximadamente 1 minuto para que se complete el reinicio.

Crea un balanceador de cargas

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

Para asociar la instancia de VM que ejecuta AD FS con el balanceador de cargas, primero debes crear un grupo de instancias no administrado y, luego, asigna el grupo a este balanceador de carga:

  1. Regresa a tu sesión actual de Cloud Shell.
  2. Crea el grupo de instancias no administrado:

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

    Reemplaza INSTANCE_GROUP_NAME por el nombre del grupo que deseas crear.

  3. Agrega la instancia de VM existente al grupo de instancias:

    gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances VM_NAME
    
  4. Crea una verificación de estado que realice un sondeo del puerto HTTPS de AD FS:

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

    Reemplaza HEALTH_CHECK_NAME por un nombre para la verificación de estado.

  5. Crea un servicio de backend para el balanceador de cargas que use la verificación de estado HTTPS y el grupo de instancias que creaste antes:

    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)
    

    Reemplaza BACKEND_SERVICE_NAME por un nombre para el servicio de backend.

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

    gcloud compute addresses create ADDRESS_NAME --global
    

    Reemplaza ADDRESS_NAME por el nombre que deseas asociar con esta dirección.

  7. Crea un certificado SSL administrado para el balanceador de cargas:

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

    Reemplaza lo siguiente:

    • CERTIFICATE_NAME: Es el nombre del certificado SSL administrado.
    • PUBLIC_FQDN: El nombre de dominio público y completamente calificado (FQDN) que deseas usar para AD FS. Por ejemplo, login.example.com
  8. Crea un frontend para el balanceador de cargas 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
    

    Reemplaza lo siguiente:

    • URL_MAP_NAME: Es el nombre del mapa de URL del balanceador de cargas.
    • PROXY_NAME: Es el nombre del proxy de destino del balanceador de cargas.
    • FORWARDING_RULE_NAME: Es el nombre de la regla de reenvío del balanceador de cargas.
  9. Crea una regla de firewall para permitir el tráfico del balanceador de cargas 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
    

    Reemplaza lo siguiente:

    • FIREWALL_RULE_NAME: Es el nombre de la regla de firewall.
    • VPC_NAME: Es el nombre de tu red de VPC.
    • SA_NAME: el nombre de la cuenta de servicio.

    Los rangos de origen son los rangos de IP para el balanceador de cargas interno. Para obtener más información, consulta Configura una regla de firewall.

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

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

Implementa AD FS

Debes implementar el rol de servidor de AD FS en la instancia de VM. Debido a que no tienes derechos de Domain Admins en un dominio de Microsoft AD administrado, no puedes usar el Administrador de servidores para realizar la instalación y, en su lugar, debes usar PowerShell.

Crea un usuario de servicio

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

  1. Conéctate a la instancia de VM mediante el escritorio remoto y accede con tus credenciales de administrador delegadas.
  2. Haz clic con el botón derecho en el botón Iniciar (o presiona Windows+X) y, luego, en Windows PowerShell (Admin).
  3. Establece una contraseña aleatoria para la cuenta de servicio de AD FS:

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

    Reemplaza lo siguiente:

    • USER: Es el 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. Agrega el usuario al grupo de administradores locales:

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

    setspn -a http/PUBLIC_FQDN USER
    

    Reemplaza PUBLIC_FQDN por el nombre de dominio público y completamente calificado de AD FS.

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

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

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

Instala AD FS

Puedes instalar AD FS en la instancia de VM:

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

    runas /u:$env:userdomain\USER powershell
    

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

  2. En la nueva sesión de PowerShell, inicia una segunda sesión elevada de PowerShell:

    Start-Process PowerShell -Verb RunAs
    

    Debes ejecutar todos los pasos posteriores en esta sesión nueva 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 de computadora:

    $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
    

    Reemplaza PUBLIC_FQDN por el nombre de dominio público y completamente calificado de AD FS.

  4. Crea otro certificado RSA de 2048 bits que use AD FS como certificado de firma de token:

    $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 ingresar las credenciales para el usuario de AD FS que configuraste antes:

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

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

    Es posible que el comando muestre 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.
    

    Puedes ignorar estas advertencias porque ya configuraste el SPN y no usas la autenticación basada en certificados.

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

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

    Inhabilitar la vinculación de tokens es necesario porque estás implementando AD FS detrás de un balanceador de cargas y este finaliza las conexiones TLS.

Si tienes algún problema relacionado con los permisos con estos pasos, comunícate con el equipo de asistencia de Google Cloud.

Configura TLS

Cuando se establecen conexiones con backends, el balanceador de cargas de HTTPS no usa la extensión de indicación de nombre del servidor (SNI). Para permitir que AD FS acepte la conexión sin SNI, debes configurar un resguardo de certificado:

  1. En PowerShell, observa las vinculaciones de certificados del servidor SSL para AD FS:

    netsh http show sslcert hostnameport=PUBLIC_FQDN:443
    

    Reemplaza PUBLIC_FQDN por el nombre de dominio público y completamente calificado de AD FS.

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

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

    Reemplaza lo siguiente:

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

    Restart-Computer
    

    Espera aproximadamente 1 minuto para que se complete el reinicio.

Prueba AD FS

El servicio de AD FS está implementado, pero aún debes verificar que se pueda acceder al servicio con el balanceador de cargas de HTTPS:

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

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

    Si el certificado está en el estado PROVISIONING, el registro DNS que creaste para AD FS puede requerir tiempo adicional para propagarse. Para obtener más detalles, consulta Soluciona problemas de certificados administrados por Google.

  3. En tu computadora local, abre un navegador y navega a la siguiente URL:

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

    Reemplaza PUBLIC_FQDN por el nombre de dominio público y completamente calificado de AD FS.

    Verifica que veas el mensaje You have successfully signed out, lo que indica que AD FS se implementó de forma correcta.

Si planeas usar la autenticación integrada de Windows (IWA), verifica que puedas obtener un ticket de Kerberos para AD FS:

  1. Conéctate a la instancia de VM o a una VM diferente que se unió al dominio mediante el escritorio remoto y accede con las credenciales del dominio.
  2. Haz clic con el botón derecho en el botón Iniciar (o presiona Windows+X) y, luego, en Windows PowerShell.
  3. Usa el comando klist para solicitar un ticket de servicio para 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 está listo para usarse. Para obtener detalles sobre cómo usar y configurar el servicio, consulta Operaciones de AD FS.