Compartir vía


Síntoma: se produce un error en el inicio de sesión del modo AD: dominio que no es de confianza (clústeres de macrodatos)

Importante

El complemento Clústeres de macrodatos de Microsoft SQL Server 2019 se va a retirar. La compatibilidad con Clústeres de macrodatos de SQL Server 2019 finalizará el 28 de febrero de 2025. Todos los usuarios existentes de SQL Server 2019 con Software Assurance serán totalmente compatibles con la plataforma, y el software se seguirá conservando a través de actualizaciones acumulativas de SQL Server hasta ese momento. Para más información, consulte la entrada de blog sobre el anuncio y Opciones de macrodatos en la plataforma Microsoft SQL Server.

En un clúster de macrodatos de SQL Server en modo de Active Directory, se puede producir un error en un intento de conexión y el intento de conexión devuelve el siguiente error:

Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.

Esto puede ocurrir cuando ha configurado entradas DNS como CNAME que apunta a un nombre de alias del proxy inverso que distribuye el tráfico a los nodos de Kubernetes.

Causa principal

Cuando los puntos de conexión están configurados con registros DNS que utilizan CNAME para apuntar a un nombre de alias de un proxy inverso que distribuye el tráfico a los nodos de Kubernetes:

  • El proceso de autenticación Kerberos busca un nombre de entidad de seguridad de servicio (SPN) que coincida con la entrada de CNAME, y no con el verdadero SPN registrado por BDC en Active Directory.
  • Error de autenticación

Confirmación de la causa principal

Después de que se produzca un error en la autenticación, compruebe la caché de vales kerberos.

Para comprobar la memoria caché de tickets, use el comando klist.

Busque un ticket con un SPN que coincida con el punto de conexión al cual intentaste conectarte.

El billete esperado no está ahí.

En este ejemplo, un endpoint maestro, bdc-sql, el registro DNS es un CNAME configurado a un proxy inverso denominado ServerReverseProxy

Resolve-DnsName bdc-sql

En la sección siguiente se muestran los resultados del comando anterior.

Name                           Type   TTL   Section    NameHost
----                           ----   ---   -------    --------
bdc-sql.mydomain.com           CNAME  3600  Answer     ReverseProxyServer.mydomain.com

Name       : ReverseProxyServer.mydomain.com
QueryType  : A
TTL        : 3600
Section    : Answer
IP4Address : 193.168.5.10

Nota:

En la sección siguiente se hace referencia a tshark. tshark es una utilidad de línea de comandos instalada como parte de la utilidad de seguimiento de red wireshark ).

Para ver el SPN solicitado desde Active Directory, use tshark. El siguiente comando limita la captura de seguimiento de red a la comunicación del protocolo Kerberos y muestra solo mensajes de krb-error (30). Estos mensajes deben contener mensajes de solicitud SPN fallida.

tshark -Y "kerberos && kerberos.msg_type == 30" -T fields -e kerberos.error_code -e kerberos.SNameString

Desde otro terminal de comandos, intente conectarse al pod maestro.

klist purge

sqlcmd -S bdc-sql.mydomain.com,31433 -E

Consulte la salida del ejemplo siguiente.

klist purge

Current LogonId is 0:0xf6b58
        Deleting all tickets:
        Ticket(s) purged!

sqlcmd -S bdc-sql.mydomain.com,31433 -E
sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.

Revise la tshark salida.

Capturing on 'Ethernet 3'
25      krbtgt,RLAZURE.COM
7       MSSQLSvc,ReverseProxyServer.mydomain.com:31433
2 packets captured

Observe las solicitudes SPN MSSQLSvc,ReverseProxyServer.mydomain.com:31433 de cliente que no existen. El intento de conexión finalmente produce el error 7. El error 7 significa KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN Server not found in Kerberos database.

En la configuración correcta, el cliente solicita el SPN registrado por BDC. En el ejemplo, el SPN correcto habría sido MSSQLSvc,bdc-sql.mydomain.com:31433.

Nota:

El error 25 significa KDC_ERR_PREAUTH_REQUIRED : se requiere autenticación previa adicional. Se puede omitir de forma segura. KDC_ERR_PREAUTH_REQUIRED se devuelve en la solicitud de AD Kerberos inicial. De forma predeterminada, el cliente Kerberos de Windows no incluye información de autenticación previa en esta primera solicitud.

Para ver la lista de SPN registrados por BDC para el punto de conexión maestro, ejecute setspn -L mssql-master.

Consulte la salida del ejemplo siguiente:

Registered ServicePrincipalNames for CN=mssql-master,OU=bdc,DC=mydomain,DC=com:
        MSSQLSvc/bdc-sqlread.mydomain.com:31436
        MSSQLSvc/-sqlread:31436
        MSSQLSvc/bdc-sqlread.mydomain.com
        MSSQLSvc/bdc-sqlread
        MSSQLSvc/bdc-sql.mydomain.com:31433
        MSSQLSvc/bdc-sql:31433
        MSSQLSvc/bdc-sql.mydomain.com
        MSSQLSvc/bdc-sql
        MSSQLSvc/master-p-svc.mydomain.com:1533
        MSSQLSvc/master-p-svc:1533
        MSSQLSvc/master-p-svc.mydomain.com:1433
        MSSQLSvc/master-p-svc:1433
        MSSQLSvc/master-p-svc.mydomain.com
        MSSQLSvc/master-p-svc
        MSSQLSvc/master-svc.mydomain.com:1533
        MSSQLSvc/master-svc:1533
        MSSQLSvc/master-svc.mydomain.com:1433
        MSSQLSvc/master-svc:1433
        MSSQLSvc/master-svc.mydomain.com
        MSSQLSvc/master-svc

En los resultados anteriores la dirección de proxy inverso no debe registrarse.

Resolver

En esta sección se muestran dos maneras de resolver el problema. Después de realizar los cambios adecuados, ejecute ipconfig -flushdns y klist purge en el cliente. A continuación, intente conectarse de nuevo.

Opción 1

Quite el registro CNAME de cada punto de conexión de BDC en DNS y reemplácelo por varios registros A que apunten a cada nodo de Kubernetes o a cada maestro de Kubernetes si tiene más de un maestro.

Sugerencia

El script descrito a continuación usa PowerShell. Consulte Instalación de PowerShell en Linux para obtener más información.

Puede usar el siguiente script de PowerShell para actualizar los registros de puntos de conexión DNS. Ejecute el script desde cualquier equipo conectado al mismo dominio:

#Specify the DNS server, example contoso.local
$Domain_DNS_name=mydomain.com'

#DNS records for bdc endpoints
$Controller_DNS_name = 'bdc-control'
$Managment_proxy_DNS_name= 'bdc-proxy'
$Master_Primary_DNS_name = 'bdc-sql'
$Master_Secondary_DNS_name = 'bdc-sqlread'
$Gateway_DNS_name = 'bdc-gateway'
$AppProxy_DNS_name = 'bdc-appproxy'

#Performing Endpoint DNS records Checks..

#Build array of endpoints 
$BdcEndpointsDns = New-Object System.Collections.ArrayList

[void]$BdcEndpointsDns.Add($Controller_DNS_name)
[void]$BdcEndpointsDns.Add($Managment_proxy_DNS_name)
[void]$BdcEndpointsDns.Add($Master_Primary_DNS_name)
[void]$BdcEndpointsDns.Add($Master_Secondary_DNS_name)
[void]$BdcEndpointsDns.Add($Gateway_DNS_name)
[void]$BdcEndpointsDns.Add($AppProxy_DNS_name)

#Build array for results 
$BdcEndpointsDns_Result = New-Object System.Collections.ArrayList

foreach ($DnsName in $BdcEndpointsDns) {
    try {
        $endpoint_DNS_record = Resolve-DnsName $DnsName -Type A -Server $Domain_DNS_IP_address -ErrorAction Stop 
        foreach ($ip in $endpoint_DNS_record.IPAddress) {
            [void]$BdcEndpointsDns_Result.Add("OK - $DnsName is an A record with an IP $ip")
        }
    }
    catch {
        [void]$BdcEndpointsDns_Result.Add("MisConfiguration - $DnsName is not an A record or does not exists")
    }  
}

#show the results 
$BdcEndpointsDns_Result

Opción 2

Como alternativa, es posible solucionar el problema modificando el CNAME para que apunte a la dirección IP del proxy inverso en lugar del nombre del proxy inverso.

Confirmar resolución

Después de resolar la corrección con una de las opciones anteriores, confirme la corrección mediante la conexión al clúster de macrodatos con Active Directory.

Pasos siguientes

Verifique la entrada de DNS inversa (registro PTR) para el controlador de dominio.