Partager via


Symptôme : Échec de la connexion en mode AD – Domaine non approuvé (Clusters Big Data)

Important

Le module complémentaire Clusters Big Data Microsoft SQL Server 2019 sera mis hors service. La prise en charge de la plateforme Clusters Big Data Microsoft SQL Server 2019 se terminera le 28 février 2025. Tous les utilisateurs existants de SQL Server 2019 avec Software Assurance seront entièrement pris en charge sur la plateforme, et le logiciel continuera à être maintenu par les mises à jour cumulatives SQL Server jusqu’à ce moment-là. Pour plus d’informations, consultez le billet de blog d’annonce et les Options Big Data sur la plateforme Microsoft SQL Server.

Sur un cluster Big Data SQL Server en mode Active Directory, une tentative de connexion peut échouer et retourner l’erreur suivante :

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

Cela peut se produire quand des entrées DNS sont configurées en tant qu’enregistrements CNAME pointant vers un nom d’alias de proxy inverse qui répartit le trafic entre des nœuds Kubernetes.

Cause racine

Quand les points de terminaison sont configurés avec des entrées DNS avec CNAME pointant vers un nom d’alias de proxy inverse qui répartit le trafic entre des nœuds Kubernetes :

  • Le processus d’authentification Kerberos recherche un nom de principal du service (SPN) qui correspond à l’entrée de l’enregistrement CNAME ; il ne s’agit pas du véritable SPN inscrit par le cluster Big Data dans Active Directory
  • Échec de l’authentification

Vérifier la cause racine

Après l’échec de l’authentification, vérifiez le cache des tickets Kerberos.

Pour vérifier le cache des tickets, utilisez la commande klist.

Recherchez un ticket avec un nom de principal du service (SPN) correspondant au point de terminaison auquel vous avez essayé de vous connecter.

Le ticket attendu n’est pas présent.

Dans cet exemple de point de terminaison principal, l’entrée DNS bdc-sql définie en tant qu’enregistrement CNAME pointe vers le proxy inverse nommé ServerReverseProxy

Resolve-DnsName bdc-sql

La section suivante montre les résultats de la commande précédente.

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

Notes

La section suivante fait référence à tshark. tshark est un utilitaire de ligne de commande installé avec l’utilitaire de traçage réseau Wireshark.

Pour voir le SPN demandé à partir d’Active Directory, utilisez tshark. La commande suivante limite la capture du traçage réseau à la communication avec le protocole Kerberos et montre uniquement les messages krb-error (30). Ces messages doivent contenir des messages de demande SPN en échec.

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

À partir d’un interpréteur de commandes différent, essayez de vous connecter au pod principal :

klist purge

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

Examinez l’exemple de sortie suivant.

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.

Vérifiez la sortie de tshark.

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

Notez que le client demande SPN MSSQLSvc,ReverseProxyServer.mydomain.com:31433, qui n’existe pas. La tentative de connexion échoue finalement avec l’erreur 7. L’erreur 7 signifie KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN Server not found in Kerberos database.

Dans la configuration appropriée, le client demande le SPN inscrit par le cluster Big Data. Dans l’exemple, le SPN approprié aurait été MSSQLSvc,bdc-sql.mydomain.com:31433.

Notes

L’erreur 25 signifie KDC_ERR_PREAUTH_REQUIRED – Pré-authentification supplémentaire nécessaire. Elle peut être ignorée sans risque. KDC_ERR_PREAUTH_REQUIRED est retourné lors de la demande AD Kerberos initiale. Par défaut, le client Kerberos Windows n’inclut pas les informations de pré-authentification dans cette première demande.

Pour voir la liste des SPN inscrits par le cluster Big Data pour le point de terminaison principal, exécutez setspn -L mssql-master.

Examinez l’exemple de sortie suivant :

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

Dans les résultats ci-dessus, l’adresse du proxy inverse ne doit pas être inscrite.

Résoudre

Cette section propose deux façons de résoudre le problème. Après avoir apporté les modifications appropriées, exécutez ipconfig -flushdns et klist purge dans votre client. Réessayez ensuite de vous connecter.

Option 1 :

Supprimez l’enregistrement CNAME pour chaque point de terminaison de cluster Big Data dans DNS et remplacez ces enregistrements par plusieurs enregistrements A qui pointent vers chaque nœud Kubernetes ou chaque maître Kubernetes s’il en existe plusieurs.

Conseil

Le script décrit ci-dessous utilise PowerShell. Pour plus d’informations, consultez Installation de PowerShell sur Linux.

Vous pouvez utiliser le script PowerShell suivant pour mettre à jour les enregistrements de points de terminaison DNS. Exécutez le script à partir d’un ordinateur connecté au même domaine :

#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 arrary 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

Option 2 :

Il est possible aussi de contourner le problème en faisant pointer l’enregistrement CNAME vers l’adresse IP du proxy inverse plutôt que vers son nom.

Vérifier la résolution

Après avoir corrigé le problème avec l’une des options précédentes, vérifiez que tout est solutionné en vous connectant au cluster Big Data avec Active Directory.

Étapes suivantes

Vérifier l’entrée de DNS inversé (enregistrement PTR) pour le contrôleur de domaine.