Implementa los Servicios de federación de Active Directory

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

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 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 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. Para entornos con mayor confiabilidad o demandas de seguridad, considera implementar varias instancias de AD FS en una configuración de granja y, también, implementar proxies de federación.

Antes de comenzar

Para completar esta guía, necesitas lo siguiente:

Asegúrate de conocer los requisitos para implementar AD FS.

Prepara el proyecto y la red

Ahora prepara tu proyecto de Google Cloud y la VPC para la implementación de AD FS.

Crea una instancia de VM

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

  1. En Cloud Console, abra Cloud Shell.

    Activar Cloud Shell

  2. Inicializa las siguientes variables:

    VPC_NAME=VPC_NAME
    SUBNET_NAME=SUBNET_NAME
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • VPC_NAME es el nombre de tu VPC.
    • SUBNET_NAME es el nombre de la subred en la que se implementará AD FS.
  3. Establece tu ID del proyecto predeterminado:

    gcloud config set project PROJECT_ID
    

    Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

  4. Establece la región y la zona predeterminadas:

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

    Aquí:

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

    gcloud iam service-accounts create ad-federation-services
    
  6. 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 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. Supervisa el proceso de inicialización de la VM cuando ves su salida de puerto en serie:

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

      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 Win+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

Ahora crearás 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, asignar este grupo de instancias al balanceador de cargas:

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

    gcloud compute instance-groups unmanaged create adfs &&
    gcloud compute instance-groups set-named-ports adfs --named-ports=http:443
    
  3. Agrega la instancia de VM existente al grupo de instancias:

    gcloud compute instance-groups unmanaged add-instances adfs --instances adfs-1
    
  4. Crea una verificación de estado que explore el puerto HTTPS de AD FS:

    gcloud compute health-checks create tcp adfs-health-check --port 443
    
  5. Crea un servicio de backend del balanceador de cargas que use la verificación de estado de HTTPS y el grupo de instancias que creaste antes:

    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. Reserva una dirección IP externa estática para el balanceador de cargas:

    gcloud compute addresses create adfs-external --global
    
  7. Crea un certificado SSL administrado para el balanceador de cargas:

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

    en la que DNS_DOMAIN es el nombre de DNS externo que deseas usar para AD FS. Este nombre de dominio puede ser diferente de los nombres de dominio que usa Active Directory.

  8. Crea un frontend de 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 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. 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 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
    

    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 adfs-external \
       --global \
       --format=value\(address\)
    
  11. Crea un registro DNS A en tu zona pública de DNS 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

Ahora implementas la función del servidor de AD FS en la instancia de VM adfs-1. Debido a que no tienes derechos de administrador de dominio en un dominio administrado de Microsoft AD, no puedes usar el administrador de servidores para realizar la instalación y, en su lugar, debes usar PowerShell.

Crea un usuario de servicios

Ahora crearás una cuenta de usuario en Active Directory para el servicio de AD FS:

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

    $AdfsCredential = Get-Credential -UserName adfssvc -Message 'Enter password'
    
  4. Crea un usuario de 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. Agrega al usuario al grupo de administradores locales:

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

    setspn -a http/$env:userdomain adfssvc
    
  7. Crea un contenedor vacío en Active Directory. Usa este contenedor más adelante cuando instales AD FS:

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

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

Instala AD FS

Ahora instalas AD FS en adfs-1:

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

    runas /u:$env:userdomain\adfssvc powershell
    

    La sesión nueva de PowerShell ahora 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 nueva sesión de PowerShell elevada.

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

    $DnsName="DNS_DOMAIN"
    $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
    

    en la que DNS_DOMAIN es el nombre de DNS externo que deseas usar para AD FS. Este nombre de dominio puede ser diferente de los nombres de dominio que usa Active Directory.

  4. Crea otro certificado RSA 2048 de bits que AD FS use 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 Key Manager distribuido (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\adfssvc" -Message 'Enter password'
    
  7. Instala AD FS mediante los certificados y el contenedor DKM que creaste antes:

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

Configura TLS

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

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

    netsh http show sslcert hostnameport=DNS_DOMAIN:443
    

    en la que DNS_DOMAIN es el nombre de DNS externo 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"
    

    Aquí:

    • CERTIFICATE_HASH es el hash del certificado que se muestra en el comando anterior.
    • APP_ID es el ID de 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 ahora está implementado, pero todavía debes verificar que el servicio pueda acceder a través del balanceador de cargas de HTTPS:

  1. Regrese a la sesión de Cloud Shell.
  2. Verifica que el certificado SSL tenga el estado ACTIVE:

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

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

  3. En tu computadora local, abre un navegador y navega hasta https://DNS_DOMAIN/adfs/ls?wa=wsignout1.0, en el que DNS_DOMAIN es el nombre de DNS externo que configuraste para AD FS.

    Verifica que veas un mensaje que indica Saliste correctamente de la cuenta, lo que indica que AD FS se implementó de forma correcta.

AD FS ya está listo para usarse. Para obtener detalles sobre el uso y la configuración del servicio, consulta Operaciones de AD FS.