Esercitazione: Configurare l'autenticazione di Active Directory con SQL Server in contenitori su Linux

Si applica a:SQL Server su Linux

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

Note

Per indicazioni aggiornate sulla configurazione di rete, vedere la documentazione relativa al sistema operativo.

Questa esercitazione è costituita dalle attività seguenti:

  • Installare adutil
  • Unisci un host Linux a un dominio Active Directory
  • Creare un utente Active Directory per SQL Server e configurare il Service Principal Name (SPN) usando lo strumento adutil
  • Creare il file keytab del servizio SQL Server
  • Creare i file mssql.conf e krb5.conf che verranno usati dal contenitore di SQL Server
  • Montare i file di configurazione e distribuire il contenitore di SQL Server
  • Creare account di accesso di SQL Server basati su Active Directory usando Transact-SQL
  • Connettersi a SQL Server usando l'autenticazione di Active Directory

Prerequisiti

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

  • Disporre di un controller di dominio Active Directory (Windows) nella rete
  • Installare adutil su un computer host Linux aggiunto a un dominio. Per indicazioni dettagliate, vedere la sezione Installare adutil.

Preparazione e distribuzione del contenitore

Per configurare il contenitore, sarà necessario conoscere in anticipo la porta che verrà usata dal contenitore nell'host. La porta predefinita 1433 potrebbe essere mappata diversamente sull'host del contenitore. Per questa esercitazione, verrà eseguito il mapping della porta 5433 dell'host alla porta 1433 del contenitore. Per ulteriori informazioni, consulta il nostro avvio rapido, Avvio rapido: Esegui immagini del contenitore di SQL Server in Linux con Docker.

Quando si registrano nomi dell’entità servizio (SPN), è possibile usare il nome host del computer o il nome del contenitore. Tuttavia, è necessario configurarlo in base a ciò che si vuole visualizzare, quando ci si connette al contenitore esternamente.

Verificare che in Active Directory sia stata aggiunta una voce per l'host di inoltro (A) per l'indirizzo IP dell'host Linux che mappa al nome del contenitore di SQL Server. In questo tutorial, l'indirizzo IP della sql1 macchina host è 10.0.0.10, e il nome del container di SQL Server è sql1. Aggiungere la voce per l'host di inoltro in Active Directory come illustrato di seguito. La voce garantisce che gli utenti raggiungano l'host corretto quando si connettono a sql1.contoso.com.

Screenshot dell'aggiunta di un record host.

Per questa esercitazione viene usato un ambiente in Azure con tre macchine virtuali (VM). Una VM agisce come controller di dominio Windows (DC) per il contoso.com dominio. Il controller di dominio si chiama adVM.contoso.com. La seconda è un computer Windows denominato winbox, su cui è in esecuzione Windows 10 Desktop, che viene usato come client e ha SQL Server Management Studio (SSMS) installato. La terza è un computer Ubuntu 18.04 LTS denominato sql1, che ospita i contenitori di SQL Server. Tutti i computer sono stati uniti al dominio contoso.com. Per altre informazioni, vedere Aggiungere un host di SQL Server in Linux a un dominio di Active Directory.

Note

L'aggiunta del computer contenitore host al dominio non è obbligatoria, come illustrato più avanti in questo articolo.

Installare adutil

Per installare adutil, seguire la procedura descritta in Introduzione a adutil - utilità Active Directory in un computer host aggiunto al dominio.

Creare un utente di Active Directory, SPNs e il keytab del servizio SQL Server

Se non si vuole che l'host del contenitore faccia parte del dominio e non è stata seguita la procedura per unire il computer al dominio, seguire questa procedura in un altro computer Linux che fa già parte del dominio Active Directory:

  1. Creare un utente Active Directory per SQL Server e impostare il nome SPN usando adutil.

  2. Creare e configurare il file keytab del servizio SQL Server.

Copiare il file mssql.keytab creato nel computer host che eseguirà il contenitore di SQL Server e configurare il contenitore per usare il file mssql.keytab copiato. Facoltativamente, è anche possibile unire l'host Linux che eseguirà il contenitore di SQL Server al dominio Active Directory e seguire questa procedura nello stesso computer.

Creare un utente Active Directory per SQL Server e impostare il nome dell'entità servizio tramite adutil

Per abilitare l'autenticazione di Active Directory nei contenitori di SQL Server in Linux, è necessario eseguire i seguenti passaggi per l'esecuzione in un computer Linux che fa parte del dominio Active Directory.

  1. Ottenere o rinnovare il biglietto di concessione del biglietto (TGT) Kerberos utilizzando il comando kinit. Usare un account con privilegi per il comando kinit. L'account deve avere l'autorizzazione per connettersi al dominio e dovrebbe anche poter creare account e nomi principali di servizio (SPN) nel dominio.

    In questo script di esempio è già stato creato un utente con privilegi denominato privilegeduser@CONTOSO.COM nel controller di dominio.

    kinit privilegeduser@CONTOSO.COM
    
  2. Usando adutil, creare il nuovo utente che verrà usato come account di Active Directory con privilegi da SQL Server. Sostituire <password> con una password valida.

    adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password '<password>'
    

    È possibile specificare le password in uno dei tre modi seguenti:

    • Flag password: --password <password>
    • Variabile di ambiente: ADUTIL_ACCOUNT_PWD
    • Input interattivo

    La precedenza dei metodi di immissione delle password corrisponde all'ordine delle opzioni elencate in precedenza. Le opzioni consigliate consistono nel fornire la password tramite la variabile di ambiente o l'immissione interattiva, poiché sono più sicure del flag password.

    Puoi specificare il nome dell'account usando il nome distinto (--distname) come mostrato sopra, oppure puoi usare il nome Unità Organizzativa (OU). Il nome OU (--ou) ha la precedenza sul nome distinto se specifichi entrambi. Esegui il seguente comando per maggiori dettagli:

    adutil user create --help
    
  3. Registrare gli SPN all'utente creato in precedenza. È possibile usare il nome del computer host invece del nome del contenitore se lo si preferisce, a seconda di come si vuole che la connessione venga visualizzata dall'esterno. In questa esercitazione viene usata la porta 5433 invece della porta 1433. Questa è la mappatura delle porte per il contenitore. Il numero di porta potrebbe essere diverso.

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • addauto creerà gli SPN in modo automatico, purché l'account kinit disponga di privilegi sufficienti.
    • -n: Nome dell'account a cui verranno assegnati gli SPN (Nomi Principali dei Servizi).
    • -s: nome del servizio da usare per la generazione degli SPN. In questo caso, è per il servizio SQL Server e quindi il nome del servizio è MSSQLSvc.
    • -H: nome host da usare per la generazione degli SPN. Se non specificato, verrà utilizzato il nome di dominio completamente qualificato (FQDN) dell'host locale. Fornire anche il nome di dominio completo per il nome del contenitore. In questo caso, il nome del contenitore è sql1 e il nome di dominio completo è sql1.contoso.com.
    • -p: porta da usare per la generazione degli SPN. Se non specificata, gli SPN verranno generati senza porta. In questo caso, Connections funzionerà solo quando SQL Server è in ascolto sulla porta predefinita 1433.

Creare il file keytab del servizio SQL Server

Creare il file keytab che contiene le voci per ognuno dei quattro nomi delle entità servizio create in precedenza e una per l'utente. Il file keytab verrà montato nel contenitore, in modo che possa essere creato in qualsiasi posizione nell'host. Puoi cambiare questo percorso in sicurezza, purché il keytab risultante sia montato correttamente quando usi Docker o Podman per distribuire il container.

Per creare il keytab per tutti gli SPN, è possibile usare l'opzione createauto. Sostituire <password> con una password valida.

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password '<password>' -s MSSQLSvc
  • -k: percorso in cui si vuole creare il file mssql.keytab. Nell'esempio precedente la directory /container/sql1/secrets deve esistere già nell'host.
  • -p: porta da usare per la generazione degli SPN. Se non specificata, gli SPN verranno generati senza porta.
  • -H: nome host da usare per la generazione degli SPN. Se non specificato, verrà usato l’FQDN dell'host locale. Fornire anche il nome di dominio completo per il nome del contenitore. In questo caso, il nome del contenitore è sql1 e il nome di dominio completo è sql1.contoso.com.
  • -s: nome del servizio da usare per la generazione degli SPN. In questo caso, è per il servizio SQL Server e quindi il nome del servizio è MSSQLSvc.
  • --password: password dell'account utente Active Directory con privilegi creato in precedenza.
  • -e o --enctype: tipi di crittografia per l'elemento keytab. Usare un elenco delimitato da virgole dei valori. Se non specificato, viene visualizzato un prompt interattivo.

Quando viene data la possibilità di scegliere i tipi di crittografia, è possibile scegliere più di uno. Per questo esempio vengono scelti aes256-cts-hmac-sha1-96 e arcfour-hmac. Assicurarsi di scegliere il tipo di crittografia supportato dall'host e dal dominio.

Per scegliere il tipo di crittografia in modo non interattivo, specifica la tua scelta con l'argomento -e nel comando precedente. Per altre informazioni sui adutil comandi, eseguire il comando seguente.

adutil keytab createauto --help

Caution

arcfour-hmac è un tipo di crittografia debole e non è consigliato per l'uso in un ambiente di produzione.

Per creare il keytab per l'utente, il comando è il seguente. Sostituire <password> con una password valida.

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password '<password>'
  • -k: percorso in cui si vuole creare il file mssql.keytab. Nell'esempio precedente la directory /container/sql1/secrets deve esistere già nell'host.
  • -p: entità da aggiungere al file keytab.

La adutil keytab create e i comandi createauto non sovrascrivono un file esistente. Aggiungono delle voci.

Assicurati che la keytab creata abbia i permessi corretti quando distribuisci il container.

chmod 440 /container/sql1/secrets/mssql.keytab

A questo punto, è possibile copiare mssql.keytab dall'host Linux corrente all'host Linux in cui si distribuirà il contenitore di SQL Server e seguire i passaggi rimanenti nell'host Linux che eseguirà il contenitore di SQL Server. Se i passaggi precedenti sono stati eseguiti nello stesso host Linux in cui verranno distribuiti i contenitori di SQL Server, eseguire anche i passaggi successivi nello stesso host.

Creare i file di configurazione che verranno usati dal contenitore di SQL Server

  1. Creare un file mssql.conf con le impostazioni per Active Directory. Questo file può essere creato ovunque sull'host e deve essere montato correttamente durante il docker run comando. In questo esempio il file mssql.conf è stato inserito in /container/sql1, che è la directory del contenitore. Il contenuto del file mssql.conf è il seguente:

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    
    • privilegedadaccount: utente di Active Directory con privilegi da usare per l'autenticazione di Active Directory.
    • kerberoskeytabfile: percorso nel contenitore in cui verrà inserito il file mssql.keytab.
  2. Creare un file krb5.conf, come nell'esempio seguente. In questi file è importante distinguere tra lettere maiuscole e minuscole.

    [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
    
  3. Copiare tutti i file, mssql.conf, krb5.conf e mssql.keytab, in una posizione che verrà montata nel contenitore SQL Server. In questo esempio i file vengono inseriti nell'host nelle seguenti posizioni: mssql.conf e krb5.conf nella posizione /container/sql1/, mssql.keytab è posizionato nella posizione /container/sql1/secrets/.

  4. Assicurati che l'utente che esegue il comando Docker o Podman abbia permessi sufficienti su queste cartelle. All'avvio del contenitore, l'utente deve accedere al percorso di cartella creato. In questo esempio, abbiamo assegnato i seguenti permessi al percorso della cartella:

    sudo chmod 755 /container/sql1/
    

Montare i file di configurazione e distribuire il contenitore di SQL Server

Eseguire il contenitore di SQL Server e montare i file di configurazione Active Directory corretti creati in precedenza:

Importante

La variabile di ambiente SA_PASSWORD è deprecata. Utilizzare invece MSSQL_SA_PASSWORD.

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" \
-p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
-d mcr.microsoft.com/mssql/server:2019-latest

Caution

La password deve seguire la politica predefinita di SQL Server password. Per impostazione predefinita, la password deve essere composta da almeno otto caratteri e contenere caratteri di tre delle quattro categorie seguenti: lettere maiuscole, lettere minuscole, cifre in base 10 e simboli. Le password possono contenere fino a 128 caratteri. Usare password il più possibile lunghe e complesse.

Quando esegui un container su un host con un Linux Security Module (LSM), come SELinux, monta i volumi usando questa Z opzione. Questa opzione indica a Docker di etichettare il contenuto con un'etichetta privata non condivisa. Per ulteriori informazioni, vedi Configura l'etichetta SELinux.

L'esempio conterrà i comandi seguenti. Sostituire <password> con una password valida.

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/:Z \
-v /container/sql1/krb5.conf:/etc/krb5.conf:Z \
--dns-search contoso.com \
--dns 10.0.0.4 \
--add-host adVM.contoso.com:10.0.0.4 \
--add-host contoso.com:10.0.0.4 \
--add-host contoso:10.0.0.4 \
-d mcr.microsoft.com/mssql/server:2019-latest
  • I file mssql.conf e krb5.conf si trovano nel percorso del file host /container/sql1.
  • Il file mssql.keytab creato si trova nel percorso del file host /container/sql1/secrets.
  • Poiché il computer host è in Azure, è necessario accodare i dettagli di Active Directory nello stesso ordine al comando docker run. Nell'esempio il controller di dominio adVM è nel dominio contoso.com, con l'indirizzo IP 10.0.0.4. Il controller di dominio esegue DNS e KDC.

Creare account di accesso di SQL Server basati su Active Directory usando Transact-SQL

Connettersi al contenitore di SQL Server Usando i comandi seguenti, creare l'account di accesso e verificare che esista.

Note

È possibile connettersi a un'istanza di SQL Server usando qualsiasi strumento client di SQL Server familiare, ad esempio sqlcmd, SQL Server Management Studio (SSMS) o l'estensione MSSQL per Visual Studio Code.

CREATE LOGIN [contoso\amvin]
    FROM WINDOWS;

SELECT name
FROM sys.server_principals;

Connettersi a SQL Server con l'autenticazione di Active Directory

È possibile connettersi a un'istanza di SQL Server usando qualsiasi strumento client di SQL Server familiare, ad esempio sqlcmd, SQL Server Management Studio (SSMS) o l'estensione MSSQL per Visual Studio Code.

Accedi a SQL Server con le credenziali Windows usando il nome e il numero di porta di SQL Server (il nome potrebbe essere il nome del container o il nome host). In questo esempio il nome del server sarà sql1.contoso.com,5433.

Il comando seguente illustra come connettersi al contenitore con sqlcmd.

sqlcmd -E -S 'sql1.contoso.com,5433'

Resources