Tutoriel : Configurer l’authentification Active Directory avec des conteneurs SQL Server sur Linux

S’applique à :SQL Server - Linux

Ce tutoriel explique comment configurer des conteneurs SQL Server sur Linux pour prendre en charge l’authentification Active Directory, également appelée authentification intégrée. Pour une vue d’ensemble, consultez Authentification Active Directory avec SQL Server sur Linux.

Remarque

Pour obtenir des conseils sur la configuration du réseau, reportez-vous à la documentation de votre système d’exploitation (OS).

Ce didacticiel contient les tâches suivantes :

  • Installer adutil
  • Joindre un hôte Linux à un domaine Active Directory
  • Créer un utilisateur Active Directory pour SQL Server et définir le nom de principal du service à l’aide de l’outil adutil
  • Créer le fichier keytab du service SQL Server
  • Créer les fichiers mssql.conf et krb5.conf qui seront utilisés par le conteneur SQL Server
  • Monter les fichiers de configuration et déployer le conteneur SQL Server
  • Créer des comptes de connexion SQL Server basés sur Active Directory avec Transact-SQL
  • Se connecter à SQL Server à l’aide de l’authentification Active Directory

Prérequis

Les éléments suivants sont nécessaires avant de configurer l’authentification Active Directory :

  • Disposer d’un contrôleur de domaine Active Directory (Windows) dans votre réseau.
  • Installez l’outil adutil sur un ordinateur hôte Linux joint à un domaine. Suivez les instructions de la section Installer adutil pour plus de détails.

Déploiement et préparation du conteneur

Pour configurer votre conteneur, vous devez connaître à l’avance quel port sera utilisé par le conteneur sur l’hôte. Le port par défaut, 1433, peut être mappé différemment sur votre hôte de conteneur. Pour ce tutoriel, le port 5433 sur l’hôte sera mappé au port 1433 du conteneur. Pour plus d’informations, consultez notre guide, Démarrage rapide : Exécuter des images de conteneur SQL Server avec Docker.

Lorsque vous inscrivez des noms de principal du service (SPN), vous pouvez utiliser le nom d’hôte de l’ordinateur ou le nom du conteneur. Toutefois, vous devez le configurer en fonction de ce que vous souhaitez voir, lorsque vous vous connectez au conteneur en externe.

Vérifiez qu’une entrée d’hôte de transfert (A) est ajoutée dans Active Directory pour l’adresse IP de l’hôte Linux, mappée au nom du conteneur SQL Server. Dans ce tutoriel, l’adresse IP de l’ordinateur hôte sql1 est 10.0.0.10, et le nom du conteneur SQL Server est sql1. Ajoutez l’entrée de l’hôte de transfert dans Active Directory comme indiqué dans la capture d’écran. Lorsque les utilisateurs se connectent à sql1.contoso.com, cette entrée garantit que l’hôte approprié est atteint.

Screenshot of adding a host record.

Pour ce tutoriel, nous utilisons un environnement dans Azure avec trois machines virtuelles. Une machine virtuelle agit en tant que contrôleur de domaine (DC) Windows, avec le nom de domaine contoso.com. Le contrôleur de domaine est nommé adVM.contoso.com. Le deuxième ordinateur est un ordinateur Windows appelé winbox, doté de Windows 10 Desktop, qui est utilisé comme zone cliente et sur lequel SQL Server Management Studio (SSMS) est installé. Le troisième ordinateur est un ordinateur Ubuntu 18.04 LTS nommé sql1, qui héberge les conteneurs SQL Server. Tous les ordinateurs sont joints au domaine contoso.com. Pour plus d’informations, consultez Joindre SQL Server sur un hôte Linux à un domaine Active Directory.

Notes

Il n’est pas obligatoire de joindre l’ordinateur conteneur hôte au domaine, comme vous le verrez ultérieurement dans cet article.

Installer adutil

Pour installer adutil, suivez les instructions dans Présentation de l’utilitaire adutil pour Active Directory sur l’ordinateur hôte joint au domaine.

Créer l’utilisateur Active Directory, les SPN et le keytab du service SQL Server

Si vous ne souhaitez pas que l’hôte conteneur SQL Server sur Linux fasse partie du domaine et que vous n’avez pas suivi les étapes pour joindre l’ordinateur au domaine, suivez les étapes ci-dessous sur un autre ordinateur Linux qui fait déjà partie du domaine Active Directory :

  1. Créez un utilisateur Active Directory pour SQL Server et définissez le SPN à l’aide d’adutil.

  2. Créez et configurez le fichier keytab du service SQL Server.

Copiez le fichier mssql.keytab créé sur l’ordinateur hôte qui exécutera le conteneur SQL Server, et configurez le conteneur afin d’utiliser le mssql.keytab copié. Si vous le souhaitez, vous pouvez également joindre votre hôte Linux qui exécutera le conteneur SQL Server au domaine Active Directory et suivre les étapes ci-dessous sur le même ordinateur.

Créer un utilisateur Active Directory pour SQL Server et définir le nom de principal du service à l’aide d’adutil

L’activation de l’authentification Active Directory sur les conteneurs SQL Server sur Linux requiert l’exécution des étapes suivantes sur une machine Linux qui fait partie du domaine Active Directory.

  1. Obtenez ou renouvelez le ticket Kerberos TGT (Ticket-Granting Ticket) à l’aide de la commande kinit . Utilisez un compte privilégié pour la commande kinit. Le compte doit avoir l’autorisation de se connecter au domaine et doit également être en mesure de créer des comptes et des noms de principaux de service dans le domaine.

    Dans cet exemple de script, un utilisateur privilégié appelé privilegeduser@CONTOSO.COM a déjà été créé sur le contrôleur de domaine.

    kinit privilegeduser@CONTOSO.COM
    
  2. Avec adutil, créez le nouvel utilisateur qui sera utilisé comme compte Active Directory privilégié par SQL Server.

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

    Les mots de passe peuvent être spécifiés de l’une des trois façons suivantes :

    • Indicateur de mot de passe : --password <password>
    • Variables d’environnement – ADUTIL_ACCOUNT_PWD
    • Entrée interactive

    La priorité des méthodes d’entrée de mot de passe suit l’ordre des options ci-dessus. Les options recommandées sont de fournir le mot de passe à l’aide des variables d’environnement ou d’une entrée interactive, car elles sont plus sécurisées que l’indicateur de mot de passe.

    Vous pouvez spécifier le nom du compte à l’aide du nom unique (-distname) comme indiqué ci-dessus, ou vous pouvez utiliser le nom de l’unité d’organisation (UO). Le nom de l’unité d’organisation (--ou) a priorité sur le nom unique si vous spécifiez les deux. Vous pouvez exécuter la commande ci-dessous pour plus d’informations :

    adutil user create --help
    
  3. Inscrivez les noms SPN auprès de l’utilisateur créé ci-dessus. Vous pouvez utiliser le nom de l’ordinateur hôte à la place du nom du conteneur, si vous le souhaitez, en fonction de la façon dont vous souhaitez que la connexion apparaisse en externe. Dans ce tutoriel, le port 5433 est utilisé à la place de 1433. Il s’agit du mappage de port pour le conteneur. Votre numéro de port peut être différent.

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • addauto créera automatiquement les noms SPN, à condition que des privilèges suffisants soient présents pour le compte kinit.
    • -n : nom du compte auquel les noms SPN seront affectés.
    • -s : nom du service à utiliser pour générer les noms SPN. Dans ce cas, il est destiné à un service SQL Server et le nom du service est MSSQLSvc.
    • -H : nom d’hôte à utiliser pour générer les noms SPN. S’il n’est pas spécifié, le nom de domaine complet de l’hôte local est utilisé. Spécifiez également le FQDN pour le nom du conteneur. Dans ce cas, le nom du conteneur est sql1 et le nom de domaine complet est sql1.contoso.com.
    • -p : port à utiliser pour générer les noms SPN. S’il n’est pas spécifié, les noms SPN sont générés sans port. Les connexions fonctionnent dans ce cas seulement quand SQL Server écoute le port par défaut 1433.

Créer le fichier keytab du service SQL Server

Créez le fichier keytab qui contient des entrées pour chacun des 4 noms SPN créés précédemment, et une entrée pour l’utilisateur. Le fichier keytab sera monté sur le conteneur, de sorte qu’il peut être créé à n’importe quel emplacement sur l’hôte. Vous pouvez modifier ce chemin en toute sécurité, tant que le fichier keytab obtenu est monté correctement lors de l’utilisation de docker/podman pour déployer le conteneur.

Pour créer le fichier keytab pour tous les noms SPN, nous pouvons utiliser l’option createauto :

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
  • -k : chemin où vous souhaitez créer le fichier mssql.keytab. Dans l’exemple précédent, le répertoire /container/sql1/secrets doit déjà exister sur l’hôte.
  • -p : port à utiliser pour générer les noms SPN. S’il n’est pas spécifié, les noms SPN sont générés sans port.
  • -H : nom d’hôte à utiliser pour générer les noms SPN. S’il n’est pas spécifié, le nom de domaine complet de l’hôte local est utilisé. Spécifiez également le FQDN pour le nom du conteneur. Dans ce cas, le nom du conteneur est sql1 et le nom de domaine complet est sql1.contoso.com.
  • -s : nom du service à utiliser pour générer les noms SPN. Dans ce cas, il est destiné à un service SQL Server et le nom du service est MSSQLSvc.
  • --password : il s’agit du mot de passe du compte d’utilisateur Active Directory privilégié qui a été créé précédemment.
  • -e ou --enctype : Types de chiffrement pour l’entrée keytab. Utilisez une liste de valeurs séparées par des virgules. S’il n’est pas spécifié, une invite interactive est présentée.

Quand vous avez le choix entre les types de chiffrement, vous pouvez en choisir plusieurs. Pour cet exemple, nous avons choisi aes256-cts-hmac-sha1-96 et arcfour-hmac. Veillez à choisir un type de chiffrement pris en charge par l’hôte et le domaine.

Si vous souhaitez choisir le type de chiffrement de façon non interactive, vous pouvez spécifier votre choix de type de chiffrement avec l’argument -e dans la commande ci-dessus. Pour obtenir une aide supplémentaire concernant adutil, exécutez la commande suivante.

adutil keytab createauto --help

Attention

arcfour-hmac est un chiffrement faible et il n'est pas recommandé de l'utiliser dans un environnement de production.

Pour créer le fichier keytab pour l’utilisateur, la commande est la suivante :

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
  • -k : chemin où vous souhaitez créer le fichier mssql.keytab. Dans l’exemple précédent, le répertoire /container/sql1/secrets doit déjà exister sur l’hôte.
  • -p : principal à ajouter au fichier keytab.

La création/création automatique du keytab adutil ne remplace pas les fichiers précédents. Elle s’ajoute simplement au fichier, s’il est déjà présent.

Vérifiez que le fichier keytab créé dispose des autorisations appropriées lors du déploiement du conteneur.

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

À ce stade, vous pouvez copier le fichier mssql.keytab de l’hôte Linux actuel vers l’hôte Linux où vous voulez déployer le conteneur SQL Server, puis suivez les étapes restantes sur l’hôte Linux qui exécutera le conteneur SQL Server. Si les étapes ci-dessus ont été effectuées sur l’hôte Linux où les conteneurs SQL Server seront déployés, suivez également les étapes ci-dessous sur ce même hôte.

Créer les fichiers de configuration qui seront utilisés par le conteneur SQL Server

  1. Créez un fichier mssql.conf avec les paramètres pour Active Directory. Ce fichier peut être créé n’importe où sur l’hôte et doit être monté correctement au cours de la commande docker run. Dans cet exemple, nous avons placé ce fichier mssql.conf sous /container/sql1, qui est notre répertoire de conteneur. Le contenu de mssql.conf se présente comme suit :

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    
    • privilegedadaccount : utilisateur Active Directory privilégié à utiliser pour l’authentification Active Directory.
    • kerberoskeytabfile : le chemin dans le conteneur où le fichier mssql.keytab se trouvera.
  2. Créez un fichier krb5.conf, semblable à l’exemple suivant. La casse est importante pour ces fichiers.

    [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. Copiez tous les fichiers (mssql.conf, krb5.conf et mssql.keytab) à un emplacement qui sera monté sur le conteneur SQL Server. Dans cet exemple, ces fichiers sont placés sur l’hôte aux emplacements suivants : mssql.conf et krb5.conf à l’emplacement /container/sql1/, et mssql.keytab à l’emplacement /container/sql1/secrets/.

  4. Veillez à ce que l’utilisateur qui exécute la commande dockr/podman possède suffisamment d’autorisations sur ces dossiers. Il a besoin d’accéder au chemin du dossier créé lorsque le conteneur démarre. Dans cet exemple, nous avons fourni les autorisations ci-dessous sur le chemin du dossier :

    sudo chmod 755 /container/sql1/
    

Monter les fichiers de configuration et déployer le conteneur SQL Server

Exécutez votre conteneur SQL Server et montez les fichiers de configuration Active Directory appropriés qui ont été créés précédemment :

Important

La variable d’environnement SA_PASSWORD est dépréciée. Utilisez MSSQL_SA_PASSWORD à la place.

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

Notes

Quand vous exécutez le conteneur sur le module de sécurité Linux (LSM) comme les hôtes activés pour SELinux, vous devez monter les volumes à l’aide de l’option Z, qui indique à Docker d’étiqueter le contenu avec une étiquette privée non partagée. Pour plus d’informations, reportez-vous à la configuration de l’étiquette selinux.

Notre exemple contient les commandes suivantes :

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
  • Les fichiers mssql.conf et krb5.conf se trouvent dans le chemin d’accès de fichier hôte /container/sql1.
  • Le fichier mssql.keytab qui a été créé se trouve dans le chemin d’accès de fichier hôte /container/sql1/secrets.
  • Comme notre ordinateur hôte se trouve sur Azure, les détails Active Directory doivent être ajoutés à la commande docker run dans le même ordre. Dans notre exemple, le contrôleur de domaine adVM se trouve dans le domaine contoso.com, avec l’adresse IP 10.0.0.4. Le contrôleur de domaine exécute DNS et KDC.

Créer des comptes de connexion SQL Server basés sur Active Directory avec Transact-SQL

Connectez-vous au conteneur SQL Server. À l’aide des commandes suivantes, créez la connexion et vérifiez qu’elle existe. Vous pouvez exécuter cette commande à partir d’un ordinateur client (Windows ou Linux) qui exécute SSMS, Azure Data Studio (ADS) ou n’importe quel autre outil d’interface de ligne de commande (CLI).

CREATE LOGIN [contoso\amvin] FROM WINDOWS;

SELECT name FROM sys.server_principals;

Se connecter à SQL Server avec l’authentification Active Directory

Pour vous connecter en utilisant SQL Server Management Studio (SSMS) ou Azure Data Studio, connectez-vous à SQL Server avec les identifiants Windows en utilisant le numéro de port et le nom du SQL Server (le nom peut être le nom du conteneur ou le nom d’hôte). Dans notre exemple, le nom du serveur est sql1.contoso.com,5433.

Vous pouvez également utiliser un outil comme sqlcmd pour vous connecter à SQL Server dans votre conteneur.

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

Ressources