Esercitazione: Usare l'autenticazione di Active Directory con SQL Server in Linux

Si applica a:SQL Server - Linux

Questa esercitazione illustra come configurare SQL Server in Linux per supportare l'autenticazione di Active Directory, detta anche autenticazione integrata. Per una panoramica, vedere Autenticazione di Active Directory per SQL Server in Linux.

Questa esercitazione è costituita dalle attività seguenti:

  • Aggiungere un host di SQL Server a un dominio Active Directory
  • Creare un utente di Active Directory per SQL Server e impostare il nome dell'entità servizio (SPN)
  • Configurare il file keytab del servizio SQL Server
  • Proteggere il file keytab
  • Configurare SQL Server per l'uso del file keytab per l'autenticazione Kerberos
  • Creare account di accesso basati su Active Directory in Transact-SQL
  • Connettersi a SQL Server usando l'autenticazione di Active Directory

Prerequisiti

Prima di configurare l'autenticazione di Active Directory, è necessario:

Aggiungere un host di SQL Server a un dominio Active Directory

Aggiungere l'host di SQL Server in Linux a un controller di dominio Active Directory. Aggiungere un host di SQL Server in Linux a un dominio di Active DirectoryPer informazioni sull'aggiunta a un dominio Active Directory, vedere Aggiungere un host di SQL Server in Linux a un dominio di Active Directory.

Creare un utente di Active Directory per SQL Server e impostare il nome dell'entità servizio (SPN)

Nota

Nella procedura seguente viene usato il nome di dominio completo (FQDN). Se sei in Azure, è necessario creare un FQDN prima di procedere.

  1. Nel controller di dominio esegui il comando di PowerShell New-ADUser per creare un nuovo utente di Active Directory con una password che non scade mai. L'esempio seguente assegna all'account il nome sqlsvc, ma si può scegliere un nome qualsiasi. Viene chiesto di immettere una nuova password per l'account.

    Import-Module ActiveDirectory
    
    New-ADUser sqlsvc -AccountPassword (Read-Host -AsSecureString "Enter Password") -PasswordNeverExpires $true -Enabled $true
    

    Nota

    Come misura di sicurezza, è consigliabile avere un account Active Directory dedicato per SQL Server, in modo che le credenziali dell’istanza di SQL Server non siano condivise con altri servizi che usano lo stesso account. Tuttavia, se si vuole è possibile riutilizzare un account Active Directory esistente se se ne conosce la password (necessaria per generare un file keytab nel passaggio successivo). L'account, inoltre, deve essere abilitato per supportare la crittografia AES Kerberos a 128 e 256 bit (attributo msDS-SupportedEncryptionTypes) nell'account utente. Per verificare che l'account sia abilitato per la crittografia AES, individuare l'account nell'utilità Utenti e computer di Active Directory e selezionare Proprietà. Individua la scheda Account in Proprietà e verifica che le due caselle di controllo seguenti siano selezionate.

    1. Questo account supporta la crittografia AES 128 bit Kerberos

    2. Questo account supporta la crittografia AES 256 bit Kerberos

  2. Impostare il nome dell'entità servizio (SPN) per l'account usando lo strumento setspn.exe. Il nome SPN deve essere formattato esattamente come specificato nell'esempio seguente. È possibile trovare il nome di dominio completo del computer host di SQL Server eseguendo hostname --all-fqdns nell'host di SQL Server. La porta TCP deve essere la 1433, a meno che SQL Server non sia stato configurato per l'uso di un numero di porta diverso.

    setspn -A MSSQLSvc/<fully qualified domain name of host machine>:<tcp port> sqlsvc
    setspn -A MSSQLSvc/<netbios name of the host machine>:<tcp port> sqlsvc
    

    Nota

    Se viene visualizzato un messaggio di errore, Insufficient access rights, verificare con l'amministratore del dominio di avere autorizzazioni sufficienti per impostare un SPN per l'account. L'account usato per registrare un nome dell'entità servizio richiederà le autorizzazioni Write servicePrincipalName. Per altre informazioni, vedi Registrare un nome dell'entità servizio per le connessioni Kerberos.

    Se si cambia la porta TCP in futuro, è necessario eseguire di nuovo il comando setspn con il nuovo numero di porta. È anche necessario aggiungere il nuovo SPN al keytab del servizio SQL Server seguendo la procedura descritta nella sezione successiva.

Per altre informazioni, vedi Registrare un nome dell'entità servizio per le connessioni Kerberos.

Configurare il file keytab del servizio SQL Server

La configurazione dell'autenticazione di Active Directory per SQL Server in Linux richiede un account Active Directory e l’SPN creato nella sezione precedente.

Importante

Se si cambia la password dell'account di Active Directory o la password dell'account a cui sono assegnati i nomi dell'entità servizio, è necessario aggiornare il keytab con la nuova password e il numero di versione della chiave. Alcuni servizi potrebbero anche cambiare automaticamente le password a rotazione. Esaminare i criteri di rotazione delle password per gli account in questione e allinearli alle attività di manutenzione pianificata per evitare tempi di inattività imprevisti.

Voci del keytab SPN

  1. Verifica il numero di versione della chiave per l'account Active Directory creato nel passaggio precedente. In genere è 2, ma potrebbe essere un altro numero intero se la password dell'account è stata cambiata più volte. Nel computer host SQL Server eseguire i comandi seguenti:

    • Gli esempi seguenti presuppongono che user si trovi nel dominio @CONTOSO.COM. Modificare l'utente e il nome di dominio per l'utente e il nome di dominio.
    kinit user@CONTOSO.COM
    kvno user@CONTOSO.COM
    kvno MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM
    

    Nota

    La propagazione dei nomi SPN nel dominio può richiedere diversi minuti, soprattutto se il dominio è di grandi dimensioni. Se viene visualizzato il messaggio di errore kvno: Server not found in Kerberos database while getting credentials for MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM, attendere qualche minuto e riprovare.

    I comandi riportati sopra funzioneranno solo se il server è stato aggiunto a un dominio di Active Directory, come descritto nella sezione precedente.

  2. Tramite ktpass, aggiungere voci keytab per ogni nome dell'entità servizio usando i comandi seguenti in un prompt dei comandi del computer Windows:

    • <DomainName>\<UserName> - Creare un account utente di Active Directory
    • @CONTOSO.COM: usare il nome di dominio
    • <#>: sostituire /kvno <#> con il numero di versione della chiave ottenuto in un passaggio precedente
    • <StrongPassword>: usare una password complessa
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <StrongPassword>
    

    Nota

    I comandi precedenti ammettono sia gli algoritmi di crittografia AES sia RC4 per l'autenticazione Active Directory. RC4 è un algoritmo di crittografia più obsoleto. Se è necessario un livello di sicurezza più elevato, è possibile scegliere di creare le voci keytab usando soltanto l'algoritmo di crittografia AES. Le ultime due voci UserName devono essere in lettere minuscole oppure l'autenticazione delle autorizzazioni potrebbe non riuscire.

  3. Dopo aver eseguito il comando precedente, è necessario disporre di un file keytab denominato mssql.keytab. Copiare il file nel computer SQL Server nella cartella /var/opt/mssql/secrets.

  4. Proteggere il file keytab.

    Chiunque abbia accesso a questo file keytab può rappresentare SQL Server nel dominio, quindi assicurarsi di limitare l'accesso al file in modo che solo l'account mssql disponga dell'accesso in lettura:

    sudo chown mssql:mssql /var/opt/mssql/secrets/mssql.keytab
    sudo chmod 400 /var/opt/mssql/secrets/mssql.keytab
    
  5. È necessario impostare l'opzione di configurazione seguente usando lo strumento mssql-conf per specificare l'account da usare durante l'accesso al file keytab.

    sudo mssql-conf set network.privilegedadaccount <username>
    

    Nota

    Includere solo il nome utente e non nomedominio\nomeutente o nomeutente@dominio. SQL Server aggiunge internamente il nome di dominio necessario insieme al nome utente, se usato.

  6. Attenersi alla procedura seguente per configurare SQL Server in modo che inizi a usare il file keytab per l'autenticazione Kerberos.

    sudo mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
    sudo systemctl restart mssql-server
    

    Suggerimento

    Facoltativamente disabilitare le connessioni UDP al controller di dominio per migliorare le prestazioni. In molti casi, le connessioni UDP hanno sempre esito negativo quando ci si connette a un controller di dominio, quindi è possibile impostare le opzioni di configurazione in /etc/krb5.conf in modo da ignorare le chiamate UDP. Modifica /etc/krb5.conf e imposta le opzioni seguenti:

    /etc/krb5.conf
    [libdefaults]
    udp_preference_limit=0
    

A questo punto si è pronti per usare gli account di accesso basati su Active Directory in SQL Server.

Creare account di accesso basati su Active Directory in Transact-SQL

  1. Connettiti a SQL Server e creare un nuovo account di accesso basato su Active Directory:

    CREATE LOGIN [CONTOSO\user] FROM WINDOWS;
    
  2. Verificare che l'account di accesso sia ora elencato nella vista del catalogo di sistema sys.server_principals:

    SELECT name FROM sys.server_principals;
    

Connettersi a SQL Server usando l'autenticazione di Active Directory

Accedi a un computer client usando le credenziali del tuo dominio. A questo punto è possibile connettersi a SQL Server senza immettere nuovamente la password usando l'autenticazione di Active Directory. Se si crea un account di accesso per un gruppo di Active Directory, qualsiasi utente di Active Directory che sia membro di tale gruppo potrà connettersi nello stesso modo.

Lo specifico parametro della stringa di connessione che indica ai client di usare l'autenticazione di Active Directory dipende dal driver in uso. Considerare gli esempi nelle sezioni riportate di seguito.

sqlcmd in un client Linux aggiunto a un dominio

Accedi a un client Linux aggiunto al dominio usando ssh e le credenziali del dominio:

ssh -l user@contoso.com client.contoso.com

Assicurarsi di aver installato il pacchetto mssql-tools, quindi connettersi usando sqlcmd senza specificare le credenziali:

sqlcmd -S mssql-host.contoso.com

A differenza di SQL Windows, l'autenticazione Kerberos funziona per la connessione locale in SQL Linux. È comunque necessario specificare il nome di dominio completo dell'host SQL Linux. L'autenticazione di Active Directory non funzionerà se si tenta di connettersi a ., localhost, 127.0.0.1 e così via.

SSMS in un client Windows aggiunto a un dominio

Accedi a un client Windows aggiunto al dominio usando le credenziali del dominio. Assicurarsi che SQL Server Management Studio sia installato, quindi connettersi all'istanza di SQL Server, ad esempio mssql-host.contoso.com, specificando Autenticazione di Windows nella finestra di dialogo Connetti al server.

Autenticazione di Active Directory con altri driver client

La tabella seguente contiene alcuni consigli per altri driver client:

Driver client Elemento consigliato
JDBC Usare l'autenticazione integrata Kerberos per la connessione a SQL Server.
ODBC Usare l'autenticazione integrata SQL.
ADO.NET Sintassi della stringa di connessione.

Opzioni di configurazione aggiuntive

Se si usano utilità di terze parti, come PBIS, VAS o Centrify, per aggiungere l'host Linux al dominio di Active Directory e si vuole forzare SQL Server a usare direttamente la libreria OpenLDAP, è possibile configurare l'opzione disablesssd con mssql-conf come indicato di seguito:

sudo mssql-conf set network.disablesssd true
systemctl restart mssql-server

Nota

Alcune utilità, come realmd, installano SSSD, mentre altri strumenti, come PBIS, VAS e Centrify, non lo fanno. Se l'utilità usata per l'aggiunta al dominio Active Directory non prevede l'installazione di SSSD, è consigliabile impostare l'opzione disablesssd su true. Anche se non è necessario, poiché SQL Server tenterà di usare SSSD per Active Directory prima di eseguire il fallback al meccanismo OpenLDAP, sarebbe più efficiente configurarlo in modo che SQL Server esegua le chiamate a OpenLDAP direttamente ignorando il meccanismo SSSD.

Se il controller di dominio supporta LDAPS, è possibile forzare l'esecuzione di tutte le connessioni da SQL Server ai controller di dominio tramite LDAPS. Per verificare che il client sia in grado di contattare il controller di dominio tramite LDAPS, esegui il comando bash ldapsearch -H ldaps://contoso.com:3269. Per impostare SQL Server in modo da usare solo LDAPS, eseguire il comando seguente:

sudo mssql-conf set network.forcesecureldap true
systemctl restart mssql-server

Verrà usato LDAPS su SSSD se l'aggiunta al dominio Active Directory dell'host è stata eseguita tramite il pacchetto SSSD e disablesssd non è impostato su true. Se disablesssd è impostato su true e lo è anche forcesecureldap, il protocollo LDAPS verrà usato sulle chiamate alla libreria OpenLDAP eseguite da SQL Server.

Dopo SQL Server 2017 CU 14

A partire da SQL Server 2017 (14.x) CU 14, se SQL Server è stato aggiunto a un controller di dominio Active Directory usando provider di terze parti ed è configurato per l'uso di chiamate OpenLDAP per la ricerca tramite Active Directory generale impostando disablesssd su true, è possibile usare anche l'opzione enablekdcfromkrb5 per forzare SQL Server a usare la libreria krb5 per la ricerca KDC anziché la ricerca DNS inversa per il server KDC.

Questo può essere utile se si vogliono configurare manualmente i controller di dominio con cui SQL Server tenta di comunicare. e si usa il meccanismo della libreria OpenLDAP tramite l'elenco KDC in krb5.conf.

Imposta prima disablesssd e enablekdcfromkrb5conf su true e quindi riavviare SQL Server:

sudo mssql-conf set network.disablesssd true
sudo mssql-conf set network.enablekdcfromkrb5conf true
systemctl restart mssql-server

Configura poi l'elenco KDC in /etc/krb5.conf nel modo seguente:

[realms]
CONTOSO.COM = {
  kdc = dcWithGC1.contoso.com
  kdc = dcWithGC2.contoso.com
}

Sebbene non sia consigliato, è possibile usare utilità, come realmd, che installano SSSD durante l'aggiunta dell'host Linux al dominio, impostando disablesssd su true in modo che SQL Server usi OpenLDAP anziché SSSD per le chiamate correlate ad Active Directory.

Nota

L'accesso di SQL server tramite un nome di dominio completo (ad esempio CONTOSO.COM\Username) non è supportato. Usa il formato CONTOSO\Username.

Gli accessi di SQL server dai gruppi locali di dominio non sono supportati. Usare invece gruppi di dominio di sicurezza globali.

Contribuire alla documentazione di SQL

Il contenuto SQL può essere modificato. L'autore delle modifiche contribuirà a migliorare la documentazione e verrà accreditato come collaboratore alla realizzazione della pagina.

Per altre informazioni, vedere Come contribuire alla documentazione di SQL Server