Partager via


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

S’applique à :SQL Server sur 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.

Note

Pour des recommandations sur la configuration réseau, consultez la documentation de votre système d'exploitation.

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 (SPN) à l’aide de l’outil adutil
  • Créer le fichier keytab du service SQL Server
  • Créer les fichiers mssql.conf et krb5.conf que le conteneur SQL Server utilisera
  • 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

Prerequisites

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.
  • Installer adutil sur un ordinateur hôte Linux joint à un domaine. Pour plus d’informations, consultez la section Installer adutil.

Déploiement et préparation du conteneur

Pour configurer votre conteneur, vous devez savoir à 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 de démarrage rapide Démarrage rapide : Exécuter des images de conteneur SQL Server pour Linux avec Docker.

Lorsque vous inscrivez des noms de principal du service (SPN), vous pouvez utiliser le nom d’hôte de l'ordinateur, ou celui du conteneur. Vous devez cependant 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 le montre la capture d'écran. Lorsque les utilisateurs se connectent à sql1.contoso.com, cette entrée garantit que l’hôte approprié est atteint.

Capture d’écran de l’ajout d’un enregistrement d'hôte.

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.

Note

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 de la section Présentation de l’utilitaire adutil pour Active Directory sur un ordinateur hôte joint au domaine.

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

Si vous ne souhaitez pas que l’hôte conteneur fasse partie du domaine et que vous n’avez pas suivi les étapes pour joindre l’ordinateur au domaine, vous devez suivre ces étapes 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 avec adutil.

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

Copiez le fichier mssql.keytab qui a été créé sur l’ordinateur hôte qui exécutera le conteneur SQL Server, et configurez le conteneur afin d’utiliser le fichier 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 ces étapes sur le même ordinateur.

Créer un utilisateur Active Directory pour SQL Server et définir le nom de principal du service avec adutil.

L’activation de l’authentification Active Directory sur les conteneurs SQL Server sur Linux requiert l’exécution des étapes suivantes sur un ordinateur 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. Remplacez <password> par un mot de passe valide.

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

    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 utilisé est le 5433 au lieu du 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 SPN, à condition que des privilèges suffisants soient présents pour le compte kinit.
    • -n : nom du compte auquel les SPN seront affectés.
    • -s : nom du service à utiliser pour générer les 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 SPN. S’il n’est pas spécifié, le nom de domaine complet de l’hôte local est utilisé. Indiquez également le nom de domaine complet 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 SPN. S’il n’est pas spécifié, les noms SPN sont générés sans port. Dans ce cas, les connexions fonctionnent 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 keytab pour tous les SPN, nous pouvons utiliser l’option createauto . Remplacez <password> par un mot de passe valide.

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password '<password>' -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 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 SPN. S’il n’est pas spécifié, le nom de domaine complet de l’hôte local est utilisé. Indiquez également le nom de domaine complet 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 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 sur les commandes adutil, exécutez la commande suivante.

adutil keytab createauto --help

Attention

arcfour-hmac est un chiffrement faible et n’est pas un type de chiffrement recommandé à utiliser dans un environnement de production.

Pour créer le keytab pour l’utilisateur, la commande est la suivante. Remplacez <password> par un mot de passe valide.

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password '<password>'
  • -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 fichier 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 mssql.keytab de l’hôte Linux actuel vers l’hôte Linux où vous voulez déployer le conteneur SQL Server, puis suivre 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 cet hôte.

Créer des fichiers de configuration que le conteneur SQL Server utilisera

  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 est indiqué ci-après :

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

    [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. 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/, mssql.keytab est à l’emplacement /container/sql1/secrets/.

  4. Veillez à ce que l’utilisateur qui exécute la commande docker/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 :

Importante

La variable d’environnement SA_PASSWORD est dépréciée. Utilisez plutôt 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

Attention

Votre mot de passe doit respecter la stratégie de mot de passe par défaut de SQL Server. Par défaut, le mot de passe doit avoir au moins huit caractères appartenant à trois des quatre groupes suivants : lettres majuscules, lettres minuscules, chiffres de base 10 et symboles. Les mots de passe peuvent comporter jusqu'à 128 caractères. Utilisez des mots de passe aussi longs et complexes que possible.

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 SE Linux.

Notre exemple contient les commandes suivantes. Remplacez <password> par un mot de passe valide.

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

Se connecter au conteneur SQL Server À l’aide des commandes suivantes, créez la connexion et confirmez qu’elle existe.

Note

Vous pouvez vous connecter à une instance de SQL Server à l’aide de n’importe quel outil client SQL Server familier, tel que sqlcmd, SQL Server Management Studio (SSMS) ou l’extension MSSQL pour Visual Studio Code.

CREATE LOGIN [contoso\amvin]
    FROM WINDOWS;

SELECT name
FROM sys.server_principals;

Se connecter à SQL Server avec l’authentification Active Directory

Vous pouvez vous connecter à une instance de SQL Server à l’aide de n’importe quel outil client SQL Server familier, tel que sqlcmd, SQL Server Management Studio (SSMS) ou l’extension MSSQL pour Visual Studio Code.

Connectez-vous à SQL Server avec des informations d’identification Windows à l’aide du nom et du numéro de port SQL Server (il peut s’agir du nom du conteneur ou du nom d’hôte). Dans notre exemple, le nom du serveur est sql1.contoso.com,5433.

La commande suivante montre comment se connecter à votre conteneur avec sqlcmd.

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

Ressources