Estou tentando configurar um arquivo keytab para usar com meu principal de serviço para autenticação Kerberos entre meu servidor Linux (RHEL9) e meu Microsoft Windows 2022 Server. O principal de serviço é MSSQLSvc/ [email protected] . Quando eu gero o arquivo keytab no meu host AD (controlador) e então o carrego para meu host RHEL e tento gerar um tíquete.
kinit -V -t /etc/test.keytab MSSQLSvc/[email protected]
Eu sempre recebo:
Using keytab: /etc/test.keytab
kinit: Invalid integer value while getting initial credentials
Também tentei:
kinit MSSQLSvc/[email protected]
kinit: Invalid integer value while getting initial credentials
Aqui está o contexto de como configurei meu ambiente. Primeiro, configurei meu serviço do SQL Server para rodar com meu usuário de domínio [email protected] . Então, gerei um princípio de serviço para meu usuário:
PS C:\Users\Administrator> setSPN EvolvenDBUser
Registered ServicePrincipalNames for CN=EvolvenDBUser,CN=Users,DC=evolven,DC=corp:
MSSQLSvc/MSSQL-G1CFTVE.evolven.corp
MSSQLSvc/MSSQL-G1CFTVE.evolven.corp:1433
Em seguida, gerei um arquivo keytab no meu host AD por meio deste comando:
ktpass -princ MSSQLSvc/[email protected] -mapuser [email protected] -crypto AES256-SHA1 -ptype KRB5_NT_PRINCIPAL -pass <password> -out test.keytab -SetPass
Ele retorna isto:
Targeting domain controller: EC2AMAZ-AEHRC46.evolven.corp
Using legacy password setting method
Successfully mapped MSSQLSvc/MSSQL-G1CFTVE.evolven.corp to EvolvenDBUser.
Key created.
Output keytab to evolven.keytab:
Keytab version: 0x502
keysize 99 MSSQLSvc/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 20 etype 0x12 (AES256-SHA1) keylength 32 (0x0a32866cd2364109a006b483cedd8f6eee418f87b2b460d6be75e6763b1b0aef)
Quando examino o arquivo keytab no meu host RHEL:
klist -k /etc/test.keytab
Keytab name: FILE:/etc/test.keytab
KVNO Principal
---- --------------------------------------------------------------------------
18 MSSQLSvc/[email protected]
No meu host RHEL, meu krb5.conf não é muito sofisticado, mas posso confirmar que ele suporta as configurações de criptografia que desejo usar.
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = EVOLVEN.CORP
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 30d
renew_lifetime = 30d
forwardable = true
udp_preference_limit = 1 # Forces TCP if UDP fails
default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96
[realms]
EVOLVEN.CORP = {
kdc = EC2AMAZ-AEHRC46.evolven.corp
admin_server = EC2AMAZ-AEHRC46.evolven.corp
}
[domain_realm]
.evolven.corp = EVOLVEN.CORP
evolven.corp = EVOLVEN.CORP
Eu tentei muitas coisas:
- Habilitei o suporte de usuário AES-128 e AES-256 no AD.
- Alterei a senha do usuário do AD e então regenerei o arquivo keytab. Também removi caracteres especiais na senha pensando que isso poderia estar causando um problema. Ainda o mesmo.
- Fiz um kdestroy para remover todos os tickets antigos.
- Vi uma postagem aqui: kinit: Falha na pré-autenticação ao obter credenciais iniciais .
- Não sei por que, mas não vejo nenhum registro, mesmo tendo habilitado o registro.
Eu tentei fazer:ktutil: add_entry -password -p MSSQLSvc/[email protected] -k 18 -e aes256-cts-hmac-sha1-96 -f
e eu volto
add_entry: Invalid integer value while adding new entry
Então, algo está claramente errado aqui com a autenticação do meu princípio de serviço. O que eu faço para resolver para poder gerar tickets?
Invalid integer
é um erro que ocorre durante a análise do krb5.conf. Provavelmente isso ocorre por causa do seu udp_preference_limit, que está definido como1 # Forces TCP if UDP fails
– esse não é um número válido, pois o krb5.conf não suporta comentários de mesma linha.Deixando isso de lado: você tem duas entidades (cliente e serviço), mas apenas uma conta do AD entre ambas, e não é assim que você deve usar o Kerberos.
Como regra geral, os clientes de um serviço nunca devem usar o mesmo principal do serviço – você deve criar uma conta de usuário dedicada (sem um SPN) para cada cliente.
(Quando você faz isso
kinit MSSQLSvc/MSSQL-whatever
, você não está recebendo tickets para o servidor MSSQL – você está recebendo tickets como o servidor MSSQL, o que é o oposto do que você provavelmente está tentando fazer.)Tenha em mente que um keytab é literalmente a senha da conta em um formato diferente, então se você normalmente não informaria aos clientes a senha da conta de serviço, então você também não deveria dar aos clientes um keytab de serviço. (Assim como você também não daria aos usuários do webapp uma cópia da chave privada HTTPS do servidor...)