Como evitar aumentos freqüentes de KVNO, ao usar o HTTPD do Apache com o mod_auth_kerb falando com o AD?

1

Eu configurei o Apache HTTPD 2.4 com mod_auth_kerb, criei uma conta de serviço no Active Directory, adicionei um SPN ao meu nome de host http, criei um arquivo keytab na máquina linux e fiz o SSO começar a funcionar bem para usuários logados no AD domínio do IE. Foi tudo de bom!

No entanto, a cada semana, os usuários, em vez de entrarem no site, recebem um aviso de autenticação básica http, que não aceita suas credenciais. Procurando nos registros do servidor httpd, vemos entradas como:

[auth_kerb:error] [pid 8040] [client 192.168.100.100:54460] gss_accept_sec_context() failed: Unspecified GSS failure.  Minor code may provide more information (, Key version number for principal in key table is incorrect)

O que parece ter acontecido é que o KVNO (Número da versão da chave Kerberos) no AD foi incrementado, então o keytab é inválido. Podemos ver isso fazendo algo como:

$ kinit '[email protected]'
Password for [email protected]

$ kvno HTTP/sso.example.com
HTTP/[email protected]: kvno = 12

$ klist -k krb5-keytab 
Keytab name: FILE:krb5-keytab
KVNO Principal
---- ---------------------------------------------
11   HTTP/[email protected]

O KVNO que o AD é relatado foi incrementado de alguma forma, e é um mais alto que o do keytab que o Apache está usando, o que está fazendo com que o SSO do Kerberos falhe

Se recriarmos o keytab, com algo como:

$ kinit '[email protected]'
Password for [email protected]

$ KEYTAB=krb5-keytab
$ SN="HTTP/[email protected]"
$ KVNO='kvno $SN | awk -F'kvno = ' '{print $2}''
$ echo "KVNO for $SN is $KVNO"
KVNO for HTTP/[email protected] is 12

$ rm $KEYTAB
$ ktutil
addent -password -p HTTP/[email protected] -k 12 -e arcfour-hmac
wkt krb5-keytab
$ chown apache.apache $KEYTAB
$ chmod 440 $KEYTAB
$ chcon -u system_u -t httpd_config_t $KEYTAB
$ service httpd restart

O SSO do Kerberos começará a funcionar novamente e tudo ficará bem! Por uma semana ou mais, quando de repente ele falhará novamente, como o KVNO silenciosamente e misteriosamente se deu um valor maior em AD ....

Então, o que eu preciso fazer, no AD ou em como eu crio o arquivo keytab do kerberos no Linux, para que o KVNO não continue aumentando aleatoriamente a cada 1-2 semanas, quebrando assim a capacidade de todos os usuários acessar o site?

    
por Gagravarr 17.06.2015 / 14:10

2 respostas

3

O Active Directory incrementa o KVNO de acordo com a RFC 4120. A Microsoft documentou sua implementação no documento MS-KILE seção 3.1.5.8.

O Active Directory essencialmente ignora o KVNO. (Exceto em CDs somente leitura - se um RODC for comprometido, as chaves que ele contém não podem ser reutilizadas em outro DC.) Então, meu ponto é que o AD geralmente não se importa com o KVNO - mesmo que ele mantenha KVNOs - só importa se o seu bilhete é válido e não expirou. (Se o seu cliente Linux faz uma verificação rigorosa de KVNOs, eu não sei. Aparentemente sim.)

O Active Directory tentará descriptografar / validar com a chave mais recente que possui para esse principal, e se isso não funcionar, ele tentará com o anterior (contanto que a chave anterior ainda esteja dentro de sua vida útil) e, se isso não funcionar, a solicitação será reprovada. Independentemente de qual KVNO o cliente envia. Mas lembre-se que nem todos os controladores de domínio terão seu KVNO-1 (ou seja, o KVNO anterior), apenas o controlador de domínio que emitiu o seu último bilhete.

O KVNO é incrementado quando o computador cliente altera sua senha ou renova seu tíquete ou seu tíquete expira. Por padrão, o Active Directory usa 7 dias para o tempo máximo em que um ticket pode ser renovado, o que corresponde à sua descrição de "funciona por uma semana ou mais."

Não há mecanismo para impedir que o Active Directory incremente KVNO quando recebe uma alteração de senha válida ou rotação de ticket de um computador membro do domínio. Então, meu ponto é que o Active Directory não "misteriosamente" atualiza o KVNO - ele o faz por razões específicas.

Parece-me que sua máquina Linux ainda está tentando usar seu ticket (agora expirado) após sua vida útil máxima de 7 dias. (Ou o Active Directory foi configurado para algo mais curto).

Procure no seu /etc/krb5.conf e verifique se a duração máxima do ticket está dentro do tempo de vida máximo do ticket especificado no Active Directory (a Política Kerberos na Diretiva de Grupo Padrão do Domínio.) Você precisa renovar seu ticket (e seu KVNO deve aumentar) dentro desse intervalo especificado por AD.

    
por 17.06.2015 / 19:25
2

Você provavelmente está acertando esse bug link

Existem algumas mudanças na configuração do samba que irão resolvê-lo. Eu coloquei

kerberos method = secrets and keytab
    
por 28.04.2016 / 22:56