Risoluzione dei problemi relativi all'autenticazione Active Directory per SQL Server in Linux e in contenitori
Si applica a: SQL Server - Linux
Questo articolo illustra come risolvere i problemi di autenticazione di Active Directory Domain Services con SQL Server in Linux e contenitori. Include controlli e suggerimenti prerequisiti per la corretta configurazione di Active Directory e un elenco di errori e procedure di risoluzione dei problemi comuni.
Convalida della configurazione corrente
Prima di iniziare la risoluzione dei problemi, è necessario convalidare l'utente corrente, mssql.conf
, il nome dell'entità servizio (SPN) e le impostazioni dell'area di autenticazione.
Ottieni o rinnova il ticket-granting ticket (TGT) Kerberos usando il comando
kinit
:kinit privilegeduser@CONTOSO.COM
Esegui il comando seguente, assicurandoti che l'utente con cui si esegue questo comando abbia accesso a
mssql.keytab
:/opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab
Per altre informazioni sul comando
validate-ad-config
, vedi la Guida tramite il comando/opt/mssql/bin/mssql-conf validate-ad-config --help
.
Ricerche DNS e DNS inverso
Le ricerche DNS sul nome di dominio e sul nome NetBIOS devono restituire lo stesso indirizzo IP, che normalmente corrisponde all'indirizzo IP per il controller di dominio. Eseguire questi comandi dal computer host di SQL Server.
nslookup contoso nslookup contoso.com
Se gli indirizzi IP non corrispondono, vedere Aggiungere SQL Server in un host Linux a un dominio Active Directory per correggere le comunicazioni e le ricerche DNS con il controller di dominio.
Eseguire una ricerca del DNS inverso (rDNS) per ogni indirizzo IP elencato nei risultati precedenti. Ricordarsi di includere indirizzi IPv4 e IPv6, se applicabile.
nslookup <IPs returned from the above commands>
Il valore restituito dovrebbe essere
<hostname>.contoso.com
. In caso contrario, controllare i record PTR (puntatore) creati in Active Directory.Potrebbe essere necessario rivolgersi all'amministratore del dominio per il corretto funzionamento della ricerca DNS inverso. Se non è possibile aggiungere voci PTR per tutti gli indirizzi IP restituiti, è anche possibile limitare SQL Server a un subset di controller di dominio. Questa modifica influisce su tutti gli altri servizi che usano
krb5.conf
nell'host.Per altre informazioni sul DNS inverso, vedere Che cos'è il DNS inverso?
Controllare il file keytab e le autorizzazioni
Verificare di aver creato il file keytab (tabella chiave) e che mssql-conf sia configurato per usare il file corretto con le autorizzazioni appropriate. Il file keytab deve essere accessibile all'account utente
mssql
. Per altre informazioni, vedi Usare adutil per configurare l'autenticazione di Active Directory con SQL Server in Linux.Assicurarsi di poter elencare il contenuto della scheda chiave e di aver aggiunto i nomi SPN, la porta, il tipo di crittografia e l'account utente corretti. Se non si digitano correttamente le password durante la creazione dei nomi SPN e delle voci keytab, si verificano errori durante il tentativo di accesso tramite l'autenticazione di Active Directory.
klist -kte /var/opt/mssql/secrets/mssql.keytab
Di seguito è riportato un esempio di keytab funzionante. L'esempio usa due tipi di crittografia, ma è possibile usarne solo uno o più a seconda dei tipi di crittografia supportati nell'ambiente in uso. Nell'esempio è
sqluser@CONTOSO.COM
l'account con privilegi (che corrisponde all'impostazionenetwork.privilegedadaccount
in mssql-conf) e il nome host per SQL Server èsqllinux.contoso.com
in ascolto sulla porta1433
predefinita.$ 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 mssql.keytab Keytab name: FILE: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)
Convalidare le informazioni sull'area di autenticazione in krb5.conf
In
krb5.conf
(disponibile in/etc/krb5.conf
) verificare di specificare i valori per l'area di autenticazione predefinita, le informazioni sull'area di autenticazione e il mapping del dominio all'area di autenticazione. Quello seguente è un esempio di filekrb5.conf
. Per altre informazioni, vedere Informazioni sull'autenticazione di Active Directory per SQL Server in Linux e contenitori.[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
È possibile limitare SQL Server affinché contatti un subset di controller di dominio, operazione utile se la configurazione DNS restituisce più controller di dominio rispetto a quelli che SQL Server deve contattare. SQL Server in Linux consente di specificare un elenco di controller di dominio contattati da SQL Server in modo round robin durante l'esecuzione di una ricerca LDAP (Lightweight Directory Access Protocol).
A tale scopo, è necessario completare due passaggi. Prima di tutto, modificare
krb5.conf
aggiungendo il numero di controller di dominio necessari, preceduti dakdc =
.[realms] CONTOSO.COM = { kdc = kdc1.contoso.com kdc = kdc2.contoso.com .. .. }
Tenere presente che
krb5.conf
si tratta di un file di configurazione client Kerberos comune, pertanto tutte le modifiche apportate in questo file influiscono su altri servizi oltre a SQL Server. Prima di apportare modifiche, consultare l'amministratore del dominio.È quindi possibile abilitare l'impostazione
network.enablekdcfromkrb5conf
usando mssql-conf e quindi riavviare SQL Server:sudo /opt/mssql/bin/mssql-conf set network.enablekdcfromkrb5conf true sudo systemctl restart mssql-server
Risoluzione dei problemi di Kerberos
Vedi i dettagli seguenti per facilitare la risoluzione dei problemi di autenticazione di Active Directory e l'identificazione di messaggi di errore specifici.
Tracciare Kerberos
Dopo aver creato l'utente, i nomi SPN, i file keytab e aver configurato mssql-conf per verificare che la configurazione di Active Directory per SQL Server in Linux sia corretta, è possibile visualizzare i messaggi di traccia di Kerberos nella console (stdout
) quando si tenta di ottenere o rinnovare il ticket TGT Kerberos con l'account con privilegi, usando questo comando:
root@sqllinux mssql# KRB5_TRACE=/dev/stdout kinit -kt /var/opt/mssql/secrets/mssql.keytab sqluser
Se non si verificano problemi, verrà visualizzato un output simile all'esempio seguente. In caso contrario, la traccia fornisce il contesto dei passaggi da esaminare.
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
Abilitare la registrazione PAL basata su sicurezza e Kerberos
È possibile abilitare la registrazione security.kerberos
e security.ldap
per identificare messaggi di errore specifici nel livello di astrazione della piattaforma (PAL). Crea un file logger.ini
con il contenuto seguente in /var/opt/mssql/
, riavvia SQL Server e quindi riproduci l'errore. I messaggi di errore e debug di Active Directory dell'elenco di accesso alla pubblicazione vengono registrati in /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
Non è necessario riavviare SQL Server per la selezione delle modifiche del logger da logger.ini
, ma durante l'inizializzazione del servizio Active Directory o all'avvio di SQL Server possono verificarsi errori che altrimenti non verrebbero rilevati. Il riavvio di SQL Server assicura che vengano acquisiti tutti i messaggi di errore.
Il registro di protezione continua a scrivere nell'unità fino a quando non vengono rimosse le modifiche in logger.ini
. Ricordarsi di disabilitare e security.ldap
registrare security.kerberos
una volta identificato e risolto il problema, per evitare di esaurire spazio nell'unità.
Il logger PAL genera i file di log nel formato seguente:
<DATETIME> <Log level> [<logger>] <<process/thread identifier>> <message>
Ad esempio, di seguito è mostrata una riga di esempio 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
Dopo aver abilitato la registrazione PAL e riprodotto il problema, cerca il primo messaggio con un livello di log di Error
, quindi usa la tabella seguente per trovare l'errore e seguire le indicazioni e le raccomandazioni per risolvere il problema.
Messaggi di errore comuni
Messaggio di errore: "Non è possibile eseguire l'accesso. L'account di accesso proviene da un dominio non attendibile e non può essere usato con l'autenticazione integrata."
Possibile causa
Questo errore si verifica quando si tenta di accedere usando un account Active Directory, dopo aver configurato l'autenticazione di Active Directory.
Indicazioni
Questo messaggio di errore generico richiede di abilitare la registrazione pal per identificare l'errore specifico.
Fare riferimento all'elenco seguente di errori comuni per identificare la possibile causa di ogni errore, quindi seguire le indicazioni per la risoluzione dei problemi per risolvere il problema.
Messaggio di errore: Impossibile trovare l'utente o il gruppo di Windows NT 'CONTOSO\user'
Possibile causa
Questo errore può verificarsi quando si tenta di creare l'account di accesso di Windows o durante l'aggiornamento del gruppo.
Indicazioni
Per convalidare il problema, seguire le indicazioni come documentato per "Accesso non riuscito. L'account di accesso proviene da un dominio non attendibile e non può essere usato con l'autenticazione integrata. (Microsoft SQL Server, Errore: 18452)" Abilitare la registrazione PAL per identificare l'errore specifico e risolvere i problemi di conseguenza.
Messaggio di errore: Non è stato possibile trovare il nome di dominio breve a causa di un errore"
Possibile causa
La sintassi Transact-SQL per creare un account di accesso Active Directory è:
CREATE LOGIN [CONTOSO\user]
FROM WINDOWS;
Il nome NetBIOS (CONTOSO
) è obbligatorio nel comando, ma nel back-end quando si esegue una connessione LDAP, è necessario specificare il nome di dominio completo del dominio (contoso.com
). A tale scopo, viene eseguita una ricerca DNS in CONTOSO
per restituire l'indirizzo IP di un controller di dominio, a cui può quindi essere associato per le query LDAP.
Indicazioni
Il messaggio di errore "Non è stato possibile trovare il nome di dominio breve a causa di un errore" suggerisce che nslookup
per contoso
non restituisce l'indirizzo IP del controller di dominio. È consigliabile esaminare le ricerche DNS e DNS inverso per verificare che nslookup
corrisponda sia per NetBIOS che per il nome di dominio.
Messaggi di errore: "Impossibile eseguire la ricerca rDNS per il nome> host host <a causa di un errore" o "FQDN non restituito dalla ricerca rDNS"
Possibile causa
Questo messaggio di errore indica in genere che i record DNS inversi (record PTR) non esistono per tutti i controller di dominio.
Indicazioni
Controllare le ricerche DNS e DNS inverso. Dopo aver identificato i controller di dominio che non dispongono di voci DNS inverso, sono disponibili due opzioni:
Aggiungere voci DNS inverso per tutti i controller di dominio
Questa impostazione non è un'impostazione di SQL Server e deve essere configurata a livello di dominio. Potrebbe essere necessario collaborare con il team di amministrazione del dominio per creare i record PTR necessari per tutti i controller di dominio restituiti durante l'esecuzione di
nslookup
sul nome di dominio.Limitare SQL Server a un subset di controller di dominio
Se non è possibile aggiungere record PTR per tutti i controller di dominio restituiti, è possibile limitare SQL Server a un subset di controller di dominio.
Messaggio di errore: "L'associazione al server LDAP ldap://CONTOSO.COM:3268 non è riuscita: Errore locale"
Possibile causa
Questo errore generico da OpenLDAP significa in genere una delle due cose seguenti:
- Nessuna credenziale
- Problemi di DNS inverso
Di seguito è riportato un esempio del messaggio di errore:
12/09/2021 14:32:11.319933684 Error [security.ldap] <0000000142/0x000001c0> Failed to bind to LDAP server ldap://[CONTOSO.COM:3268]: Local error
Indicazioni
Nessuna credenziale
Altri messaggi di errore vengono generati prima se le credenziali non vengono caricate per le connessioni LDAP. È consigliabile abilitare la registrazione PAL e verificare la presenza di messaggi di errore prima di questo. Se non sono presenti altri errori, è molto probabile che non si tratti di un problema di credenziali. Se ne viene trovato uno, correggere il messaggio di errore visualizzato. Nella maggior parte dei casi, si tratta di uno dei messaggi di errore trattati in questo articolo.
Problemi di DNS inverso
Controllare le ricerche DNS e DNS inverso.
Quando la libreria OpenLDAP si connette a un controller di dominio, viene fornito il nome di dominio completo (FQDN), che in questo esempio è
contoso.com
o il nome di dominio completo (kdc1.contoso.com
) del controller di dominio. Una volta stabilita la connessione (ma prima di restituire l'esito positivo al chiamante), la libreria OpenLDAP controlla l'indirizzo IP del server a cui è connessa. Esegue quindi una ricerca DNS inversa e verifica che il nome del server connesso a (kdc1.contoso.com
) corrisponda al dominio per cui è stata richiesta la connessione (contoso.com
). Se non corrisponde, la libreria OpenLDAP non riesce la connessione come funzionalità di sicurezza. Questo è il motivo per cui le impostazioni rDNS sono così importanti per SQL Server in Linux e sono l'obiettivo di questo articolo.
Messaggio di errore: "Voce del file keytab non trovata"
Possibile causa
Questo errore indica i problemi di accesso con il file keytab o che nel file keytab non sono presenti tutte le voci necessarie.
Indicazioni
Assicurarsi che il file keytab disponga del livello di accesso e delle autorizzazioni corretti. Il percorso predefinito e il nome del file keytab sono /var/opt/mssql/secrets/mssql.keytab
. Per visualizzare le autorizzazioni correnti per tutti i file nella cartella secrets, è possibile eseguire questo comando:
sudo ls -lrt /var/opt/mssql/secrets
È possibile usare questi comandi per impostare le autorizzazioni e il livello di accesso per il file keytab:
sudo chown mssql /var/opt/mssql/secrets/mssql.keytab
sudo chmod 440 /var/opt/mssql/secrets/mssql.keytab
Per altre informazioni sull'elenco delle voci della scheda delle chiavi e sull'impostazione delle autorizzazioni corrette, vedere la sezione precedente Controllare il file keytab e le autorizzazioni . Se una delle condizioni in tale sezione non viene soddisfatta, viene visualizzato questo o equivalente errore: "Key table entry not found"
.
Messaggio di errore: "Non sono state trovate voci del file keytab per l'<entità di sicurezza>"
Possibile causa
Quando si tenta di recuperare le credenziali di <principal>
dal file keytab, non vengono trovate voci applicabili.
Indicazioni
Per elencare tutte le voci nella scheda chiave, seguire la sezione Controlla file keytab e autorizzazioni di questo articolo. Assicurarsi che sia presente la voce <principal>
. In questo caso, l'account principale è in genere quello network.privilegedadaccount
in cui sono registrati i nomi SPN. In caso contrario, aggiungerlo usando il comando adutil. Per altre informazioni, vedi Usare adutil per configurare l'autenticazione di Active Directory con SQL Server in Linux.
Messaggio di errore: "L'<entità di sicurezza> del server del ticket richiesto non è stata trovata nel file keytab (KVNO ticket <KVNO>)"
Possibile causa
Questo errore indica che SQL Server non è riuscito a trovare una voce keytab per il ticket richiesto con il numero di versione chiave (KVNO) specificato.
Indicazioni
Per elencare tutte le voci nella scheda chiave, seguire la sezione Controlla file keytab e autorizzazioni di questo articolo. Se non si trova un messaggio di errore corrispondente a <principal>
e KVNO, aggiungere questa voce aggiornando il file keytab usando i passaggi indicati in tale sezione.
È anche possibile eseguire il comando seguente per ottenere il KVNO più recente dal controller di dominio. Prima di eseguire questo comando, è necessario ottenere o rinnovare il tiket TGT Kerberos usando il comando kinit. Per altre informazioni, vedi Usare adutil per creare un utente Active Directory per SQL Server e impostare il nome dell'entità servizio (SPN).
kvno MSSQLSvc/<hostname>
Messaggio di errore: "È stato trovato il KVNO <KVNO> dell'<entità di sicurezza> del server del ticket richiesto è stato trovato nel file keytab ma non con il tipo di crittografia <tipo di crittografia>"
Possibile causa
Questo errore indica che il tipo di crittografia richiesto dal client non è presente nel file keytab di SQL Server.
Indicazioni
Per la convalida, seguire la sezione Controllare il file keytab e le autorizzazioni di questo documento per elencare tutte le voci nel file keytab. Se non si trova un messaggio di errore corrispondente all'entità di sicurezza, KVNO e tipo di crittografia, aggiungere questa voce aggiornando il file keytab usando i passaggi indicati in tale sezione.
Messaggio di errore: "È stato trovato il tipo di crittografia <tipo di crittografia> del KVNO <KVNO> dell'<entità di sicurezza> del server del ticket richiesto nel file keytab ma non riesce a decrittografare il ticket"
Possibile causa
Questo errore indica che SQL Server non è riuscito a usare le credenziali del file keytab per decrittografare la richiesta di autenticazione in ingresso. L'errore è spesso il risultato di una password errata.
Indicazioni
Ricreare il file keytab usando la password corretta. Se si usa adutil, creare il keytab con la password corretta, seguendo la procedura descritta in Esercitazione: Usare adutil per configurare l'autenticazione di Active Directory con SQL Server in Linux.
Porte comuni
Questa tabella mostra le porte comuni usate da SQL Server in Linux per la configurazione e l'amministrazione dell'autenticazione di Active Directory.
Servizio Active Directory | Porta |
---|---|
DNS | 53 |
LDAP | 389 |
LDAPS | 636 |
Kerberos | 88 |