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.

  1. Ottieni o rinnova il ticket-granting ticket (TGT) Kerberos usando il comando kinit:

    kinit privilegeduser@CONTOSO.COM
    
  2. 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

  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. Eseguire una ricerca del DNS inverso (rDNS) per ogni indirizzo IP elencato nei risultati precedenti. Include 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

  1. Verificare di aver creato il file keytab (tabella di chiavi) e che mssql-conf sia configurato per usare il file corretto con 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.

  2. Assicurati di poter elencare il contenuto del file keytab e di aver aggiunto gli SPN, la porta, il tipo di crittografia e l'account utente corretti. Se non si digitano correttamente le password quando si creano i nomi SPN e le voci del file 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'impostazione network.privilegedadaccount in mssql-conf) e il nome host per SQL Server è sqllinux.contoso.com in ascolto sulla porta predefinita 1433.

    $ 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

  1. In krb5.conf, disponibile in /etc/krb5.conf, verificare che siano stati forniti valori per l'area di autenticazione predefinita, le informazioni sull'area di autenticazione e il dominio per il mapping dell'area di autenticazione. Quello seguente è un esempio di file krb5.conf. Per altre informazioni, vedere Informazioni sull'autenticazione di Active Directory per SQL Server in Linux e contenitori.

    [libdefaults]
    default_realm = CONTOSO.COM
    
    [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 consente di specificare un elenco di controller di dominio che SQL Server contatta in modalità round robin durante l'esecuzione di una ricerca LDAP.

    A tale scopo, è necessario completare due passaggi. Prima di tutto, modificare krb5.conf aggiungendo il numero di controller di dominio necessari, preceduti da kdc =.

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

    Tenere presente che krb5.conf è un file di configurazione client Kerberos comune, quindi tutte le modifiche apportate a questo file influiranno 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 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. L'errore di Active Directory di PAL e i messaggi di debug verranno 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 la registrazione security.kerberos e security.ldap dopo aver identificato e risolto il problema per evitare l'esaurimento dello 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

Si tratta di un messaggio di errore generico e è necessario abilitare la registrazione PAL per identificare il messaggio di errore specifico.

È possibile fare riferimento a questo elenco di errori comuni per identificare la causa possibile 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 fornite per "Non è possibile eseguire l'accesso. 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: "Non è stato possibile eseguire la ricerca DNS inverso per l'host <nome host> a causa di un errore" o "Nome FQDN non restituito dalla ricerca DNS inversa"

Possibile causa

Questo messaggio di errore indica principalmente 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 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

Si tratta di un errore generico da OpenLDAP, che in genere è causato da uno dei problemi 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

    Vengono prima generati altri messaggi di errore se non è possibile caricare le credenziali 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 tratterà di uno dei messaggi di errore descritti 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 FQDN del dominio (contoso.com) o il nome FQDN del controller di dominio (kdc1.contoso.com). 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. Eseguirà quindi una ricerca DNS inverso e verificherà 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 stabilisce la connessione come misura di sicurezza. Questo è il motivo per cui le impostazioni DNS inverso sono così importanti per SQL Server in Linux e sono state evidenziate in questa documentazione.

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 informazioni dettagliate sull'elenco delle voci del file keytab e sull'impostazione delle autorizzazioni corrette, vedi la sezione Controllare il file keytab e le autorizzazioni precedente. Se una delle condizioni in quella sezione non viene soddisfatta, verrà visualizzato questo errore o un messaggio equivalente: "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

Seguire la sezione Controllare il file keytab e le autorizzazioni di questo documento per elencare tutte le voci nel file keytab. Assicurarsi che sia presente la voce <principal>. In questo caso, l'account dell'entità di sicurezza è in genere l'account 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 ha trovato una voce keytab per il ticket richiesto con il KVNO (numero di versione della chiave) specificato.

Indicazioni

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 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 viene spesso causato da una password non corretta.

Indicazioni

Ricreare il file keytab usando la password corretta. Se si usa adutil, seguire la procedura descritta in Usare adutil per configurare l'autenticazione di Active Directory con SQL Server in Linux per creare il file keytab con la password corretta.

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