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

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

Questa esercitazione è costituita dalle attività seguenti:

  • Installare adutil
  • Aggiungere l'host Linux al dominio di Active Directory
  • Creare un utente di Active Directory per SQL Server e impostare ServicePrincipalName (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 basati su Active Directory SQL Server tramite Transact-SQL
  • Connettersi a SQL Server tramite l'autenticazione di Active Directory

Prerequisiti

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

  • Avere un controller di Dominio di 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 Eseguire immagini del contenitore di SQL Server con Docker

Quando si registrano i nomi delle entità servizio (SPN), è possibile usare il nome host del computer o il nome del contenitore, ma è consigliabile configurarli in base a ciò che si vuole visualizzare quando ci si connette al contenitore dall'esterno.

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 myubuntu è 10.0.0.10 e il nome del contenitore di SQL Server è sql1. La voce per l'host di inoltro in Active Directory viene aggiunta come illustrato di seguito. La voce garantisce il raggiungimento dell'host corretto quando gli utenti si connettono a sql1.contoso.com.

Aggiungere il record dell'host

Per questa esercitazione viene usato un ambiente in Azure con tre macchine virtuali. 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 myubuntu, che ospita i contenitori di SQL Server. Tutti i computer sono stati aggiunti 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 aggiunto a un dominio.

Creazione della scheda chiave utente, SPN e SQL Server di Active Directory

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

  1. Creare un utente di Active Directory per SQL Server e impostare il nome SPN usando lo strumento 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. Facoltativamente, è anche possibile aggiungere l'host Linux che eseguirà il contenitore SQL Server al dominio di Active Directory e seguire la procedura seguente nello stesso computer.

Creare un utente di Active Directory per SQL Server e impostare ServicePrincipalName usando lo strumento adutil

L'abilitazione dell'autenticazione di Active Directory nei contenitori SQL Server in Linux richiede l'esecuzione dei passaggi da 1 a 3 indicati di seguito in un computer Linux che fa parte del dominio di 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 lo strumento 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'
    

    Nota

    È 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
    

    Nota

    • addauto creerà automaticamente i nomi SPN, 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 dei nomi delle entità servizio. In questo caso, trattandosi del nome del servizio SQL Server, è MSSQLSvc.
    • -H: nome host da usare per la generazione dei nomi delle entità servizio. Se non specificato, verrà usato il nome di dominio completo dell'host locale. Specificare 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 dei nomi delle entità servizio. Se non specificata, i nomi delle entità servizio verranno generati senza porta. In questo caso, le connessioni SQL funzioneranno 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 4 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

Nota

  • -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 dei nomi delle entità servizio. Se non specificata, i nomi delle entità servizio verranno generati senza porta.
  • -H: nome host da usare per la generazione dei nomi delle entità servizio. Se non specificato, verrà usato il nome di dominio completo dell'host locale. Specificare 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 dei nomi delle entità servizio. In questo caso, trattandosi del nome del servizio SQL Server, è MSSQLSvc.
  • --password: è la password dell'account utente di Active Directory con privilegi creato in precedenza.
  • -e oppure --enctype: tipi di crittografia per la voce keytab. Usare un elenco delimitato da virgole dei valori. Se non specificato, verrà 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

Nota

arcfour-hmac è un tipo di crittografia debole e non è consigliato per l'uso nell'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'

Nota

  • -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

Nota

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, eseguire anche i passaggi successivi nello stesso host.

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

  1. Creare un mssql.conf file 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
    

    Nota

    • 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. Di seguito è illustrato un esempio. 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 SQL Server e montare i file di configurazione di Active Directory corretti creati in precedenza come illustrato di seguito:

Importante

La variabile di ambiente SA_PASSWORD è deprecata. Usare 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

Nota

  • 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, i dettagli di Active Directory nello stesso ordine devono essere aggiunti al comando di esecuzione docker. 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 basati su Active Directory SQL Server in Transact-SQL

Connettersi al contenitore di SQL ed eseguire i comandi seguenti per creare l'account di accesso e verificare che risulti elencato. È possibile eseguire questo comando da un computer client (Windows o Linux) che esegue SSMS, Azure Data Studio (ADS) 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 tramite l'autenticazione di Active Directory

Per stabilire la connessione tramite SSMS o ADS, 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

Passaggi successivi