Errore di accesso in modalità AD - Dominio non trusted (cluster Big Data)
Importante
Il componente aggiuntivo per i cluster Big Data di Microsoft SQL Server 2019 verrà ritirato. Il supporto per i cluster Big Data di SQL Server 2019 terminerà il 28 febbraio 2025. Tutti gli utenti esistenti di SQL Server 2019 con Software Assurance saranno completamente supportati nella piattaforma e fino a quel momento il software continuerà a ricevere aggiornamenti cumulativi di SQL Server. Per altre informazioni, vedere il post di blog relativo all'annuncio e Opzioni per i Big Data nella piattaforma Microsoft SQL Server.
In un cluster Big Data di SQL Server in modalità Active Directory un tentativo di connessione può non riuscire e viene restituito l'errore seguente:
Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication.
Questa situazione può verificarsi quando vengono configurate voci DNS come CNAME che punta a un nome di alias del proxy inverso che distribuisce il traffico ai nodi Kubernetes.
Causa principale
Quando gli endpoint vengono configurati con voci DNS con CNAME che punta a un nome di alias del proxy inverso che distribuisce il traffico ai nodi Kubernetes:
- Il processo di autenticazione Kerberos cerca un nome dell'entità servizio (SPN) corrispondente alla voce per CNAME; non si tratta del vero nome SPN registrato da BDC in Active Directory
- Errore di autenticazione
Confermare la causa radice
Dopo l'errore di autenticazione, controllare se sono presenti ticket Kerberos nella cache.
Per controllare la cache dei ticket, usare il comando klist
.
Cercare un ticket con un nome SPN corrispondente all'endpoint a cui si è tentato di connettersi.
Il ticket previsto non è presente.
In questo esempio, un endpoint master, il record DNS bdc-sql
è CNAME impostato sul proxy inverso denominato ServerReverseProxy
Resolve-DnsName bdc-sql
La sezione seguente mostra i risultati del comando precedente.
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
La sezione seguente fa riferimento a tshark
. tshark
è un'utilità della riga di comando installata come parte dell'utilità di traccia di rete Wireshark).
Per visualizzare il nome SPN richiesto da Active Directory, usare tshark
. Il comando seguente limita l'acquisizione della traccia di rete alla comunicazione del protocollo Kerberos e visualizza solo messaggi krb-error (30)
. Questi messaggi devono contenere messaggi per richieste SPN non riuscite.
tshark -Y "kerberos && kerberos.msg_type == 30" -T fields -e kerberos.error_code -e kerberos.SNameString
Da una shell dei comandi diversa, provare a connettersi al pod master:
klist purge
sqlcmd -S bdc-sql.mydomain.com,31433 -E
Vedere l'esempio di output seguente.
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.
Controllare l'output di tshark
.
Capturing on 'Ethernet 3'
25 krbtgt,RLAZURE.COM
7 MSSQLSvc,ReverseProxyServer.mydomain.com:31433
2 packets captured
Si notino che il client richiede SPN MSSQLSvc,ReverseProxyServer.mydomain.com:31433
che non esiste. Il tentativo di connessione ha infine esito negativo con l'errore 7. L'errore 7 indica KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN Server not found in Kerberos database
.
Nella configurazione corretta il client richiede il nome SPN registrato dal BDC. Nell'esempio il nome SPN corretto sarebbe stato MSSQLSvc,bdc-sql.mydomain.com:31433
.
Nota
L'errore 25 indica KDC_ERR_PREAUTH_REQUIRED
- necessaria pre-autenticazione aggiuntiva. Questo errore può essere ignorato. KDC_ERR_PREAUTH_REQUIRED
viene restituito nella richiesta AD Kerberos iniziale. Per impostazione predefinita, il client Kerberos di Windows non include le informazioni di pre-autenticazione nella prima richiesta.
Per visualizzare l'elenco di SPN registrato da BDC per l'endpoint master, eseguire setspn -L mssql-master
.
Vedere l'esempio di output seguente:
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
Nei risultati sopra riportati l'indirizzo del proxy inverso non deve essere registrato.
Risolvi
In questa sezione vengono illustrati due modi per risolvere il problema. Dopo avere apportato le modifiche appropriate, eseguire ipconfig -flushdns
e klist purge
nel client. Ritentare quindi la connessione.
Opzione 1
Rimuovere il record CNAME per ogni endpoint BDC in DNS e sostituire con più record A
che puntano a ogni nodo Kubernetes o a ogni master Kubernetes in presenza di più di un master.
Suggerimento
Lo script descritto di seguito usa PowerShell. Per altre informazioni, vedere Installazione di PowerShell in Linux.
È possibile usare lo script di PowerShell seguente per aggiornare i record degli endpoint DNS. Eseguire lo script da qualsiasi computer connesso allo stesso 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
Opzione 2
In alternativa, è possibile aggirare il problema modificando il CNAME in modo che punti all'indirizzo IP del proxy inverso anziché al nome del proxy inverso.
Confermare la risoluzione
Dopo aver corretto il problema con una delle opzioni precedenti, verificare la correzione connettendosi a un cluster Big Data con Active Directory.
Passaggi successivi
Verificare la voce DNS inversa (record PTR) per il controller di dominio.