Configurei o Apache HTTPD 2.4 com mod_auth_kerb, criei uma conta de serviço no Active Directory, adicionei um SPN para 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 domínio AD do IE . Foi tudo de bom!
No entanto, a cada semana, os usuários, em vez de fazer login no site, recebem um prompt de autenticação básica http, que não aceita suas credenciais. Olhando nos logs 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 (Kerberos Key Version Number) no AD aumentou, 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 relatado pelo AD foi de alguma forma incrementado e é um valor maior que aquele no keytab que o Apache está usando, o que está causando falha no SSO do Kerberos
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
Então o Kerberos SSO começará a funcionar novamente e tudo ficará bem! Por mais ou menos uma semana, quando de repente ele falhará novamente, já que o KVNO silenciosa e misteriosamente atingiu um valor mais alto no AD....
Então, o que eu preciso fazer, seja no AD ou em como eu crio o arquivo keytab kerberos no Linux, para que o KVNO não continue aumentando aleatoriamente a cada 1-2 semanas, quebrando assim toda a capacidade de acesso do usuário ao site ?
Responder1
O Active Directory incrementa o KVNO de acordo com o RFC 4120. A Microsoft documentou sua implementação na seção 3.1.5.8 do documento MS-KILE.
O Active Directory ignora essencialmente o KVNO. (Exceto em DCs somente leitura - se um RODC estiver comprometido, as chaves que ele contém não poderão ser reutilizadas em outro DC.) Portanto, meu argumento é que o AD geralmente não se importa com qual é o seu KVNO - mesmo que ainda mantenha KVNOs - só importa se o seu bilhete é válido e não expirou. (Se o seu cliente Linux faz uma verificação rigorosa dos KVNOs, eu não sei. Aparentemente faz.)
O Active Directory tentará descriptografar/validar com a chave mais recente que possui para esse principal e, se isso não funcionar, tentará com a anterior (desde que a chave anterior ainda esteja dentro de sua vida útil, ) e se isso não funcionar, a solicitação falhará. Independentemente de qual KVNO o cliente envia. Mas lembre-se de 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 seu tíquete pela última vez.
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 aumente o KVNO quando recebe uma alteração de senha válida ou rotação de ticket de um computador membro do domínio. Portanto, o que quero dizer é que o Active Directory não atualiza "misteriosamente" o KVNO - ele o faz por motivos específicos.
Parece-me que sua máquina Linux ainda está tentando usar seu ticket (agora expirado) após seu tempo de vida máximo de 7 dias. (Ou o Active Directory foi configurado para algo mais curto.)
Verifique /etc/krb5.conf
se o tempo de vida máximo do ticket está dentro do tempo de vida máximo do ticket especificado no Active Directory (a Política Kerberos na Política de Grupo de Domínio Padrão). Você precisa renovar seu ticket (e seu KVNO deve aumentar) dentro desse intervalo especificado pelo AD.
Responder2
Você provavelmente está encontrando esse bug https://bugzilla.samba.org/show_bug.cgi?id=6750
Existem algumas alterações na configuração do samba que irão resolver isso. eu coloco
kerberos method = secrets and keytab