Solucionar problemas de autenticação do Ative Directory para SQL Server em Linux e contêineres
Aplica-se a:SQL Server - Linux
Este artigo ajuda você a solucionar problemas de autenticação dos Serviços de Domínio Ative Directory com o SQL Server no Linux e contêineres. Ele inclui verificações de pré-requisitos e dicas para uma configuração bem-sucedida do Ative Directory, além de uma lista de erros comuns e etapas de solução de problemas.
Validar a configuração atual
Antes de iniciar a solução de problemas, você deve validar as configurações atuais de usuário, mssql.conf
, SPN (Nome da Entidade de Serviço) e realm.
Obtenha ou renove o Kerberos TGT (bilhete de concessão de bilhetes) usando
kinit
:kinit privilegeduser@CONTOSO.COM
Execute o seguinte comando, certificando-se de que o usuário sob o qual você está executando este comando tenha acesso ao
mssql.keytab
:/opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab
Para obter mais informações sobre o comando
validate-ad-config
, consulte a ajuda usando o comando/opt/mssql/bin/mssql-conf validate-ad-config --help
.
DNS e pesquisas reversas de DNS
As pesquisas de DNS no nome de domínio e no nome NetBIOS devem retornar o mesmo endereço IP, que normalmente corresponde ao endereço IP do controlador de domínio (DC). Execute esses comandos a partir da máquina host do SQL Server.
nslookup contoso nslookup contoso.com
Se os endereços IP não corresponderem, consulte para associar o SQL Server num host Linux a um domínio do Active Directory para corrigir pesquisas de DNS e comunicação com o DC.
Execute uma pesquisa reversa de DNS (rDNS) para cada endereço IP listado nos resultados anteriores. Lembre-se de incluir endereços IPv4 e IPv6 quando aplicável.
nslookup <IPs returned from the above commands>
Todos devem retornar
<hostname>.contoso.com
. Se esse não for o caso, verifique os registos PTR (ponteiro) criados no Active Directory.Poderá ter de trabalhar com o administrador do domínio para que o rDNS funcione. Se não for possível adicionar entradas PTR para todos os endereços IP retornados, você também poderá limitar o SQL Server a um subconjunto de controladores de domínio. Esta alteração afeta todos os outros serviços que utilizem
krb5.conf
no servidor.Para obter mais informações sobre DNS reverso, consulte O que é DNS reverso?
Verifique o arquivo keytab e as permissões
Verifique se você criou o arquivo keytab (tabela de chaves) e se mssql-conf está configurado para usar o arquivo correto com as permissões apropriadas. O keytab deve estar acessível à conta de usuário
mssql
. Para obter mais informações, consulte Usar adutil para configurar a autenticação do Ative Directory com o SQL Server no Linux.Certifique-se de que pode listar o conteúdo do keytab e que adicionou os SPNs, a porta, o tipo de encriptação e a conta de utilizador corretos. Se você não digitar as senhas corretamente ao criar os SPNs e as entradas keytab, encontrará erros ao tentar entrar usando a autenticação do Ative Directory.
klist -kte /var/opt/mssql/secrets/mssql.keytab
Segue-se um exemplo de um keytab de trabalho. O exemplo usa dois tipos de criptografia, mas você pode usar apenas um ou mais, dependendo dos tipos de criptografia suportados em seu ambiente. No exemplo,
sqluser@CONTOSO.COM
é a conta privilegiada (que corresponde à configuraçãonetwork.privilegedadaccount
em mssql-conf) e o nome do host para o SQL Server estásqllinux.contoso.com
escutando na porta padrão1433
.$ kinit privilegeduser@CONTOSO.COM Password for privilegeduser@CONTOSO.COM: $ klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: privilegeduser@CONTOSO.COM Valid starting Expires Service principal 01/26/22 20:42:02 01/27/22 06:42:02 krbtgt/CONTOSO.COM@CONTOSO.COM renew until 01/27/22 20:41:57 $ klist -kte mssql.keytab Keytab name: FILE:mssql.keytab KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 2 01/13/22 13:19:47 MSSQLSvc/sqllinux@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux:1433@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com:5533@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com:5533@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:55 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:55 sqluser@CONTOSO.COM (aes128-cts-hmac-sha1-96)
Validar informações de domínio no krb5.conf
No
krb5.conf
(localizado em/etc/krb5.conf
), verifique se o utilizador fornece valores para o domínio padrão, informações de domínio e mapeamento de domínio para domínio. O exemplo a seguir é um ficheirokrb5.conf
. Para obter mais informações, consulte Compreender a autenticação do Active Directory para SQL Server no Linux e contentores.[libdefaults] default_realm = CONTOSO.COM default_keytab_name = /var/opt/mssql/secrets/mssql.keytab default_ccache_name = "" [realms] CONTOSO.COM = { kdc = adVM.contoso.com admin_server = adVM.contoso.com default_domain= contoso.com } [domain_realm] .contoso.com = CONTOSO.COM contoso.com = CONTOSO.COM
Você pode restringir o SQL Server para entrar em contato com um subconjunto de controladores de domínio, o que é útil se sua configuração DNS retornar mais controladores de domínio do que o SQL Server precisa contatar. O SQL Server no Linux permite que você especifique uma lista de controladores de domínio que o SQL Server contata de forma round-robin ao executar uma pesquisa LDAP (Lightweight Directory Access Protocol).
Há duas etapas que você precisa concluir. Primeiro, modifique
krb5.conf
adicionando qualquer número de controladores de domínio necessários, prefixados comkdc =
.[realms] CONTOSO.COM = { kdc = kdc1.contoso.com kdc = kdc2.contoso.com .. .. }
Lembre-se de que
krb5.conf
é um arquivo de configuração de cliente Kerberos comum, portanto, quaisquer alterações feitas nesse arquivo afetam outros serviços além do SQL Server. Antes de fazer alterações, consulte o administrador do domínio.Em seguida, você pode habilitar a configuração
network.enablekdcfromkrb5conf
usando mssql-conf e reiniciar o SQL Server:sudo /opt/mssql/bin/mssql-conf set network.enablekdcfromkrb5conf true sudo systemctl restart mssql-server
Solucionar problemas de Kerberos
Consulte os detalhes a seguir para ajudá-lo a solucionar problemas de autenticação do Ative Directory e identificar mensagens de erro específicas.
Rastrear Kerberos
Depois de criar o usuário, SPNs e keytabs, e configurar mssql-conf para ver se a configuração do Ative Directory para SQL Server no Linux está correta, você pode exibir as mensagens de rastreamento Kerberos para o console (stdout
) ao tentar obter ou renovar o TGT Kerberos com a conta privilegiada, usando este comando:
root@sqllinux mssql# KRB5_TRACE=/dev/stdout kinit -kt /var/opt/mssql/secrets/mssql.keytab sqluser
Se não houver problemas, você verá uma saída semelhante ao exemplo a seguir. Caso contrário, o rastreamento fornece contexto sobre quais etapas você deve revisar.
3791545 1640722276.100275: Getting initial credentials for sqluser@CONTOSO.COM
3791545 1640722276.100276: Looked up etypes in keytab: aes256-cts, aes128-cts
3791545 1640722276.100278: Sending unauthenticated request
3791545 1640722276.100279: Sending request (202 bytes) to CONTOSO.COM
3791545 1640722276.100280: Initiating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100281: Sending TCP request to stream 10.0.0.4:88
3791545 1640722276.100282: Received answer (185 bytes) from stream 10.0.0.4:88
3791545 1640722276.100283: Terminating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100284: Response was from master KDC
3791545 1640722276.100285: Received error from KDC: -1765328359/Additional pre-authentication required
3791545 1640722276.100288: Preauthenticating using KDC method data
3791545 1640722276.100289: Processing preauth types: PA-PK-AS-REQ (16), PA-PK-AS-REP_OLD (15), PA-ETYPE-INFO2 (19), PA-ENC-TIMESTAMP (2)
3791545 1640722276.100290: Selected etype info: etype aes256-cts, salt "CONTOSO.COMsqluser", params ""
3791545 1640722276.100291: Retrieving sqluser@CONTOSO.COM from /var/opt/mssql/secrets/mssql.keytab (vno 0, enctype aes256-cts) with result: 0/Success
3791545 1640722276.100292: AS key obtained for encrypted timestamp: aes256-cts/E84B
3791545 1640722276.100294: Encrypted timestamp (for 1640722276.700930): plain 301AA011180F32303231313XXXXXXXXXXXXXXXXXXXXXXXXXXXXX, encrypted 333109B95898D1B4FC1837DAE3E4CBD33AF8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3791545 1640722276.100295: Preauth module encrypted_timestamp (2) (real) returned: 0/Success
3791545 1640722276.100296: Produced preauth for next request: PA-ENC-TIMESTAMP (2)
3791545 1640722276.100297: Sending request (282 bytes) to CONTOSO.COM
3791545 1640722276.100298: Initiating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100299: Sending TCP request to stream 10.0.0.4:88
3791545 1640722276.100300: Received answer (1604 bytes) from stream 10.0.0.4:88
3791545 1640722276.100301: Terminating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100302: Response was from master KDC
3791545 1640722276.100303: Processing preauth types: PA-ETYPE-INFO2 (19)
3791545 1640722276.100304: Selected etype info: etype aes256-cts, salt "CONTOSO.COMsqluser", params ""
3791545 1640722276.100305: Produced preauth for next request: (empty)
3791545 1640722276.100306: AS key determined by preauth: aes256-cts/E84B
3791545 1640722276.100307: Decrypted AS reply; session key is: aes256-cts/05C0
3791545 1640722276.100308: FAST negotiation: unavailable
3791545 1640722276.100309: Initializing KCM:0:37337 with default princ sqluser@CONTOSO.COM
3791545 1640722276.100310: Storing sqluser@CONTOSO.COM -> krbtgt/CONTOSO.COM@CONTOSO.COM in KCM:0:37337
3791545 1640722276.100311: Storing config in KCM:0:37337 for krbtgt/CONTOSO.COM@CONTOSO.COM: pa_type: 2
3791545 1640722276.100312: Storing sqluser@CONTOSO.COM -> krb5_ccache_conf_data/pa_type/krbtgt/CONTOSO.COM@CONTOSO.COM@X-CACHECONF: in KCM:0:37337
$ sudo klist
Ticket cache: KCM:0:37337
Default principal: sqluser@CONTOSO.COM
Valid starting Expires Service principal
12/28/2021 20:11:16 12/29/2021 06:11:16 krbtgt/CONTOSO.COM@CONTOSO.COM
renew until 01/04/2022 20:11:16
Habilite o Kerberos e o log PAL baseado em segurança
Você pode habilitar o log de security.kerberos
e security.ldap
para identificar mensagens de erro específicas na PAL (Platform Abstraction Layer). Crie um arquivo logger.ini
com o seguinte conteúdo em /var/opt/mssql/
, reinicie o SQL Server e reproduza a falha. As mensagens de erro e depuração do Active Directory do PAL ficam registadas no /var/opt/mssql/log/security.log
.
[Output:security]
Type = File
Filename = /var/opt/mssql/log/security.log
[Logger]
Level = Silent
[Logger:security.kerberos]
Level = Debug
Outputs = security
[Logger:security.ldap]
Level = debug
Outputs = security
Não é necessário reiniciar o SQL Server para que as alterações do registrador sejam coletadas do logger.ini
, mas podem ocorrer falhas durante a inicialização do serviço Ative Directory durante a inicialização do SQL Server que, de outra forma, passariam despercebidas. Reiniciar o SQL Server garante que todas as mensagens de erro sejam capturadas.
O registo de segurança continua a ser registado na unidade até remover as alterações no logger.ini
. Lembre-se de, depois de identificar e resolver o problema, desativar o registo security.kerberos
e security.ldap
, para evitar ficar sem espaço na unidade de armazenamento.
O registador PAL gera ficheiros de registo no seguinte formato:
<DATETIME> <Log level> [<logger>] <<process/thread identifier>> <message>
Por exemplo, uma linha de exemplo do log segue:
12/28/2021 13:56:31.609453055 Error [security.kerberos] <0003753757/0x00000324> Request ticket server MSSQLSvc/sql.contoso.com:1433@CONTOSO.COM kvno 3 enctype aes256-cts found in keytab but cannot decrypt ticket
Depois de habilitar o log PAL e reproduzir o problema, procure a primeira mensagem com um nível de log de Error
e, em seguida, use a tabela a seguir para localizar o erro e siga as orientações e recomendações para solucionar e resolver o problema.
Mensagens de erro comuns
Mensagem de erro: "Falha no login. O login é de um domínio não confiável e não pode ser usado com autenticação integrada."
Possível causa
Este erro é encontrado quando tenta iniciar sessão utilizando uma conta do Ative Directory, depois de configurar a autenticação do Ative Directory.
Orientações
Esta mensagem de erro genérica requer que ative o registo PAL para identificar o erro concreto.
Consulte a seguinte lista de erros comuns para identificar a possível causa de cada erro e, em seguida, siga as orientações de solução de problemas para resolver o problema.
Mensagem de erro: Usuário ou grupo do Windows NT 'CONTOSO\user' não encontrado
Possível causa
Você pode encontrar este erro ao tentar criar o login no Windows ou durante a atualização de grupo.
Orientações
Para validar o problema, siga as orientações documentadas para "Falha no login. O login é de um domínio não confiável e não pode ser usado com autenticação integrada. (Microsoft SQL Server, Erro: 18452)" habilitar o registo PAL para identificar o erro específico e solucionar problemas de acordo.
Mensagem de erro: "Não foi possível procurar nome de domínio curto devido a erro"
Possível causa
A sintaxe Transact-SQL para criar um logon do Ative Directory é:
CREATE LOGIN [CONTOSO\user]
FROM WINDOWS;
O nome NetBIOS (CONTOSO
) é necessário no comando, mas no back-end ao executar uma conexão LDAP, o FQDN do domínio (contoso.com
) deve ser fornecido. Para fazer esta conversão, é realizada uma pesquisa DNS em CONTOSO
para resolver o IP de um controlador de domínio, ao qual pode ser vinculado para consultas LDAP.
Orientações
A mensagem de erro "Não foi possível procurar nome de domínio abreviado devido a erro" sugere que nslookup
para contoso
não se resolve no endereço IP do controlador de domínio. Deve rever de pesquisas DNS e DNS inversas para confirmar que nslookup
para o NetBIOS e o nome de domínio devem corresponder.
Mensagens de erro: "Não foi possível executar a pesquisa rDNS para o nome de host <> devido a um erro" ou "FQDN não retornado pela pesquisa rDNS"
Possível causa
Essa mensagem de erro geralmente indica que os registros DNS reversos (registros PTR) não existem para todos os controladores de domínio.
Orientações
Verifique o DNS e as pesquisas reversas de DNS. Depois que os controladores de domínio que não têm entradas rDNS são identificados, há duas opções:
Adicionar entradas rDNS para todos os controladores de domínio
Essa configuração não é uma configuração do SQL Server e deve ser definida no nível do domínio. Talvez seja necessário trabalhar com sua equipe de administração de domínio para criar os registros PTR necessários para todos os controladores de domínio retornados ao executar
nslookup
no nome de domínio.Restringir o SQL Server a um subconjunto de controladores de domínio
Se não for possível adicionar registros PTR para todos os controladores de domínio retornados, você poderá limitar o SQL Server a um subconjunto de controladores de domínio.
Mensagem de erro: "Falha ao vincular ao servidor LDAP ldap://CONTOSO.COM:3268: Erro local"
Possível causa
Este erro genérico do OpenLDAP normalmente significa uma de duas coisas:
- Sem credenciais
- Problemas de rDNS
Aqui está um exemplo da mensagem de erro:
12/09/2021 14:32:11.319933684 Error [security.ldap] <0000000142/0x000001c0> Failed to bind to LDAP server ldap://[CONTOSO.COM:3268]: Local error
Orientações
Sem credenciais
Outras mensagens de erro são exibidas primeiro se as credenciais não forem carregadas em conexões LDAP. Você deve habilitar o de log PAL e verificar se há mensagens de erro no log de erros antes deste. Se não houver outros erros, é muito provável que não seja um problema de credenciais. Se um for encontrado, em seguida, trabalhar na correção da mensagem de erro que você vê. Na maioria dos casos, é uma das mensagens de erro abordadas neste artigo.
problemas de rDNS
Verifique as verificações de DNS e de DNS reverso.
Quando a biblioteca OpenLDAP se conecta a um controlador de domínio, o FQDN (nome de domínio totalmente qualificado), que neste exemplo é
contoso.com
, ou o FQDN do DC (kdc1.contoso.com
) são fornecidos. Uma vez que a conexão é feita (mas antes de retornar o sucesso para o chamador), a biblioteca OpenLDAP verifica o IP do servidor ao qual ele se conectou. Em seguida, ele executa uma pesquisa reversa de DNS e verifica se o nome do servidor conectado a (kdc1.contoso.com
) corresponde ao domínio para o qual a conexão foi solicitada (contoso.com
). Se não corresponder, a biblioteca OpenLDAP falhará a conexão como um recurso de segurança. Isso é parte do motivo pelo qual as configurações do rDNS são tão importantes para o SQL Server no Linux e são o foco deste artigo.
Mensagem de erro: "Entrada de tabela de chave não encontrada"
Possível causa
Este erro indica problemas de acesso com o arquivo keytab ou não ter todas as entradas necessárias no keytab.
Orientações
Verifique se o arquivo keytab tem o nível de acesso e as permissões corretas. O local padrão e o nome do arquivo keytab são /var/opt/mssql/secrets/mssql.keytab
. Para exibir as permissões atuais em todos os arquivos na pasta secrets, você pode executar este comando:
sudo ls -lrt /var/opt/mssql/secrets
Você pode usar estes comandos para definir as permissões e o nível de acesso no arquivo keytab:
sudo chown mssql /var/opt/mssql/secrets/mssql.keytab
sudo chmod 440 /var/opt/mssql/secrets/mssql.keytab
Para obter mais informações sobre como listar as entradas keytab e definir as permissões corretas, consulte a seção anterior Verificar arquivo keytab e permissões. Se alguma das condições nessa seção não for atendida, você verá este erro ou equivalente: "Key table entry not found"
.
Mensagem de erro: "Nenhuma entrada de tabela de chave encontrada para <principal>"
Possível causa
Ao tentar recuperar as credenciais de <principal>
a partir do keytab, nenhuma entrada aplicável foi encontrada.
Orientações
Para listar todas as entradas no keytab, siga a secção Verifique o ficheiro keytab e as permissões deste artigo. Certifique-se de que <principal>
está presente. Neste caso, a conta principal costuma ser o network.privilegedadaccount
onde os SPNs estão registados. Se não estiver, adicione-o usando o comando adutil. Para obter mais informações, consulte Usar adutil para configurar a autenticação do Ative Directory com o SQL Server no Linux.
Mensagem de erro: "Solicitar servidor de tíquete <principal não> encontrado no keytab (ticket kvno <KVNO>)"
Possível causa
Este erro indica que o SQL Server não conseguiu encontrar uma entrada no keytab para o bilhete solicitado com o Número de Versão da Chave (KVNO) especificado.
Orientações
Para listar todas as entradas no keytab, siga a seção Verificação do ficheiro keytab e permissões deste artigo. Se não conseguir encontrar uma mensagem de erro que corresponda ao <principal>
e ao KVNO, adicione esta entrada atualizando o ficheiro keytab utilizando os passos mencionados nessa secção.
Você também pode executar o seguinte comando para obter o KVNO mais recente do DC. Antes de executar esse comando, você precisa obter ou renovar o TGT Kerberos usando o comando kinit. Para obter mais informações, consulte Utilize adutil para criar um usuário do Active Directory para o SQL Server e definir o Service Principal Name (SPN).
kvno MSSQLSvc/<hostname>
Mensagem de erro: "O servidor de bilhetes de pedido <principal> kvno <KVNO> foi encontrado no keytab, mas não com o tipo de encriptação <especificado como>"
Possível causa
Esse erro significa que o tipo de criptografia solicitado pelo cliente não estava presente na keytab do SQL Server.
Orientações
Para validar, siga a seção Verificar arquivo keytab e permissões deste documento para listar todas as entradas no keytab. Se não conseguir encontrar uma mensagem de erro que corresponda ao principal, KVNO e tipo de encriptação, adicione esta entrada ao atualizar o ficheiro keytab, utilizando os passos mencionados naquela secção.
Mensagem de erro: "Pedido de servidor de bilhetes <principal> kvno <KVNO> tipo de criptografia <> encontrado na keytab, mas não é possível descriptografar bilhete"
Possível causa
Esse erro indica que o SQL Server não pôde usar uma credencial do arquivo keytab para descriptografar a solicitação de autenticação de entrada. O erro é muitas vezes o resultado de uma senha incorreta.
Orientações
Recrie o keytab usando a senha correta. Se utilizar adutil, crie o keytab com a senha correta, utilizando os passos do Tutorial: Use adutil para configurar a autenticação do Active Directory com o SQL Server no Linux.
Portos comuns
Esta tabela mostra as portas comuns usadas pelo SQL Server no Linux para configurar e administrar a autenticação do Ative Directory.
Serviço Active Directory | Porto |
---|---|
DNS | 53 |
LDAP | 389 |
LDAPS | 636 |
Kerberos | 88 |