Implemente o AD FS num domínio do Microsoft AD gerido

Este guia descreve como pode implementar o Microsoft Active Directory Federation Services (AD FS) para o Windows Server 2019 num domínio do Serviço gerido para o Microsoft Active Directory.

O diagrama seguinte ilustra a implementação:

Arquitetura

Os utilizadores comunicam com um balanceador de carga HTTPS que usa um certificado gerido pela Google para terminar as ligações SSL. O balanceador de carga encaminha as ligações para uma instância de VM que executa o Microsoft AD FS para o Windows Server 2019 e que está associada ao domínio do Microsoft AD gerido. A comunicação entre o balanceador de carga e a instância de VM está protegida através de um certificado SSL autoassinado.

A implementação usa uma única instância do AD FS e a base de dados interna do Windows, o que a torna adequada para ambientes pequenos. Para ambientes com maior fiabilidade ou requisitos de segurança, considere implementar várias instâncias do AD FS numa configuração de farm e implementar proxies de federação.

Antes de começar

Preparar o projeto e a rede

Tem de preparar o Google Cloud projeto e a rede VPC para a implementação do AD FS.

Crie uma instância de VM

Crie uma conta de serviço e uma instância de VM para executar o AD FS:

  1. Na Google Cloud consola, abra o Cloud Shell.

    Ative o Cloud Shell

  2. Defina o seu ID do projeto predefinido:

    gcloud config set project PROJECT_ID
    

    Substitua PROJECT_ID pelo ID do seu Google Cloud projeto.

  3. Defina a região e o fuso horário predefinidos:

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

    Substitua o seguinte:

    • REGION: o ID da região na qual quer fazer a implementação.
    • ZONE: o ID da zona na qual quer fazer a implementação.
  4. Crie uma conta de serviço:

    gcloud iam service-accounts create SA_NAME
    

    Substitua SA_NAME pelo nome da conta de serviço.

  5. Crie uma instância de VM que execute o Windows Server 2019 e use um script de especialização para instalar automaticamente a função de servidor 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"
    

    Substitua o seguinte:

    • VM_NAME: o nome da instância de VM.
    • SUBNET_NAME: o nome da sub-rede na qual implementar o AD FS.
    • SA_NAME: o nome da conta de serviço.

    Para configurar e associar a instância de VM ao seu domínio do Active Directory, conclua os seguintes passos:

    1. Monitorize o processo de inicialização da VM vendo a respetiva saída da porta de série:

      gcloud compute instances tail-serial-port-output VM_NAME
      

      Aguarde cerca de 3 minutos até ver o resultado Instance setup finished e, em seguida, prima Ctrl+C. Neste momento, a instância de VM está pronta a ser usada.

    2. Crie um nome de utilizador e uma palavra-passe para a instância de VM.

    3. Estabeleça ligação à VM através do Ambiente de Trabalho Remoto e inicie sessão com o nome de utilizador e a palavra-passe criados no passo anterior.

    4. Clique com o botão direito do rato no botão Iniciar (ou prima Win+X) e clique em Windows PowerShell (administrador).

    5. Clique em Sim para confirmar o pedido de elevação.

    6. Associe o computador ao seu domínio do Active Directory e reinicie:

      Add-Computer -Domain DOMAIN -Restart
      

      Substitua DOMAIN pelo nome DNS do seu domínio do Active Directory.

      Aguarde aproximadamente 1 minuto para que o reinício seja concluído.

Crie um balanceador de carga

Tem de criar um equilibrador de carga que permita aos utilizadores aceder ao AD FS através de um único endereço IP virtual.

Para associar a instância de VM que executa o AD FS ao balanceador de carga, primeiro, crie um grupo de instâncias não gerido e, de seguida, atribua este grupo de instâncias ao balanceador de carga:

  1. Regresse à sua sessão do Cloud Shell existente.
  2. Crie o grupo de instâncias não gerido:

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

    Substitua INSTANCE_GROUP_NAME pelo nome do grupo que quer criar.

  3. Adicione a instância de VM existente ao grupo de instâncias:

    gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances VM_NAME
    
  4. Crie uma verificação de funcionamento que analise a porta HTTPS do AD FS:

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

    Substitua HEALTH_CHECK_NAME por um nome para a verificação de estado.

  5. Crie um serviço de back-end do balanceador de carga que use a verificação de funcionamento de HTTPS e o grupo de instâncias que criou 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)
    

    Substitua BACKEND_SERVICE_NAME por um nome para o serviço de back-end.

  6. Reserve um endereço IP externo estático para o balanceador de carga:

    gcloud compute addresses create ADDRESS_NAME --global
    

    Substitua ADDRESS_NAME pelo nome que quer associar a este endereço.

  7. Crie um certificado SSL gerido para o balanceador de carga:

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

    Substitua o seguinte:

    • CERTIFICATE_NAME: o nome do certificado SSL gerido.
    • PUBLIC_FQDN: o nome do domínio totalmente qualificado (FQDN) público que quer usar para o AD FS. Por exemplo, login.example.com.
  8. Crie um front-end do balanceador de carga que use o endereço IP externo e encaminhe o tráfego para o serviço de back-end:

    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
    

    Substitua o seguinte:

    • URL_MAP_NAME: o nome do mapa de URLs para o equilibrador de carga.
    • PROXY_NAME: o nome do proxy de destino do balanceador de carga.
    • FORWARDING_RULE_NAME: o nome da regra de encaminhamento do balanceador de carga.
  9. Crie uma regra de firewall para permitir o tráfego do balanceador de carga para a instância de VM que executa o 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
    

    Substitua o seguinte:

    • FIREWALL_RULE_NAME: o nome da regra de firewall.
    • VPC_NAME: o nome da sua rede VPC.
    • SA_NAME: o nome da conta de serviço.

    Os intervalos de origem são os intervalos de IP do balanceador de carga interno. Para mais informações, consulte o artigo Configure uma regra de firewall.

  10. Procure o endereço IP do balanceador de carga:

    gcloud compute addresses describe ADDRESS_NAME \
       --global \
       --format=value\(address\)
    
  11. Crie um registo A de DNS na sua zona de DNS pública que aponte para o endereço IP do balanceador de carga. O nome totalmente qualificado do registo DNS tem de corresponder ao nome que usou para o certificado SSL.

Implementar o AD FS

Tem de implementar a função de servidor AD FS na instância de VM. Uma vez que não tem direitos de Domain Admins num domínio do Microsoft AD gerido, não pode usar o Gestor do servidor para fazer a instalação e tem de usar o PowerShell.

Crie um utilizador de serviço

Tem de criar uma conta de utilizador no Active Directory para o serviço AD FS:

  1. Estabeleça ligação à instância da VM através do Ambiente de Trabalho Remoto e inicie sessão com as suas credenciais de administrador delegado.
  2. Clique com o botão direito do rato no botão Iniciar (ou prima Win+X) e clique em Windows PowerShell (administrador).
  3. Defina uma palavra-passe aleatória para a conta de serviço do AD FS:

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

    Substitua o seguinte:

    • USER: o nome de um utilizador do Active Directory.
    • PASSWORD: a palavra-passe do utilizador do Active Directory.
  4. Crie um utilizador do 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. Adicione o utilizador ao grupo de administradores locais:

    Add-LocalGroupMember `
     -Group "Administrators" `
     -Member "$env:userdomain\USER"
    
  6. Atribua um nome principal do serviço:

    setspn -a http/PUBLIC_FQDN USER
    

    Substitua PUBLIC_FQDN pelo nome do domínio totalmente qualificado público do AD FS.

  7. Crie um contentor vazio no Active Directory. Tem de usar este contentor mais tarde quando instalar o AD FS:

    New-ADObject `
      -Type Container `
      -Name "ADFS Data" `
      -Path $CloudOuPath
    
  8. Conceda ao utilizador do AD FS controlo total no contentor:

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

Instale o AD FS

Pode instalar o AD FS na instância de VM:

  1. Inicie uma sessão do PowerShell como utilizador do ADFS:

    runas /u:$env:userdomain\USER powershell
    

    A nova sessão do PowerShell é executada como o utilizador do AD FS, mas sem privilégios elevados.

  2. Na nova sessão do PowerShell, inicie uma segunda sessão do PowerShell com privilégios elevados:

    Start-Process PowerShell -Verb RunAs
    

    Tem de executar todos os passos subsequentes nesta nova sessão do PowerShell com privilégios elevados.

  3. Crie um certificado SSL autoassinado que use uma chave RSA de 2048 bits e armazene-o no arquivo de certificados do computador:

    $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
    

    Substitua PUBLIC_FQDN pelo nome do domínio totalmente qualificado público do AD FS.

  4. Crie outro certificado RSA de 2048 bits que o AD FS usa como certificado de assinatura 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. Crie um contentor do 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. Volte a introduzir as credenciais do utilizador do AD FS que definiu anteriormente:

    $AdfsCredential = Get-Credential -UserName "$env:userdomain\USER" -Message 'PASSWORD'
    
  7. Instale o AD FS com os certificados e o contentor DKM que criou anteriormente:

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

    O comando pode apresentar as seguintes mensagens de aviso:

    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.
    

    Pode ignorar estes avisos porque já definiu o SPN e não está a usar a autenticação baseada em certificados.

  8. Se planeia usar a Autenticação integrada do Windows (IWA) para se autenticar no AD FS, execute o seguinte comando para desativar a associação de tokens:

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

    A desativação da associação de tokens é necessária porque está a implementar o AD FS atrás de um balanceador de carga e o balanceador de carga termina as ligações TLS.

Se encontrar problemas relacionados com autorizações nestes passos, contacte o Google Cloud apoio técnico.

Configure o TLS

Ao estabelecer ligações a back-ends, o balanceador de carga HTTPS não usa a extensão de indicação do nome do servidor (SNI). Para permitir que o AD FS aceite a ligação sem SNI, tem de configurar uma alternativa de certificado:

  1. No PowerShell, veja as associações de certificados de servidor SSL para o AD FS:

    netsh http show sslcert hostnameport=PUBLIC_FQDN:443
    

    Substitua PUBLIC_FQDN pelo nome do domínio público totalmente qualificado do AD FS.

  2. Configure um certificado alternativo para a associação:

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

    Substitua o seguinte:

    • CERTIFICATE_HASH: o hash do certificado apresentado no comando anterior.
    • APP_ID: o ID da aplicação apresentado no comando anterior, incluindo as chavetas.
  3. Reinicie o computador para concluir a instalação:

    Restart-Computer
    

    Aguarde aproximadamente 1 minuto para que o reinício seja concluído.

Testar o AD FS

O serviço AD FS está implementado, mas ainda tem de verificar se é possível aceder ao serviço através do balanceador de carga HTTPS:

  1. Volte à sessão do Cloud Shell.
  2. Verifique se o certificado SSL está no estado ACTIVE:

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

    Se o certificado estiver no estado PROVISIONING, o registo DNS que criou para o AD FS pode demorar mais tempo a propagar-se. Para mais detalhes, consulte o artigo Resolução de problemas de certificados geridos pela Google.

  3. No computador local, abra um navegador e navegue para o seguinte URL:

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

    Substitua PUBLIC_FQDN pelo nome do domínio público totalmente qualificado do AD FS

    Verifique se vê uma mensagem You have successfully signed out, a indicar que o AD FS foi implementado com êxito.

Se planeia usar a autenticação integrada do Windows (IWA), verifique se consegue obter um pedido Kerberos para o AD FS:

  1. Estabeleça ligação à instância da VM ou a uma VM associada a um domínio diferente através do Ambiente de Trabalho Remoto e inicie sessão com as credenciais do domínio.
  2. Clique com o botão direito do rato no botão Iniciar (ou prima Win+X) e clique em Windows PowerShell.
  3. Use o comando klist para pedir um pedido de serviço para o AD FS:

    klist get http/PUBLIC_FQDN
    

    Verifique se o resultado inclui um pedido para o AD FS:

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

O AD FS está pronto a ser usado. Para ver detalhes sobre a utilização e a configuração do serviço, consulte o artigo Operações do AD FS.