Solución de problemas de la autenticación de Active Directory para SQL Server en Linux y contenedores

Se aplica a:SQL Server en Linux

Este artículo le ayuda a solucionar los problemas de autenticación de Active Directory Domain Services con SQL Server en Linux y contenedores. Incluye comprobaciones de requisitos previos y sugerencias para una configuración de Active Directory correcta y una lista de errores comunes y pasos de solución de problemas.

Validación de la configuración actual

Antes de empezar a diagnosticar, valida el usuario actual, mssql.confel nombre principal del servicio (SPN) y la configuración del reino.

  1. Obtén o renueva el Kerberos TGT (ticket de concesión de billetes) con:kinit

    kinit privilegeduser@CONTOSO.COM
    
  2. Ejecuta el siguiente comando y asegúrate de que el usuario que lo ejecuta tiene acceso a la mssql.keytab:

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

    Para más información sobre el validate-ad-config comando, ejecuta /opt/mssql/bin/mssql-conf validate-ad-config --help.

Búsquedas de DNS e inversas de DNS

  1. Las búsquedas de DNS en el nombre de dominio y el nombre NetBIOS deben devolver la misma dirección IP, que normalmente coincide con la dirección IP del controlador de dominio (DC). Ejecute estos comandos desde el equipo host de SQL Server.

    nslookup contoso
    nslookup contoso.com
    

    Si las direcciones IP no coinciden, consulte Unión de SQL Server en un host de Linux a un dominio de Active Directory para corregir las búsquedas de DNS y la comunicación con el controlador de dominio.

  2. Realiza una búsqueda inversa de DNS (rDNS) para cada dirección IP a partir de los resultados anteriores. Incluye direcciones IPv4 e IPv6 cuando corresponda.

    nslookup <IPs returned from the above commands>
    

    Todas deben devolver <hostname>.contoso.com. De lo contrario, revisa los registros PTR (puntero) en Active Directory.

    Es posible que tenga que trabajar con el administrador de dominio para que rDNS funcione. Si no puedes añadir entradas PTR para todas las direcciones IP devueltas, también puedes limitar SQL Server a un subconjunto de controladores de dominio. Este cambio afecta a cualquier otro servicio que use krb5.conf en el host.

    Para obtener más información sobre DNS inverso, consulte ¿Qué es DNS inverso?

Compruebe el archivo keytab y los permisos

  1. Comprueba que has creado el archivo keytab (tabla de claves) y que lo hayas configurado mssql-conf para usar el archivo correcto con los permisos adecuados. El archivo keytab debe ser accesible para la cuenta de usuario mssql. Para obtener más información, consulte Uso de adutil para configurar la autenticación de Active Directory con SQL Server en Linux.

  2. Asegúrese de que puede enumerar el contenido de la tabla keytab y que ha agregado los SPN, el puerto, el tipo de cifrado y la cuenta de usuario correctos. Si no escribes correctamente las contraseñas al crear los SPN y las entradas de keytab, te encontrarás con errores al intentar iniciar sesión con la autenticación de Active Directory.

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

    A continuación se muestra un ejemplo de un archivo keytab válido. En el ejemplo se usan dos tipos de cifrado, pero puede usar solo uno o varios en función de los tipos de cifrado admitidos en su entorno. En el ejemplo, sqluser@CONTOSO.COM es la cuenta con privilegios elevados (que coincide con la configuración network.privilegedadaccount en mssql-conf), y el nombre de host de SQL Server es sqllinux.contoso.com, que escucha en el puerto predeterminado 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 la información del dominio kerberos en krb5.conf

  1. En krb5.conf (ubicado en /etc/krb5.conf), compruebe que ha proporcionado valores para el dominio kerberos predeterminado, la información de dominio kerberos y la asignación de dominio a dominio kerberos. Revisa el siguiente archivo de ejemplo krb5.conf . Para obtener más información, consulte Descripción de la autenticación de Active Directory para SQL Server en Linux y contenedores.

    [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. Puede restringir SQL Server para ponerse en contacto con un subconjunto de controladores de dominio, lo que resulta útil si la configuración de DNS devuelve más controladores de dominio de los que SQL Server necesita para ponerse en contacto. SQL Server en Linux te permite especificar una lista de controladores de dominio con los que SQL Server contacta de forma todos en formato round-robin al realizar una consulta con el Protocolo de Acceso a Directorios Ligero (LDAP).

    Completa estos dos pasos. Primero, modifica krb5.conf añadiendo los controladores de dominio que necesitas, con el prefijo kdc =.

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

    El krb5.conf archivo es un archivo de configuración común de cliente Kerberos, así que cualquier cambio que hagas en este archivo afecta a otros servicios además de SQL Server. Antes de hacer cualquier cambio, consulta con el administrador de tu dominio.

    Activa la network.enablekdcfromkrb5conf configuración con mssql-conf, y luego reinicia SQL Server:

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

Solución de problemas de Kerberos

Los siguientes detalles te ayudan a solucionar problemas de autenticación de Active Directory e identificar mensajes de error específicos.

Seguimiento de Kerberos

Después de crear el usuario, los SPN y las teclas de teclado, y configurarmssql-conf, verifica la configuración de Active Directory.

Para verificar la configuración de SQL Server en Linux, utiliza la cuenta privilegiada para obtener o renovar el TGT de Kerberos. Ejecuta este comando para mostrar los mensajes de trazado Kerberos en la consola (stdout):

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

Si no hay ningún problema, debería ver una salida similar al ejemplo siguiente. Si no, el trazo proporciona contexto sobre qué pasos 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 Kerberos y el registro de PAL basado en la seguridad

Para identificar mensajes de error específicos en el PAL (Capa de Abstracción de Plataforma), habilitar security.kerberos y security.ldap registrar. Crea un logger.ini archivo con el siguiente contenido en /var/opt/mssql/, y luego reinicia SQL Server para capturar cualquier error de inicialización. Reproduzca el error. El PAL registra los errores de Active Directory y los mensajes de depuración en /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

SQL Server detecta cambios en el registro sin logger.ini reiniciar, pero los fallos durante la inicialización del servicio de Active Directory al iniciar SQL Server pasan desapercibidos. Reiniciar SQL Server captura todos los mensajes de error.

Tenga en cuenta que el registro de seguridad sigue escribiendo en la unidad hasta que quite los cambios en logger.ini. Desactiva security.kerberos y security.ldap registra el registro una vez que identifiques y resuelvas el problema, para evitar quedarte sin espacio en el disco.

El registrador de PAL genera archivos de registro con el formato siguiente:

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

Por ejemplo, a continuación se muestra una línea de ejemplo del registro:

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

Una vez que actives el registro PAL y reproduzcas el problema, busca el primer mensaje con un nivel de registro de Error. Utiliza la siguiente tabla para encontrar el error y sigue las directrices y recomendaciones para solucionar y solucionar el problema.

Mensajes de error comunes

Mensaje de error: "Error de inicio de sesión. El inicio de sesión es de un dominio no confiable y no puede usarse con autenticación integrada"

Causa posible

Te encuentras con este error cuando intentas iniciar sesión con una cuenta de Active Directory después de configurar la autenticación de Active Directory.

Orientación

Este mensaje de error genérico requiere que habilite el registro PAL para identificar el error específico.

Consulte la siguiente lista de errores comunes para identificar la posible causa de cada uno y luego siga las directrices de solución de problemas para resolver el problema.

Mensajes de error
No se encuentra el usuario o grupo de Windows NT 'CONTOSO\user'
Could not look up short domain name due to error (No se pudo buscar un nombre de dominio corto debido a un error)
Could not perform rDNS lookup for host <hostname> due to error (No se pudo realizar una búsqueda de rDNS del host debido a un error)
FQDN not returned by rDNS lookup (FQDN no devuelto por la búsqueda de rDNS)
Failed to bind to LDAP server (No se pudo enlazar al servidor LDAP)
No se encuentra la entrada de la tabla de claves
No se ha encontrado ninguna entrada en la tabla de claves para <principal>
servidor de vales de solicitud <principal> no se encuentra en keytab (vale kvno <KVNO>)
Servidor de vales de solicitud <entidad de seguridad> kvno <> KVNO que se encuentra en keytab, pero no con el tipo de cifrado encriptación <>
Servidor de vales de solicitud <entidad de seguridad> kvno <KVNO> tipo de cifrado <> encontrado en keytab, pero no puede descifrar

Mensaje de error: No se encuentra el usuario o grupo de Windows NT 'CONTOSO\user'

Causa posible

Puede encontrar este error al intentar crear el inicio de sesión de Windows o durante group refresh.

Orientación

Para validar el problema, sigue la guía de "Inicio de sesión fallido. El inicio de sesión procede de un dominio que no es de confianza y no se puede utilizar con la autenticación integrada. (Microsoft SQL Server, Error: 18452)" y habilitar el registro PAL para identificar el error específico y solucionar el problema en consecuencia.

Mensaje de error: "Could not look up short domain name due to error" (No se pudo buscar un nombre de dominio corto debido a un error)

Causa posible

La sintaxis de Transact-SQL para crear un inicio de sesión de Active Directory es:

CREATE LOGIN [CONTOSO\user]
    FROM WINDOWS;

El nombre NetBIOS (CONTOSO) es necesario en el comando, pero la FQDN del dominio (contoso.com) debe proporcionarse en el backend al realizar una conexión LDAP. Para realizar esta conversión, se realiza una búsqueda de DNS en CONTOSO para su resolución en la dirección IP de un controlador de dominio, al que se puede enlazar para las consultas LDAP.

Orientación

El mensaje de error "No se pudo buscar nombre de dominio corto debido a error" sugiere que nslookup for contoso no se resuelve a la dirección IP del controlador de dominio. Revisa las búsquedas DNS y las consultas DNS inversas para confirmar que nslookup tanto la coincidencia de NetBIOS como de dominio coinciden.

Mensajes de error: "No se pudo realizar la búsqueda de rDNS para host <hostname> debido a un error" o "FQDN no devuelto por la búsqueda rDNS"

Causa posible

Estos mensajes de error suelen indicar que los registros DNS inversos (registros PTR) no existen para todos los controladores de dominio.

Orientación

Compruebe las consultas DNS y DNS inverso. Después de identificar los controladores de dominio que no tienen entradas rDNS, tienes dos opciones:

  • Agregar entradas rDNS para todos los controladores de dominio

    Esta configuración no es de SQL Server, y debes configurarla a nivel de dominio. Puede que tengas que trabajar con tu equipo de administración de dominios para crear los registros PTR necesarios para todos los controladores de dominio que nslookup devuelven el nombre de dominio.

  • Restringir SQL Server a un subconjunto de controladores de dominio

    Si no puedes añadir registros PTR para todos los controladores de dominio devueltos, puedes limitar SQL Server a un subconjunto de controladores de dominio.

Mensaje de error: "Failed to bind to LDAP server ldap://CONTOSO.COM:3268: Local Error" (No se pudo enlazar al servidor LDAP ldap://CONTOSO.COM:3268: Local Error)

Causa posible

Este error genérico de OpenLDAP normalmente significa una de estas dos cosas:

  • Sin credenciales
  • Problemas de rDNS

Este es un ejemplo del mensaje de error:

12/09/2021 14:32:11.319933684 Error [security.ldap] <0000000142/0x000001c0> Failed to bind to LDAP server ldap://[CONTOSO.COM:3268]: Local error

Orientación

  • Sin credenciales

    Otros mensajes de error aparecen primero si las credenciales no se cargan para las conexiones LDAP. Activa el registro PAL y revisa el registro de errores en busca de mensajes de error antes de este. Si no hay ningún otro error, lo más probable es que no se trate de un problema de credenciales. Si encuentras un error, arréglalo antes de continuar. En la mayoría de los casos, es uno de los mensajes de error que cubre este artículo.

  • Problemas de rDNS

    Compruebe las consultas DNS y DNS inverso.

    Cuando la biblioteca OpenLDAP se conecta a un controlador de dominio, proporciona o bien el nombre de dominio totalmente calificado (FQDN), que en este ejemplo es contoso.com, o bien el FQDN (kdc1.contoso.com). Tras establecer la conexión (pero antes de devolver el éxito al llamante), la biblioteca OpenLDAP comprueba la IP del servidor al que se conectó. A continuación, realiza una búsqueda DNS inversa y comprueba que el nombre del servidor al que se conectó (kdc1.contoso.com) coincida con el dominio solicitado (contoso.com). Si no coincide, la biblioteca OpenLDAP produce un error en la conexión como característica de seguridad. Esta discrepancia es parte de la razón por la que la configuración de rDNS es importante para SQL Server en Linux, y es el foco de este artículo.

Mensaje de error: "Key table entry not found" (No se encuentra la entrada de keytab)

Causa posible

Este error indica problemas de acceso con el archivo keytab o entradas ausentes en la keytab.

Orientación

Asegúrese de que el archivo keytab tiene el nivel de acceso y los permisos correctos. La ubicación y nombre por defecto del archivo keytab es /var/opt/mssql/secrets/mssql.keytab. Para ver los permisos actuales en todos los archivos de la carpeta secrets, ejecuta este comando:

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

Utiliza estos comandos para establecer los permisos y el nivel de acceso en el archivo keytab:

sudo chown mssql /var/opt/mssql/secrets/mssql.keytab
sudo chmod 440 /var/opt/mssql/secrets/mssql.keytab

Para obtener más información sobre cómo enumerar las entradas de keytab y establecer los permisos correctos, consulte la sección anterior Comprobar el archivo keytab y los permisos. Si no cumples ninguna de las condiciones de esa sección, verás este error o un error equivalente: "Key table entry not found".

Mensaje de error: "No se encontró ninguna entrada en la tabla de claves para <principal>"

Causa posible

Cuando intentas recuperar las credenciales <principal> desde la tecla de teclado, no encuentras ninguna entrada aplicable.

Orientación

Para enumerar todas las entradas de la tabla keytab, siga la sección Comprobar el archivo keytab y los permisos de este artículo. Asegúrese de que <principal> está presente. En este caso, la cuenta principal suele ser la network.privilegedadaccount que registras los SPNs. Si no lo es, añádelo con el adutil comando. Para obtener más información, consulte Uso de adutil para configurar la autenticación de Active Directory con SQL Server en Linux.

Mensaje de error: "Request ticket server <principal> not found in keytab (ticket <KVNO>)" (No se encuentra el servidor de vales de solicitud entidad de seguridad en el archivo keytab [vale kvno KVNO])

Causa posible

Este error indica que SQL Server no puede encontrar una entrada en keytab para el ticket solicitado con el número de versión de clave especificado (KVNO).

Orientación

Para enumerar todas las entradas de la tabla keytab, siga la sección Comprobar el archivo keytab y los permisos de este artículo. Si no encuentras un mensaje de error que coincida con <principal> el KVNO, actualiza el archivo keytab para añadir esta entrada, siguiendo los pasos de esa sección.

También puede ejecutar el siguiente comando para obtener el KVNO más reciente del controlador de dominio. Antes de ejecutar este comando, obtén o renueva el TGT de Kerberos con el kinit comando. Para obtener más información, consulte Uso de adutil para crear un usuario de Active Directory para SQL Server y establecer el nombre de entidad de seguridad de servicio (SPN).

kvno MSSQLSvc/<hostname>

Mensaje de error: "Servidor de vales de solicitud <entidad de seguridad> kvno <KVNO> encontrado en keytab pero no con enctype <tipo de cifrado>"

Causa posible

Este error significa que la pestaña de claves de SQL Server no contiene el tipo de cifrado que solicita el cliente.

Orientación

Para validar, siga la sección Comprobar archivo de teclas y permisos de este artículo para listar todas las entradas en la pestaña de claves. Si no encuentras un mensaje de error que coincida con el principal, KVNO y tipo de cifrado, actualiza el archivo keytab para añadir esta entrada, siguiendo los pasos de esa sección.

Mensaje de error: "Se encontró en keytab el servidor del tique solicitado <principal> kvno <KVNO> enctype <tipo de cifrado>, pero no se puede descifrar el tique"

Causa posible

Este mensaje de error indica que SQL Server no puede usar una credencial del archivo keytab para descifrar la solicitud de autenticación entrante. Una contraseña incorrecta suele causar este error.

Orientación

Recrea la pestaña de teclas con la contraseña correcta. Si usas adutil, crea la pestaña de teclas con la contraseña correcta y sigue los pasos del Tutorial: Usa adutil para configurar la autenticación de Active Directory con SQL Server en Linux.

Puertos comunes

Esta tabla muestra los puertos comunes que SQL Server en Linux utiliza para configurar y administrar la autenticación de Active Directory.

Servicio de Active Directory Puerto
DNS 53
LDAP (Protocolo Ligero de Acceso a Directorios) 389
LDAPS 636
Kerberos 88