Solucionar problemas de autenticação do Active Directory para SQL Server em Linux e em contêineres

Aplica-se a: SQL Server no Linux

Este artigo ajuda você a solucionar problemas de autenticação do Active Directory Domain Services com o SQL Server em Linux e em contêineres. Ele inclui verificações de pré-requisitos e dicas para uma configuração bem-sucedida do Active Directory, bem como uma lista de erros comuns e etapas de solução de problemas.

Validar configuração atual

Antes de começar a solução de problemas, valide o usuário atual, mssql.confo Nome do Principal de Serviço (SPN) e as configurações do realm.

  1. Obtenha ou renove o Kerberos TGT (bilhete de concessão de bilhetes) com kinit:

    kinit privilegeduser@CONTOSO.COM
    
  2. Execute o comando a seguir e certifique-se de que o usuário que o executa tenha acesso ao mssql.keytab:

    /opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab
    

    Para mais informações sobre o validate-ad-config comando, execute /opt/mssql/bin/mssql-conf validate-ad-config --help.

Consultas de DNS e DNS reverso

  1. As pesquisas 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 DC (controlador de domínio). Execute esses comandos no computador host SQL Server.

    nslookup contoso
    nslookup contoso.com
    

    Se os endereços IP não correspondem, confira Unir SQL Server em um host Linux a um domínio do Active Directory para corrigir as pesquisas DNS e a comunicação com o controlador de domínio.

  2. Realize uma busca reversa por DNS (rDNS) para cada endereço IP a partir dos resultados anteriores. Inclua endereços IPv4 e IPv6 quando aplicável.

    nslookup <IPs returned from the above commands>
    

    Tudo deve retornar <hostname>.contoso.com. Caso contrário, verifique os registros PTR (ponteiro) no Active Directory.

    Talvez seja necessário trabalhar com o administrador de domínio para que o rDNS funcione. Se você não puder adicionar entradas PTR para todos os endereços IP retornados, também pode limitar o SQL Server a um subconjunto de controladores de domínio. Essa alteração afeta todos os outros serviços que usam krb5.conf no host.

    Para obter mais informações sobre DNS reverso, confira O que é DNS reverso?

Verificar o arquivo keytab e as permissões

  1. Verifique se você criou o arquivo keytab (key table) e se configurou mssql-conf para usar o arquivo correto com as permissões apropriadas. O keytab deve estar acessível para a conta de usuário mssql. Para obter mais informações, confira Usar adutil para configurar a autenticação do Active Directory com SQL Server no Linux.

  2. Certifique-se de que você consegue listar o conteúdo do keytab e de ter adicionado os SPNs, porta, tipo de criptografia e conta de usuário corretos. Se você não digitar as senhas corretamente ao criar os SPNs e entradas keytab, encontrará erros ao tentar fazer login com autenticação do Active Directory.

    klist -kte /var/opt/mssql/secrets/mssql.keytab
    

    A seguir, um exemplo de um keytab funcional. O exemplo usa dois tipos de criptografia, mas você pode usar apenas um ou mais, dependendo dos tipos de criptografia com suporte em seu ambiente. No exemplo, sqluser@CONTOSO.COM é a conta privilegiada (que corresponde à configuração network.privilegedadaccount em mssql-conf), e o nome do host do SQL Server é sqllinux.contoso.com, ouvindo na porta padrão 1433.

    $ 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 /var/opt/mssql/secrets/mssql.keytab
    
    Keytab name: FILE:/var/opt/mssql/secrets/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 as informações do domínio em krb5.conf

  1. No krb5.conf (localizado em /etc/krb5.conf), verifique se você forneceu os valores para o realm padrão, informações do realm e mapeamento do domínio para o realm. Revise o seguinte arquivo de exemplo krb5.conf . Para obter mais informações, confira Entenda a autenticação do Active Directory para SQL Server no Linux e em contêineres.

    [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
    
  2. Você pode restringir o SQL Server a entrar em contato com um subconjunto de controladores de domínio, o que será útil se a sua configuração de DNS retornar mais controladores de domínio do que o SQL Server precisa contatar. O SQL Server em Linux permite que você especifique uma lista de controladores de domínio que o SQL Server contata em formato round-robin ao realizar uma busca pelo Protocolo de Acesso a Diretórios Leves (LDAP).

    Complete estes dois passos. Primeiro, modifique krb5.conf adicionando os controladores de domínio que você precisa, com o prefixo kdc =.

    [realms]
    CONTOSO.COM = {
      kdc = kdc1.contoso.com
      kdc = kdc2.contoso.com
      ..
      ..
    }
    

    O krb5.conf arquivo é um arquivo de configuração comum do cliente Kerberos, então qualquer alteração que você faça nesse arquivo afeta outros serviços além do SQL Server. Antes de fazer qualquer alteração, consulte o administrador do seu domínio.

    Ative a network.enablekdcfromkrb5conf configuração com mssql-conf, e então reinicie o SQL Server:

    sudo /opt/mssql/bin/mssql-conf set network.enablekdcfromkrb5conf true
    sudo systemctl restart mssql-server
    

Solucionar problemas do Kerberos

Os detalhes a seguir ajudam você a solucionar problemas de autenticação do Active Directory e identificar mensagens de erro específicas.

Rastreamento do Kerberos

Depois de criar o usuário, SPNs e keytabs, e configurarmssql-conf, verifique a configuração do Active Directory.

Para verificar a configuração do SQL Server em Linux, use a conta privilegiada para obter ou renovar o TGT Kerberos. Execute este comando para mostrar as mensagens de rastreamento Kerberos no console (stdout):

root@sqllinux mssql# KRB5_TRACE=/dev/stdout kinit -kt /var/opt/mssql/secrets/mssql.keytab sqluser

Se não houver nenhum problema, você deverá ver uma saída semelhante à amostra a seguir. Se não, o rastreamento fornece contexto sobre quais etapas 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

Habilitar o registro em log de PAL baseado em segurança e Kerberos

Para identificar mensagens de erro específicas no PAL (Camada de Abstração de Plataforma), ative security.kerberos e security.ldap loge. Crie um logger.ini arquivo com o conteúdo a seguir em /var/opt/mssql/, e então reinicie o SQL Server para capturar quaisquer erros de inicialização. Reproduza a falha. O PAL registra erros do Active Directory e mensagens de depuração para /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

O SQL Server detecta alterações no logger sem logger.ini reiniciar, mas falhas durante a inicialização do serviço Active Directory na inicialização do SQL Server passam despercebidas. Reiniciar o SQL Server captura todas as mensagens de erro.

O log de segurança continua a gravar na unidade até que você remova as alterações no logger.ini. Desative security.kerberos e security.ldap registre assim que identificar e resolver o problema, para evitar ficar sem espaço no disco.

O registrador PAL gera arquivos de log no seguinte formato:

<DATETIME> <Log level> [<logger>] <<process/thread identifier>> <message>

Por exemplo, uma linha de amostra do log está a seguir:

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 ativar o registro PAL e reproduzir o problema, procure a primeira mensagem com um nível de log de Error. Use a tabela a seguir para encontrar o erro e siga as orientações e recomendações para solucionar e solucionar o problema.

Mensagens de erro comuns

Mensagem de erro: "Falha no logon. O login é de um domínio não confiável e não pode ser usado com autenticação integrada"

Causa possível

Você encontra esse erro ao tentar fazer login com uma conta do Active Directory após configurar a autenticação do Active Directory.

Orientação

Essa mensagem de erro genérica requer que você habilite o registro em log do PAL para identificar o erro específico.

Veja a lista a seguir 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.

Mensagens de erro
Usuário ou grupo do Windows NT "CONTOSO\user" não encontrado
Não foi possível procurar um nome de domínio curto devido a um erro
Não foi possível executar a pesquisa de rDNS para o host <hostname> devido a um erro
FQDN não retornado na consulta rDNS
Falha ao se vincular ao servidor LDAP
Entrada da tabela de chaves não encontrada
Nenhuma entrada na tabela de chaves foi encontrada para <principal>
<Entidade de segurança> do servidor de tíquete de solicitação não encontrada na keytab (tíquete kvno <KVNO>)
<Entidade de segurança> kvno <KVNO> do servidor de tíquete de solicitação encontrada na keytab, mas não com o <tipo de criptografia> enctype
<Tipo de criptografia> enctype da <entidade de segurança> kvno <KVNO> encontrado na keytab, mas não é possível descriptografar o tíquete

Mensagem de erro: usuário ou grupo Windows NT "CONTOSO\user" não encontrado

Causa possível

Você poderá encontrar esse erro ao tentar criar o logon do Windows ou durante a atualização do grupo.

Orientação

Para validar o problema, siga a orientação "Login falhado. O logon vem de um domínio não confiável e não pode ser usado com autenticação integrada. (Microsoft SQL Server, Erro: 18452)" e permitir o registro PAL para identificar o erro específico e solucionar o problema de acordo.

Mensagem de erro: "Não foi possível procurar um nome de domínio curto devido a um erro"

Causa possível

A sintaxe Transact-SQL para criar um logon do Active Directory é:

CREATE LOGIN [CONTOSO\user]
    FROM WINDOWS;

O nome NetBIOS (CONTOSO) é necessário no comando, mas a FQDN do domínio (contoso.com) deve ser fornecida no backend ao realizar uma conexão LDAP. Para fazer essa conversão, uma pesquisa DNS é executada em CONTOSO para resolver o IP de um controlador de domínio, que pode ser vinculado a para consultas LDAP.

Orientação

A mensagem de erro "Não foi possível buscar nome de domínio curto devido a erro" sugere que nslookup for contoso não resolve para o endereço IP do controlador de domínio. Revise DNS e as buscas reversas de DNS para confirmar que nslookup tanto para NetBIOS quanto para domínio correspondem.

Mensagens de erro: "Não foi possível executar a pesquisa de rDNS para o host <hostname> devido a um erro" ou "FQDN não retornado pela pesquisa de rDNS"

Causa possível

Essas mensagens de erro geralmente indicam que os registros DNS reversos (registros PTR) não existem para todos os controladores de domínio.

Orientação

Confira as consultas DNS e DNS reverso. Depois de identificar os controladores de domínio que não possuem entradas rDNS, você tem duas opções:

  • Adicionar entradas rDNS para todos os controladores de domínio

    Essa configuração não é do SQL Server, e você deve configurá-la no nível do domínio. Você pode ter que trabalhar com sua equipe de administração de domínio para criar os registros PTR necessários para todos os controladores de domínio que nslookup retornam o nome de domínio.

  • Restringir SQL Server a um subconjunto de controladores de domínio

    Se você não puder adicionar registros PTR para todos os controladores de domínio retornados, pode limitar o SQL Server a um subconjunto de controladores de domínio.

Mensagem de erro: "Falha ao se vincular ao servidor LDAP ldap://CONTOSO.COM:3268: Erro Local"

Causa possível

Esse erro genérico do OpenLDAP normalmente significa uma dessas duas opções:

  • Nenhuma credencial
  • 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ção

  • Nenhuma credencial

    Outras mensagens de erro aparecem primeiro se as credenciais não carregarem para conexões LDAP. Ative o registro PAL e verifique o registro de erros para mensagens de erro antes dessa. Se não houver nenhum outro erro, provavelmente não será um problema de credencial. Se encontrar um erro, corrija antes de seguir em frente. Na maioria dos casos, é uma das mensagens de erro que este artigo aborda.

  • Problemas de rDNS

    Confira as consultas DNS e DNS reverso.

    Quando a biblioteca OpenLDAP se conecta a um controlador de domínio, ela fornece ou o nome de domínio totalmente qualificado (FQDN), que neste exemplo é contoso.com, ou o FQDNkdc1.contoso.com (). Após estabelecer a conexão (mas antes de retornar o sucesso ao chamador), a biblioteca OpenLDAP verifica o IP do servidor ao qual se conectou. Em seguida, ele realiza uma busca DNS reversa e verifica se o nome do servidor ao qual se conectou (kdc1.contoso.com) corresponde ao domínio solicitado (contoso.com). Se não corresponder, a biblioteca OpenLDAP falhará na conexão como medida de segurança. Essa descorrespondência é parte do motivo pelo qual as configurações de rDNS são importantes para o SQL Server em Linux, e são o foco deste artigo.

Mensagem de erro: "Entrada de tabela de chave não encontrada"

Causa possível

Esse erro indica problemas de acesso com o arquivo keytab ou entradas faltantes no keytab.

Orientação

Garanta que o arquivo keytab tenha o nível de acesso e as permissões corretas. A localização e o nome padrão do arquivo keytab são /var/opt/mssql/secrets/mssql.keytab. Para visualizar as permissões atuais em todos os arquivos na pasta secrets, execute este comando:

sudo ls -lrt /var/opt/mssql/secrets

Use 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 detalhes sobre como listar as entradas de dados no keytab e definir as permissões corretas, confira a seção anterior Verificar permissões e o arquivo keytab. Se você não atender a nenhuma das condições dessa seção, verá este erro ou um erro equivalente: "Key table entry not found".

Mensagem de erro: "Nenhuma entrada na tabela de chaves foi encontrada para <principal>"

Causa possível

Quando você tenta recuperar as credenciais <principal> do keytab, não encontra entradas aplicáveis.

Orientação

Para listar todas as entradas de dados no keytab, siga a seção Verificar permissões e o arquivo keytab deste artigo. Garanta que <principal> esteja presente. Nesse caso, a conta principal geralmente é a network.privilegedadaccount que você registra os Relatos de Proteção Externa. Se não estiver, adicione junto com o adutil comando. Para obter mais informações, confira Usar adutil para configurar a autenticação do Active Directory com SQL Server no Linux.

Mensagem de erro: "Servidor de tíquete de solicitação <entidade de segurança> não encontrado na keytab (tíquete kvno <KVNO>)"

Causa possível

Esse erro indica que o SQL Server não consegue encontrar uma entrada de keytab para o ticket solicitado com o Key Version Number (KVNO) especificado.

Orientação

Para listar todas as entradas de dados no keytab, siga a seção Verificar permissões e o arquivo keytab deste artigo. Se você não encontrar uma mensagem de erro que corresponda ao <principal> e KVNO, atualize o arquivo keytab para adicionar essa entrada, seguindo os passos dessa seção.

Você também pode executar o comando a seguir para obter o KVNO mais recente do DC. Antes de executar esse comando, obtenha ou renove o Kerberos TGT com o kinit comando. Para obter mais informações, confira Usar adutil para criar um usuário do Active Directory para o SQL Server e definir o SPN (Nome da Entidade de Serviço).

kvno MSSQLSvc/<hostname>

Mensagem de erro: "Servidor de tíquete de solicitação <entidade de segurança> kvno <KVNO> encontrado na keytab, mas não com o enctype <tipo de criptografia>"

Causa possível

Esse erro significa que a keytab do SQL Server não contém o tipo de criptografia que o cliente solicita.

Orientação

Para validar, siga a seção Verificar arquivo keytab e permissões deste artigo para listar todas as entradas no keytab. Se você não conseguir encontrar uma mensagem de erro que corresponda ao principal, KVNO e tipo de criptografia, atualize o arquivo keytab para adicionar essa entrada, seguindo os passos dessa seção.

Mensagem de erro: "Servidor de tíquete de solicitação <entidade de segurança> do kvno <KVNO> enctype <tipo de criptografia> encontrado na keytab, mas não é possível descriptografar o tíquete"

Causa possível

Essa mensagem de erro indica que o SQL Server não pode usar uma credencial do arquivo keytab para descriptografar a solicitação de autenticação recebida. Uma senha incorreta frequentemente causa esse erro.

Orientação

Recrie a aba de teclas com a senha correta. Se você usar adutil, crie a keytab com a senha correta e siga os passos do Tutorial: Use o Adutil para configurar a autenticação do Active Directory com o SQL Server em Linux.

Portas comuns

Esta tabela mostra as portas comuns que o SQL Server em Linux usa para configurar e administrar a autenticação do Active Directory.

Serviço do Active Directory Porto
DNS 53
LDAP 389
LDAPS 636
Kerberos 88