Habilitando o logon único criptografado AES para o Apache em um domínio Win2008

3

Todos os tutoriais que consegui encontrar ao configurar o login único em um site hospedado pelo Apache usando a autenticação do Active Directory fazem isso configurando o Kerberos com configurações inseguras. Já faz um bom tempo agora desativar a criptografia RC4-HMAC para o Kerberos no Active Directory , mas muitos tutoriais pedem a substituição dos padrões do krb5.conf e fazem com que tudo funcione com o RC4-HMAC.

Eu queria tentar configurar o logon único com a criptografia AES256 e consegui fazer com que funcionasse. Por isso, estou gravando essa pergunta e a resposta para qualquer outra pessoa que queira melhorar a segurança de seu site.

Começando com o RC4-HMAC

Começaremos trabalhando com o RC4-HMAC primeiro, já que isso é mais fácil. As etapas padrão para configurar o SSO começam com a criação de uma conta de domínio com um SPN associado, que os navegadores usarão para obter credenciais criptografadas para enviar ao servidor. Para este exemplo, meu usuário é REALM \ HostServiceAccount:

  • UPN: [email protected] (e, portanto, o nome do principal do Kerberos é [email protected])
  • atributo servicePrincipalName (também configurável por setspn): HTTP / host.example.com; HTTP / host (Kerberos: HTTP/[email protected])
  • Deixe as configurações de criptografia sozinhas; por padrão, isso torna a RC4-HMAC a criptografia mais strong permitida, portanto, os tickets do domínio terão essa criptografia

Adicionamos as seguintes entradas ao /etc/krb5.conf em nosso servidor de destino:

[libdefaults]
    default_realm = REALM.COM

[domain_realm]
    .realm.com = REALM.COM
    realm.com = REALM.COM

Criamos o keytab e deixamos o servidor lê-lo:

# ktutil
ktutil:  add_entry -password -p HTTP/[email protected] -k 1 -e rc4-hmac
Password for HTTP/[email protected]: <enter password here>
ktutil:  write_kt /etc/apache2/service.keytab
ktutil:  q
# chown -v www-data:root /etc/apache2/service.keytab
# chmod -v 440 /etc/apache2/service.keytab

(Neste ponto, é claro, você gostaria de usar kinit -kt service.keytab -S HTTP/[email protected] [email protected] para testar o keytab.)

Por fim, definimos o Apache para autenticar os usuários usando nosso keytab:

KrbDelegateBasic off
KrbAuthoritative on
KrbMethodK5Passwd off
Krb5Keytab /etc/apache2/service.keytab
KrbAuthRealms REALM.COM

LogLevel debug

Depois que reiniciarmos o Apache, se tudo correr bem, faremos uma solicitação ao servidor da nossa máquina de domínio do Windows e veremos o seguinte no log de erros do Apache:

[debug] src/mod_auth_kerb.c(1641): [client ****] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos, referer: ****
[debug] src/mod_auth_kerb.c(1395): [client ****] Verifying client data using KRB5 GSS-API , referer: ****
[debug] src/mod_auth_kerb.c(1411): [client ****] Client didn't delegate us their credential, referer: ****
[debug] src/mod_auth_kerb.c(1430): [client ****] GSS-API token of length 185 bytes will be sent back, ****

Executando klist em nossa máquina cliente (ou Wireshark para ver o ticket na solicitação), vemos que na verdade usamos um tíquete RC4-HMAC para autenticar:

#4>     Client: fluggo @ REALM.COM
        Server: HTTP/host.example.com @ REALM.COM
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)

Movendo para uma melhor criptografia

Tudo está bem, mas, novamente, esse não é o nosso objetivo. O RC4-HMAC é considerado inseguro, então vamos desabilitar isso e tentar fazer a mesma configuração funcionar com o AES256.

Primeiro, pediremos ao nosso administrador de domínio de vizinhança amigável para ativar a criptografia avançada em REALM \ HostServiceAccount, que serão duas caixas de seleção rotuladas:

  • Esta conta oferece suporte à criptografia Kerberos AES de 128 bits
  • Esta conta oferece suporte à criptografia Kerberos AES de 256 bits

Eles aparecem em vários lugares, dependendo das ferramentas que você está usando; o resultado final deve ser que o atributo LDAP msDS-SupportedEncryptionTypes deve ser 0x18 ou decimal 24, o que representa que apenas AES128 e AES256 são suportados.

Para tornar isso efetivo, mataremos nossos tickets de clientes locais:

C:>klist purge

Current LogonId is 0:0xdeadbeef
        Deleting all tickets:
        Ticket(s) purged!

Se efetuarmos novamente o nosso pedido, veremos que o pedido falhou, mas temos um ticket atualizado:

C:>klist
      ...
#3>     Client: fluggo @ REALM.COM
        Server: HTTP/host.example.com @ REALM.COM
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96

Agora só precisamos atualizar nosso keytab com os novos algoritmos e devemos ser dourados:

# mv /etc/apache2/service.keytab ~/old.keytab
# ktutil
ktutil:  add_entry -password -p HTTP/[email protected] -k 1 -e aes256-cts-hmac-sha1-96
Password for HTTP/[email protected]: <enter password here>
ktutil:  add_entry -password -p HTTP/[email protected] -k 1 -e aes128-cts-hmac-sha1-96
Password for HTTP/[email protected]: <enter password here>
ktutil:  write_kt /etc/apache2/service.keytab
ktutil:  q
# chown -v www-data:root /etc/apache2/service.keytab
# chmod -v 440 /etc/apache2/service.keytab

Nem precisamos reiniciar o Apache. Basta reenviar o pedido.

Opa ... não funciona. Se olharmos para o log de erros do Apache, vemos:

[debug] src/mod_auth_kerb.c(1641): [client ****] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[debug] src/mod_auth_kerb.c(1249): [client ****] Acquiring creds for [email protected]
[debug] src/mod_auth_kerb.c(1395): [client ****] Verifying client data using KRB5 GSS-API
[debug] src/mod_auth_kerb.c(1411): [client ****] Client didn't delegate us their credential
[debug] src/mod_auth_kerb.c(1430): [client ****] GSS-API token of length 9 bytes will be sent back
[debug] src/mod_auth_kerb.c(1110): [client ****] GSS-API major_status:000d0000, minor_status:000186a5
[error] [client ****] gss_accept_sec_context() failed: Unspecified GSS failure.  Minor code may provide more information (, )

Bem, essa é uma mensagem de erro ridiculamente inútil, mas o que deu errado? A resposta e uma solução a seguir!

    
por fluggo 10.09.2015 / 17:13

2 respostas

1

Acontece que o maior problema aqui é um dos problemas que o AES256 pretendia resolver.

TL; DR : o nome principal no keytab agora precisa corresponder ao nome da conta.

O problema

Se tivéssemos executado KRB5_TRACE=/dev/stderr kinit [email protected] de volta quando a conta estivesse habilitada somente para a criptografia RC4-HMAC, teríamos visto essa linha na saída:

[8192] 1441829478.537451: Selected etype info: etype rc4-hmac, salt "", params ""

Agora que temos o AES256 ativado, essa linha é assim:

[8200] 1441829508.947208: Selected etype info: etype aes256-cts, salt "REALM.COMHostServiceAccount", params ""

Quando a comutação foi feita da autenticação NTLM para o Kerberos, o algoritmo RC4-HMAC foi especificado para reutilizar o hash NTLM. A Microsoft se recusou a colocar um sal no hash para facilitar a interoperabilidade dos sistemas existentes com o Kerberos. Agora que os usuários têm a oportunidade de atualizar, um salt é especificado para os algoritmos AES256 e AES128, e o salt é o nome do usuário.

Podemos ver isso se gerarmos keytabs para RC4-HMAC e AES256 usando nomes de usuários diferentes. Com o RC4-HMAC:

fluggo@host:~$ ktutil
ktutil:  add_entry -password -p HTTP/[email protected] -k 1 -e rc4-hmac
Password for HTTP/[email protected]: 12345
ktutil:  add_entry -password -p [email protected] -k 1 -e rc4-hmac
Password for [email protected]: 12345
ktutil:  write_kt rc4.keytab
ktutil:  q
fluggo@host:~$ klist -Kek rc4.keytab
Keytab name: FILE:rc4.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   1 HTTP/[email protected] (arcfour-hmac)  (0x7a21990fcd3d759941e45c490f143d5f)
   1 [email protected] (arcfour-hmac)  (0x7a21990fcd3d759941e45c490f143d5f)

... o hash é o mesmo, então essas duas entradas são equivalentes. Mas com AES256:

fluggo@host:~$ ktutil
ktutil:  add_entry -password -p HTTP/[email protected] -k 1 -e aes256-cts-hmac-sha1-96
Password for HTTP/[email protected]: 12345
ktutil:  add_entry -password -p [email protected] -k 1 -e aes256-cts-hmac-sha1-96
Password for [email protected]: 12345
ktutil:  write_kt aes.keytab
ktutil:  q
fluggo@host:~$ klist -Kek aes.keytab
Keytab name: FILE:aes.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   1 HTTP/[email protected] (aes256-cts-hmac-sha1-96)  (0x5746fa6f9b0c990ba7fb20acd85065040d66e843a043508569841768ef2b7917)
   1 [email protected] (aes256-cts-hmac-sha1-96)  (0x6a98fdccbce4db77f40192f4e916e0900a1b9cba2f6ca8bc737d968e4b961c25)

... os hashes são diferentes. O nome principal é importante e precisa corresponder ao UPN da conta.

Uma solução

Como o nome de usuário deve estar correto para o keytab funcionar, geramos um novo keytab com o nome principal que o Active Directory usa no ticket:

# rm /etc/apache2/service.keytab
# ktutil
ktutil:  add_entry -password -p [email protected] -k 1 -e aes256-cts-hmac-sha1-96
Password for [email protected]: <enter password here>
ktutil:  add_entry -password -p [email protected] -k 1 -e aes128-cts-hmac-sha1-96
Password for [email protected]: <enter password here>
ktutil:  write_kt /etc/apache2/service.keytab
ktutil:  q
# chown -v www-data:root /etc/apache2/service.keytab
# chmod -v 440 /etc/apache2/service.keytab

O Apache se preocupa com o nome principal no keytab e, portanto, não encontrará essas entradas por conta própria. Em vez disso, apenas direcionamos o Apache para usar qualquer entidade principal que ele possa encontrar:

KrbServiceName Any

Eu queria que o Apache encontrasse o diretor pelo nome correto, mas isso dificilmente importa, já que nossos diretores são os únicos no keytab.

Reinicie o Apache, atualize a página e a autenticação deve funcionar agora.

    
por 10.09.2015 / 17:47
-1

Solução para guias principais com várias entradas (SPNs), conforme descrito aqui: link

Adicione a opção / RawSalt ao ktpass: ktpass.... -setupn /RawSalt "REALM.COMSameAccountAsMapuser"

    
por 31.01.2018 / 05:09