Esercitazione: Configurare l'autenticazione di Active Directory tramite i contenitori di SQL Server in Linux

Si applica a: SQL Server - 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.

Nota

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

Questa esercitazione è costituita dalle attività seguenti:

  • Installare adutil
  • Unire l’host Linux al dominio Active Directory
  • Creare un utente Active Directory per SQL Server e impostare il nome dell'entità servizio (SPN) tramite 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 lo strumento adutil in 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. Il mapping della porta predefinita 1433 potrebbe essere diverso nell'host del contenitore dell'utente. Per questa esercitazione, verrà eseguito il mapping della porta 5433 dell'host alla porta 1433 del contenitore. Per altre informazioni, vedere Avvio rapido: Eseguire 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 sia stata aggiunta una voce per l'host di inoltro (A) in Active Directory per l'indirizzo IP dell'host Linux eseguendo il mapping al nome del contenitore di SQL Server. In questa esercitazione, l'indirizzo IP del computer host sql1 è 10.0.0.10 e il nome del contenitore di SQL Server è sql1. Aggiungere la voce per l'host di inoltro in Active Directory come illustrato di seguito. La voce garantisce il raggiungimento dell'host corretto quando gli utenti si connettono a sql1.contoso.com.

Screenshot della pagina di aggiunta record.

Per questa esercitazione viene usato un ambiente in Azure con tre macchine virtuali (VM). Una macchina virtuale che funge da controller di dominio (DC) Windows con il nome di dominio contoso.com. Il controller di dominio è denominato 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.

Nota

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

Installare adutil

Per installare lo strumento adutil, eseguire i passaggi descritti in Introduzione ad adutil - Utilità di Active Directory in un computer host unito al dominio.

Creare un utente di Active Directory 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 dell'entità servizio (SPN) tramite 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 ticket-granting ticket (TGT) Kerberos usando il comando kinit. Usare un account con privilegi per il comando kinit. L'account deve avere l'autorizzazione per connettersi al dominio e anche poter creare account e nomi delle entità servizio 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 Active Directory con privilegi da SQL Server.

    adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password 'P@ssw0rd'
    

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

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

    La precedenza dei metodi di immissione delle password corrisponde all'ordine delle opzioni elencate in precedenza. È consigliabile fornire la password usando le variabili di ambiente o l'input interattivo, perché si tratta di opzioni più sicure rispetto al flag password.

    È possibile specificare il nome dell'account usando il nome distinto (-distname), come illustrato in precedenza, oppure è possibile usare il nome dell'unità organizzativa (OU). Il nome dell'unità organizzativa (--ou) ha la precedenza sul nome distinto nel caso in cui li si specifichi entrambi. Per altri dettagli, è possibile eseguire il comando seguente:

    adutil user create --help
    
  3. Registrare i nomi delle entità servizio nell'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. Questo è il mapping delle porte per il contenitore. Il numero di porta dell'utente potrebbe essere diverso.

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • addauto creerà automaticamente i nomi delle entità servizio, purché siano presenti privilegi sufficienti per l'account kinit.
    • -n: nome dell'account a cui verranno assegnati i nomi delle entità servizio.
    • -s: nome del servizio da usare per la generazione degli SPN. In questo caso, trattandosi del nome del servizio SQL Server, è MSSQLSvc.
    • -H: nome host da usare per la generazione degli SPN. Se non specificato, verrà usato il nome di dominio completo dell'host locale. Fornire anche il nome di dominio completo come 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 creati in precedenza e quella per l'utente. Il file keytab verrà montato nel contenitore, in modo che possa essere creato in qualsiasi posizione nell'host. È possibile modificare il percorso senza problemi, purché il file keytab risultante venga montato correttamente quando si usa docker/podman per distribuire il contenitore.

Per creare il file keytab per tutti i nomi delle entità servizio, è possibile usare l'opzione createauto:

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -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 come 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, trattandosi del nome del servizio SQL Server, è MSSQLSvc.
  • --password: password dell'account utente Active Directory con privilegi creato in precedenza.
  • -e o --enctype: tipi di crittografia per la voce 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.

Se si preferisce scegliere in modo non interattivo il tipo di crittografia, è possibile specificare la scelta del tipo di crittografia con l'argomento -e nel comando precedente. Per altre informazioni sui comandi adutil, eseguire il comando seguente.

adutil keytab createauto --help

Attenzione

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

Per creare il file keytab per l'utente, il comando è:

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
  • -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.

Il comando adutil keytab create/autocreate non sovrascrive i file precedenti, ma esegue solo l'accodamento al file se è già presente.

Assicurarsi che il file keytab creato abbia le autorizzazioni corrette impostate quando si distribuisce il contenitore.

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 nell'host e deve essere montato correttamente durante l'esecuzione del comando docker run. 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
    
    [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 nella posizione /container/sql1/secrets/.

  4. Verificare l'utente che esegue il comando docker/podman disponga di autorizzazioni sufficienti per tali cartelle. All'avvio del contenitore, l'utente deve accedere al percorso di cartella creato. In questo esempio, per consentire l'accesso al percorso di cartella, sono state concesse le autorizzazioni che seguono:

    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=<YourStrong@Passw0rd>" \
-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

Nota

Quando si esegue il contenitore in un modulo di sicurezza Linux, ad esempio negli host abilitati per SELinux, è necessario montare i volumi usando l'opzione Z, che indica a docker di applicare al contenuto un'etichetta privata non condivisa. Per altre informazioni, vedere Configure the SE Linux label (Configurare l'etichetta SE Linux).

L'esempio conterrà i comandi seguenti:

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=P@ssw0rd" -p 5433:1433 --name sql1 \
-v /container/sql1:/var/opt/mssql/ \
-v /container/sql1/krb5.conf:/etc/krb5.conf \
--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. È possibile eseguire questo comando da un computer client (Windows o Linux) che esegue SSMS, Azure Data Studio o qualsiasi altro strumento dell'interfaccia della riga di comando.

CREATE LOGIN [contoso\amvin] FROM WINDOWS;

SELECT name FROM sys.server_principals;

Connettersi a SQL Server con l'autenticazione di Active Directory

Per stabilire la connessione tramite SQL Server Management Studio (SSMS) o Azure Data Studio, accedere a SQL Server con le credenziali Windows usando il nome e il numero di porta di SQL Server (il nome potrebbe corrispondere al nome del contenitore o al nome host). In questo esempio il nome del server sarà sql1.contoso.com,5433.

È anche possibile usare uno strumento come sqlcmd per connettersi a SQL Server nel contenitore.

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

Risorse