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 la tentative de connexion retourne l’erreur suivante :

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

Cela peut se produire lorsque vous avez configuré des entrées DNS en tant que CNAME pointant vers un nom d’alias de proxy inverse qui distribue le trafic aux nœuds Kubernetes.

Origine

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

  • Le processus d’authentification Kerberos recherche un nom de principal de service (SPN) qui correspond à l’entrée pour CNAME ; pas le nom de principal principal de service vrai inscrit par BDC dans Active Directory
  • Échec de l’authentification

Confirmer la cause racine

Une fois l’authentification échoué, vérifiez le cache des tickets Kerberos.

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

Recherchez un ticket avec un SPN correspondant au point de terminaison auquel vous avez essayé de vous connecter.

Le ticket attendu n'est pas disponible.

Dans cet exemple, un point de terminaison principal, bdc-sql, l’enregistrement DNS est configuré en tant que CNAME pour un proxy inverse nommé ServerReverseProxy

Resolve-DnsName bdc-sql

La section suivante présente 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

Remarque

La section suivante fait référence tshark. tshark est un utilitaire de ligne de commande installé dans le cadre de l’utilitaire de suivi réseau Wireshark ).

Pour voir le SPN demandé à partir d’Active Directory, utilisez tshark. La commande suivante limite la capture du suivi réseau aux communications du protocole Kerberos et n'affiche que les messages krb-error (30). Ces messages doivent contenir des messages de demande SPN ayant échoué.

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

À partir d’un autre interpréteur de commandes, essayez de vous connecter au pod maître :

klist purge

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

Consultez 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 tshark sortie.

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

Remarquez les demandes du client SPN MSSQLSvc,ReverseProxyServer.mydomain.com:31433 qui n'existe pas. La tentative de connexion échoue finalement avec l’erreur 7. Erreur 7 signifie KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN Server not found in Kerberos database.

Dans la configuration correcte, le client demande au SPN inscrit par BDC. Dans l’exemple, le spN correct aurait été MSSQLSvc,bdc-sql.mydomain.com:31433.

Remarque

Erreur 25 signifie KDC_ERR_PREAUTH_REQUIRED : pré-authentification supplémentaire requise. Elle peut être ignorée en toute sécurité. KDC_ERR_PREAUTH_REQUIRED est retourné sur la requête Kerberos AD initiale. Par défaut, le client Kerberos Windows n’inclut pas les informations de pré-authentification dans cette première requête.

Pour afficher la liste des SPN inscrits par BDC pour le point de terminaison maître, exécutez setspn -L mssql-master.

Consultez 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 montre 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. Ensuite, essayez de vous reconnecter.

Option 1 :

Supprimez l’enregistrement CNAME pour chaque point de terminaison BDC dans DNS et remplacez par plusieurs A enregistrements qui pointent vers chaque nœud Kubernetes ou chaque maître Kubernetes si vous avez plusieurs maîtres.

Conseil / Astuce

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 de n’importe quel 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 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

Option 2 :

Vous pouvez également contourner le problème en modifiant le CNAME pour qu’il pointe vers l’adresse IP du proxy inverse plutôt que le nom du proxy inverse.

Confirmer la résolution

Après avoir résolé le correctif avec l’une des options ci-dessus, confirmez le correctif en vous connectant au cluster Big Data avec Active Directory.

Étapes suivantes

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