Risoluzione dei problemi relativi all'autenticazione Active Directory per SQL Server in Linux e in contenitori

Si applica a:SQL Server su 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 del problema, valida l'utente corrente, mssql.confil Nome del Principale Servizio (SPN) e le impostazioni del regno.

  1. Ottieni o rinnova il Kerberos TGT (ticket di concessione dei biglietti) con:kinit

    kinit privilegeduser@CONTOSO.COM
    
  2. Esegui il seguente comando e assicurati che l'utente che lo esegue abbia accesso al mssql.keytab:

    /opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab
    

    Per maggiori informazioni sul validate-ad-config comando, esegui /opt/mssql/bin/mssql-conf validate-ad-config --help.

Ricerche DNS e DNS inverso

  1. 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.

  2. Esegui una ricerca DNS inversa (rDNS) per ogni indirizzo IP dai risultati precedenti. Includere indirizzi IPv4 e IPv6 dove applicabile.

    nslookup <IPs returned from the above commands>
    

    Il valore restituito dovrebbe essere <hostname>.contoso.com. Altrimenti, controlla i record PTR (puntatore) in Active Directory.

    Potrebbe essere necessario collaborare con l'amministratore del dominio per far funzionare l'rDNS. Se non puoi aggiungere voci PTR per tutti gli indirizzi IP restituiti, puoi anche limitare SQL Server a un sottoinsieme 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

  1. Controlla di aver creato il file keytab (key table) e di aver configurato mssql-conf per usare il file corretto con i permessi appropriati. 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.

  2. Assicurarsi di poter elencare il contenuto del keytab e di aver aggiunto correttamente gli SPN corretti, la porta, il tipo di crittografia e l'account utente. Se non digiti correttamente le password quando crei gli SPN e le voci keytab, incontri errori quando provi ad accedere con l'autenticazione 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'impostazione network.privilegedadaccount in mssql-conf) e il nome host per SQL Server è sqllinux.contoso.com in ascolto sulla porta 1433predefinita .

    $ 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 /var/opt/mssql/secrets/mssql.keytab
    
    Keytab name: FILE:/var/opt/mssql/secrets/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'ambito in krb5.conf

  1. 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 l'associazione del dominio all'area di autenticazione. Esamina il seguente file di esempio krb5.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
    
  2. È 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 ti permette di specificare un elenco di controller di dominio che SQL Server contatta in modo round-robin durante una ricerca Lightweight Directory Access Protocol (LDAP).

    Completa questi due passaggi. Per prima cosa, modifica krb5.conf aggiungendo i controller di dominio necessari, con il prefisso di kdc =.

    [realms]
    CONTOSO.COM = {
      kdc = kdc1.contoso.com
      kdc = kdc2.contoso.com
      ..
      ..
    }
    

    Il krb5.conf file è un comune file di configurazione client Kerberos, quindi qualsiasi modifica che tu apporti in questo file influisce su altri servizi oltre a SQL Server. Prima di apportare qualsiasi modifica, consulta l'amministratore del tuo dominio.

    Abilita l'impostazione network.enablekdcfromkrb5conf con mssql-conf, e poi riavvia SQL Server:

    sudo /opt/mssql/bin/mssql-conf set network.enablekdcfromkrb5conf true
    sudo systemctl restart mssql-server
    

Risoluzione dei problemi di Kerberos

I seguenti dettagli ti aiutano a risolvere problemi di autenticazione di Active Directory e a identificare messaggi di errore specifici.

Traccia Kerberos

Dopo aver creato l'utente, gli SPN e le keytab, e configuratomssql-conf, verificare la configurazione di Active Directory.

Per verificare la configurazione di SQL Server in Linux, usa l'account privilegiato per ottenere o rinnovare il TGT Kerberos. Esegui questo comando per mostrare i messaggi di tracciamento Kerberos nella console (stdout):

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. Se no, la traccia fornisce un contesto su quali passaggi 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 basata su Kerberos e sulla sicurezza di PAL

Per identificare messaggi di errore specifici nel PAL (Platform Abstraction Layer), abilita security.kerberos e security.ldap registra. Crea un logger.ini file con il seguente contenuto a /var/opt/mssql/, e poi riavvia SQL Server per catturare eventuali errori di inizializzazione. Riproduci l'errore. Il PAL registra gli errori di Active Directory e i messaggi di debug su /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

SQL Server rileva le modifiche del logger senza logger.ini riavvio, ma i guasti durante l'inizializzazione del servizio Active Directory all'avvio di SQL Server passano altrimenti inosservati. Riavviando SQL Server si catturano tutti i messaggi di errore.

Il registro di sicurezza continua a scrivere nell'unità fino a quando non vengono rimosse le modifiche in logger.ini. Disabilita e security.ldap registra security.kerberos una volta identificato e risolto il problema, per evitare di rimanere senza spazio sul disco.

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

Una volta abilitato il logging PAL e riprodotto il problema, cerca il primo messaggio con un livello di log di Error. Usa la tabella seguente per trovare l'errore e segui le indicazioni e le raccomandazioni per risolvere e risolvere il problema.

Messaggi di errore comuni

Messaggio di errore: "Non è possibile eseguire l'accesso. L'accesso proviene da un dominio non affidabile e non può essere utilizzato con l'autenticazione integrata"

Possibile causa

Incontri questo errore quando provi ad accedere con un account Active Directory dopo aver configurato l'autenticazione Active Directory.

Guidance

Questo messaggio di errore generico richiede di abilitare la registrazione PAL per identificare l'errore specifico.

Consulta la seguente lista di errori comuni per identificare la possibile causa di ciascun errore, e poi segui le indicazioni di troubleshooting per risolvere il problema.

Messaggi di errore
Impossibile trovare l'utente o il gruppo di Windows NT 'CONTOSO\user'
Non è stato possibile trovare il nome di dominio breve a causa di un errore
Non è stato possibile eseguire la ricerca rDNS per l'host <hostname> a causa di un errore
Nome FQDN non restituito dalla ricerca inversa DNS
L'associazione al server LDAP non è riuscita
Voce del file keytab non trovata
Non sono state trovate voci del file keytab per il <principal>
<
<
<

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.

Guidance

Per convalidare il problema, segui le indicazioni "Accesso fallito. L'account di accesso proviene da un dominio non attendibile e non può essere usato con l'autenticazione integrata. (Microsoft SQL Server, Errore: 18452)" e abilitare il logging 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) è richiesto nel comando, ma la FQDN del dominio (contoso.com) deve essere fornita nel backend quando si effettua una connessione LDAP. 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.

Guidance

Il messaggio di errore "Non è stato possibile cercare il nome di dominio breve a causa di errore" suggerisce che nslookup for contoso non si risolva all'indirizzo IP del domain controller. Rivedi DNS e ricerche DNS inverse per confermare che nslookup sia per NetBIOS che per il nome di dominio corrispondano.

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

Questi messaggi di errore di solito indicano che i record DNS inversi (record PTR) non esistono per tutti i controller di dominio.

Guidance

Controllare le ricerche DNS e DNS inverso. Dopo aver identificato i controller di dominio che non hanno voci rDNS, hai due opzioni:

  • Aggiungere voci rDNS per tutti i controller di dominio

    Questa impostazione non è una modalità SQL Server, e devi configurarla a livello di dominio. Potresti dover collaborare con il team di amministrazione del dominio per creare i record PTR richiesti per tutti i controller di dominio che nslookup restituiscono il nome di dominio.

  • Limitare SQL Server a un subset di controller di dominio

    Se non puoi aggiungere record PTR per tutti i controller di dominio restituiti, puoi limitare SQL Server a un sottoinsieme 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

Ecco 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

Guidance

  • Nessuna credenziale

    Altri messaggi di errore appaiono per primi se le credenziali non si caricano per le connessioni LDAP. Abilita il PAL logging e controlla il log degli errori per i messaggi di errore prima di questo. Se non sono presenti altri errori, è molto probabile che non si tratti di un problema di credenziali. Se trovi un errore, risolvilo prima di andare avanti. Nella maggior parte dei casi, è 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 collega a un controller di dominio, fornisce o il nome di dominio completamente qualificato (FQDN), che in questo esempio è contoso.com, oppure il FQDN del DC (kdc1.contoso.com). Dopo aver stabilito la connessione (ma prima di restituire il successo al chiamante), la libreria OpenLDAP controlla l'IP del server a cui si è collegata. Successivamente effettua una ricerca DNS inversa e verifica che il nome del server a cui è connesso (kdc1.contoso.com) corrisponda al dominio richiesto (contoso.com). Se non corrisponde, la libreria OpenLDAP fallisce la connessione per motivi di sicurezza. Questa discrepanza è parte del motivo per cui le impostazioni rDNS sono importanti per SQL Server in Linux, ed è il fulcro di questo articolo.

Messaggio di errore: "Voce del file keytab non trovata"

Possibile causa

Questo errore indica problemi di accesso con il file keytab o voci mancanti nella keytab.

Guidance

Assicurarsi che il file keytab disponga del livello di accesso e delle autorizzazioni corretti. La posizione e il nome predefiniti per il file keytab sono /var/opt/mssql/secrets/mssql.keytab. Per visualizzare i permessi attuali su tutti i file nella cartella secrets, esegui questo comando:

sudo ls -lrt /var/opt/mssql/secrets

Usa questi comandi per impostare i permessi e il livello di accesso sul 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 non soddisfi nessuna delle condizioni di quella sezione, vedi questo errore o un errore equivalente: "Key table entry not found".

Messaggio di errore: "Nessuna voce trovata nella tabella di chiavi per il <principale>"

Possibile causa

Quando provi a recuperare le credenziali <principal> dalla keytab, non trovi voci applicabili.

Guidance

Per elencare tutte le voci nel keytab, seguire la sezione verifica file keytab e autorizzazioni di questo articolo. Assicurarsi che l'elemento <principal> sia presente. In questo caso, il conto principale è solitamente quello network.privilegedadaccount su cui registri gli SPN. Se non lo è, aggiungilo insieme al adutil comando. Per altre informazioni, vedi Usare adutil per configurare l'autenticazione di Active Directory con SQL Server in Linux.

Messaggio di errore: "Il <ticket server principale>richiesto non è stato trovato nel keytab (kvno del ticket <KVNO>)"

Possibile causa

Questo errore indica che SQL Server non riesce a trovare una voce keytab per il ticket richiesto con il Key Version Number (KVNO) specificato.

Guidance

Per elencare tutte le voci nel keytab, seguire la sezione verifica file keytab e autorizzazioni di questo articolo. Se non riesci a trovare un messaggio di errore che corrisponda a <principal> e KVNO, aggiorna il file keytab per aggiungere questa voce, seguendo i passaggi di quella sezione.

È anche possibile eseguire il comando seguente per ottenere il KVNO più recente dal controller di dominio. Prima di eseguire questo comando, ottieni o rinnova il Kerberos TGT con il kinit comando. Per ulteriori informazioni, vedi utilizzare adutil per creare un utente Active Directory per SQL Server e per impostare il nome dell'entità servizio (SPN).

kvno MSSQLSvc/<hostname>

it-IT: Messaggio di errore: "KVNO <del> server del ticket richiesto < principale> trovato nel file keytab ma non con il tipo di crittografia <encryption type>"

Possibile causa

Questo errore significa che la keytab di SQL Server non contiene il tipo di crittografia richiesto dal client.

Guidance

Per validare, segui la sezione Check keytab file e permissions di questo articolo per elencare tutte le voci nella keytab. Se non riesci a trovare un messaggio di errore che corrisponda al principale, al KVNO e al tipo di crittografia, aggiorna il file keytab per aggiungere questa voce, seguendo i passaggi di quella 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 messaggio di errore indica che SQL Server non può utilizzare una credenziale dal file keytab per decifrare la richiesta di autenticazione in arrivo. Una password errata spesso causa questo errore.

Guidance

Ricrea la keytab con la password corretta. Se usi adutil, crea la keytab con la password giusta e segui i passaggi del Tutorial: Usa adutil per configurare l'autenticazione Active Directory con SQL Server in Linux.

Porte comuni

Questa tabella mostra le porte comuni che SQL Server in Linux utilizza per configurare e amministrare l'autenticazione Active Directory.

Servizio Active Directory Porto
DNS 53
LDAP 389
LDAPS 636
Kerberos 88