Tutorial: Konfigurieren der Active Directory-Authentifizierung mit SQL Server für Linux-Container

Gilt für:SQL Server – Linux

In diesem Tutorial wird erläutert, wie Sie SQL Server für Linux-Container konfigurieren, um die Active Directory-Authentifizierung zu unterstützen, die auch als integrierte Authentifizierung bezeichnet wird. Eine Übersicht dazu finden Sie unter Active Directory-Authentifizierung für SQL Server für Linux.

Hinweis

Aktuelle Anleitungen zur Netzwerkkonfiguration finden Sie in der Dokumentation für Ihr Betriebssystem (OS).

Dieses Tutorial umfasst die folgenden Aufgaben:

  • Installieren von adutil
  • Verknüpfen eines Linux-Hosts mit einer Active Directory-Domäne
  • Erstellen eines Active Directory-Benutzers für SQL Server und Festlegen des Dienstprinzipalnamens (SPN) mit dem Tool adutil
  • Erstellen der Schlüsseltabellendatei für den SQL Server-Dienst
  • Erstellen der Dateien mssql.conf und krb5.conf zur Verwendung durch den SQL Server-Container
  • Einbinden der Konfigurationsdateien und Bereitstellen der SQL Server-Container
  • Erstellen von Active Directory-basierten SQL Server-Anmeldeinformationen mit Transact-SQL
  • Herstellen einer Verbindung mit SQL Server mithilfe der Active Directory-Authentifizierung

Voraussetzungen

Folgende Voraussetzungen bestehen für das Konfigurieren der Active Directory-Authentifizierung:

  • Richten Sie einen Active Directory-Domänencontroller (Windows) in Ihrem Netzwerk ein.
  • Installieren Sie adutil auf einem Linux-Hostcomputer, der in eine Domäne eingebunden ist. Einzelheiten finden Sie im Abschnitt Installieren von adutil.

Containerbereitstellung und -vorbereitung

Zum Einrichten Ihres Containers müssen Sie im Voraus den Port kennen, der vom Container auf dem Host verwendet wird. Der Standardport 1433 ist möglicherweise auf Ihrem Containerhost anders zugeordnet. Für dieses Tutorial wird Port 5433 auf dem Host Port 1433 des Containers zugeordnet. Weitere Informationen finden Sie unter Schnellstart: Ausführen von SQL Server Linux-Containerimages mit Docker.

Beim Registrieren von Dienstprinzipalnamen (Service Principal Names, SPN) können Sie den Hostnamen des Computers oder den Namen des Containers verwenden. Sie sollten ihn jedoch entsprechend dem konfigurieren, was angezeigt werden soll, wenn Sie extern eine Verbindung mit dem Container herstellen.

Stellen Sie sicher, dass in Active Directory ein Eintrag für den Weiterleitungshost (A) für die Linux-Host-IP-Adresse hinzugefügt wurde. Achten Sie dabei auf eine Entsprechung mit dem Namen des SQL Server-Containers. In diesem Tutorial lautet die IP-Adresse des sql1-Hostcomputers 10.0.0.10 und der Name des SQL Server-Containers sql1. Fügen Sie den Eintrag für den Weiterleitungshost in Active Directory wie im Screenshot dargestellt hinzu. Der Eintrag stellt sicher, dass Benutzer beim Herstellen einer Verbindung mit sql1.contoso.com an den richtigen Host weitergeleitet werden.

Screenshot of adding a host record.

Für dieses Tutorial wird eine Umgebung in Azure mit drei virtuellen Computern (VMs) verwendet. Eine VM fungiert als Windows-Domänencontroller (DC) mit dem Domänennamen contoso.com. Der Domänencontroller trägt den Namen adVM.contoso.com. Der zweite Computer ist ein Windows-Computer namens winbox, auf dem Windows 10 Desktop ausgeführt wird, der als Clientfeld verwendet wird und auf dem SQL Server Management Studio (SSMS) installiert ist. Der dritte Computer ist ein Ubuntu 18.04 LTS-Computer namens sql1, der SQL Server-Container hostet. Alle Computer werden in die contoso.com-Domäne eingebunden. Weitere Informationen finden Sie unter Verknüpfen eines Hosts für SQL Server für Linux mit einer Active Directory-Domäne.

Hinweis

Wie später in diesem Artikel noch genauer erläutert wird, ist das Einbinden des Hostcontainercomputers in die Domäne nicht obligatorisch.

Installieren von adutil

Führen Sie für die Installation von adutil die unter Einführung in adutil – Active Directory-Hilfsprogramm beschriebenen Schritte auf einem Hostcomputer aus, der in die Domäne eingebunden ist.

Erstellen des Active Directory-Benutzers, der SPNs und der Schlüsseltabelle des SQL Server-Diensts

Wenn der Containerhost nicht Teil der Domäne sein soll und wenn Sie die Schritte zum Einbinden des Computers in die Domäne nicht befolgt haben, sollten Sie diese Schritte auf einem anderen Linux-Computer ausführen, der bereits Teil der Active Directory-Domäne ist:

  1. Erstellen Sie einen Active Directory-Benutzer für SQL Server und legen Sie den SPN mithilfe von adutil fest.

  2. Erstellen und Konfigurieren der Schlüsseltabellendatei für den SQL Server-Dienst

Kopieren Sie die Datei mssql.keytab, die erstellt wurde, auf den Hostcomputer, auf dem der SQL Server-Container ausgeführt wird, und konfigurieren Sie den Container so, dass er die kopierte Datei mssql.keytab verwendet. Optional können Sie Ihren Linux-Host, der den SQL Server-Container ausführt, auch in die Active Directory-Domäne einbinden und diese Schritte auf demselben Computer ausführen.

Erstellen eines Active Directory-Benutzers für SQL Server und Festlegen des Dienstprinzipalnamens mithilfe von adutil

Wenn die Active Directory-Authentifizierung für SQL Server für Linux-Container aktiviert werden soll, müssen dazu die folgenden Schritte auf einem Linux-Computer ausgeführt werden, der Teil der Active Directory-Domäne ist.

  1. Erwerben oder erneuern Sie das Kerberos-TGT (Ticket-Granting Ticket) mithilfe des kinit-Befehls. Verwenden Sie ein privilegiertes Konto für den kinit-Befehl. Das Konto muss über die Berechtigung verfügen, eine Verbindung mit der Domäne herzustellen. Außerdem sollte es in der Lage sein, Konten und SPNs in der Domäne zu erstellen.

    In diesem Beispielskript wurde bereits ein privilegierter Benutzer namens privilegeduser@CONTOSO.COM auf dem Domänencontroller erstellt.

    kinit privilegeduser@CONTOSO.COM
    
  2. Erstellen Sie mit adutil den neuen Benutzer, der von SQL Server als privilegiertes Active Directory-Konto verwendet wird.

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

    Kennwörter können mit einer der drei folgenden Methoden angegeben werden:

    • Kennwort-Flag: --password <password>
    • Umgebungsvariablen: ADUTIL_ACCOUNT_PWD
    • Interaktive Eingabe

    Die Rangfolge der Methoden zur Kennworteingabe entspricht der Reihenfolge der oben aufgeführten Optionen. Es empfiehlt sich, das Kennwort mithilfe von Umgebungsvariablen oder interaktiven Eingaben bereitzustellen, da diese im Vergleich zum Kennwortflag sicherer sind.

    Sie können den Namen des Kontos wie oben gezeigt mithilfe des Distinguished Name (-distname) angeben, oder Sie können auch den Namen der Organisationseinheit (OE) verwenden. Falls Sie beide angeben, hat der Name der Organisationseinheit (--ou) Vorrang vor dem Distinguished Name. Sie können den folgenden Befehl ausführen, um weitere Informationen zu erhalten:

    adutil user create --help
    
  3. Registrieren Sie SPNs für den oben erstellten Benutzer. Sie können den Namen des Hostcomputers anstelle des Containernamens nutzen, je nachdem, wie die Verbindung extern angezeigt werden soll. In diesem Tutorial wird Port 5433 anstelle von 1433 verwendet. Hierbei handelt es sich um die Portzuordnung für den Container. Ihre Portnummer kann anders lauten.

    adutil spn addauto -n sqluser -s MSSQLSvc -H sql1.contoso.com -p 5433
    
    • addauto erstellt die SPNs automatisch, sofern das kinit-Konto über die erforderlichen Berechtigungen verfügt.
    • -n: Dies ist der Name des Kontos, dem die SPNs zugewiesen werden.
    • -s: Dies ist der Dienstname, der zum Erstellen von SPNs verwendet werden soll. In diesem Fall ist es der Name für den SQL Server-Dienst, weshalb der Dienstname MSSQLSvc lautet.
    • -H: Dies ist der Hostname, der zum Erstellen von SPNs verwendet werden soll. Wenn kein Name angegeben ist, wird der FQDN des lokalen Hosts verwendet. Geben Sie auch für den Containernamen den FQDN an. In diesem Fall ist sql1 der Containername, und der FQDN lautet sql1.contoso.com.
    • -p: Dies ist der Port, der zum Erstellen von SPNs verwendet werden soll. Wenn nicht angegeben, werden SPNs ohne einen Port generiert. Verbindungen funktionieren in diesem Fall nur, wenn die SQL Server-Instanz am Standardport 1433 lauscht.

Erstellen der Schlüsseltabellendatei für den SQL Server-Dienst

Erstellen Sie die Schlüsseltabellendatei, die Einträge für jeden der vier zuvor erstellten SPNs und einen Eintrag für den Benutzer enthält. Die Schlüsseltabellendatei wird mit dem Container verknüpft. So ist die Erstellung an jedem Speicherort des Hosts möglich. Sie können diesen Pfad sicher ändern, solange die daraus resultierende Schlüsseltabelle ordnungsgemäß verknüpft wird, wenn Docker/Podman zum Bereitstellen des Containers verwendet werden.

Zum Erstellen der Schlüsseltabelle für alle SPNs können Sie die createauto-Option verwenden:

adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password 'P@ssw0rd' -s MSSQLSvc
  • -k: Dies ist der Pfad, in dem die mssql.keytab-Datei erstellt werden soll. Im vorangehenden Beispiel sollte das Verzeichnis /container/sql1/secrets bereits auf dem Host vorhanden sein.
  • -p: Dies ist der Port, der zum Erstellen von SPNs verwendet werden soll. Wenn nicht angegeben, werden SPNs ohne einen Port generiert.
  • -H: Dies ist der Hostname, der zum Erstellen von SPNs verwendet werden soll. Wenn kein Name angegeben ist, wird der FQDN des lokalen Hosts verwendet. Geben Sie auch für den Containernamen den FQDN an. In diesem Fall ist sql1 der Containername, und der FQDN lautet sql1.contoso.com.
  • -s: Dies ist der Dienstname, der zum Erstellen von SPNs verwendet werden soll. In diesem Fall ist es der Name für den SQL Server-Dienst, weshalb der Dienstname MSSQLSvc lautet.
  • --password: Dies ist das Kennwort des privilegierten Active Directory-Benutzerkontos, das zuvor erstellt wurde.
  • -e oder --enctype: Dies sind Verschlüsselungstypen für den Schlüsseltabelleneintrag. Verwenden Sie eine durch Trennzeichen getrennte Liste von Werten. Wenn nicht angegeben, wird eine interaktive Eingabeaufforderung angezeigt.

Bei der Auswahl der Verschlüsselungstypen können Sie mehr als einen auswählen. In diesem Beispiel werden aes256-cts-hmac-sha1-96 und arcfour-hmac ausgewählt. Stellen Sie sicher, dass Sie einen Verschlüsselungstyp auswählen, der vom Host und der Domäne unterstützt wird.

Wenn Sie den Verschlüsselungstyp nicht interaktiv auswählen möchten, können Sie mit dem Argument „-e“ im obigen Befehl den gewünschten Verschlüsselungstyp angeben. Führen Sie den folgenden Befehl aus, um zusätzliche Hilfe zu den adutil-Befehlen zu erhalten.

adutil keytab createauto --help

Achtung

Bei arcfour-hmac handelt es sich um eine schwache Verschlüsselung und keinen empfohlenen Verschlüsselungstyp, der in einer Produktionsumgebung verwendet werden soll.

Der Befehl zum Erstellen der Schlüsseltabelle für den Benutzer lautet folgendermaßen:

adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password 'P@ssw0rd'
  • -k: Dies ist der Pfad, in dem die mssql.keytab-Datei erstellt werden soll. Im vorangehenden Beispiel sollte das Verzeichnis /container/sql1/secrets bereits auf dem Host vorhanden sein.
  • -p: Dies ist der Prinzipal, der der Schlüsseltabelle hinzugefügt wird.

Durch die adutil-Schlüsseltabelle „create/autocreate“ werden die vorherigen Dateien nicht überschrieben, sondern an die bereits vorhandene Datei angefügt.

Sorgen Sie dafür, dass für die erstellte Schlüsseltabelle die erforderlichen Berechtigungen festgelegt sind, wenn der Container bereitgestellt wird.

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

Nun können Sie mssql.keytab vom aktuellen Linux-Host auf den Linux-Host kopieren, auf dem der SQL Server-Container bereitgestellt werden soll. Anschließend können Sie die restlichen Schritte für den Linux-Host befolgen, der den SQL Server-Container ausführt. Wenn die oben stehenden Schritte für denselben Linux-Host ausgeführt wurden, auf dem auch die SQL Server-Container bereitgestellt werden sollen, befolgen Sie die nächsten Schritte ebenfalls auf diesem Host.

Erstellen der Konfigurationsdateien zur Verwendung durch den SQL Server-Container

  1. Erstellen Sie eine Datei mssql.conf mit den Einstellungen für Active Directory. Diese Datei kann an einer beliebigen Stelle auf dem Host erstellt werden und muss während des docker run-Befehls ordnungsgemäß eingebunden werden. In diesem Beispiel wurde diese Datei mssql.conf unter /container/sql1 gespeichert. Dabei handelt es sich um das Containerverzeichnis. Der Inhalt von mssql.conf wird wie folgt angezeigt:

    [network]
    privilegedadaccount = sqluser
    kerberoskeytabfile = /var/opt/mssql/secrets/mssql.keytab
    
    • privilegedadaccount: Berechtigter Active Directory-Benutzer, der für die Active Directory-Authentifizierung verwendet werden soll.
    • kerberoskeytabfile: Hierbei handelt es sich um den Pfad im Container, unter dem sich die Datei mssql.keytab befindet.
  2. Erstellen Sie eine krb5.conf-Datei wie im folgenden Beispiel. Groß- und Kleinschreibung muss in diesen Dateien beachtet werden.

    [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. Kopieren Sie alle Dateien (mssql.conf, krb5.conf, mssql.keytab) an einen Speicherort, der in den SQL Server-Container eingebunden wird. In diesem Beispiel werden diese Dateien auf dem Host an folgenden Speicherorten platziert: mssql.conf und krb5.conf werden unter /container/sql1/ abgelegt. mssql.keytab wird am Speicherort /container/sql1/secrets/ platziert.

  4. Stellen Sie sicher, dass für diese Ordner genügend Berechtigungen für den Benutzer vorhanden sind, der den docker-/podman-Befehl ausführt. Wenn der Container gestartet wird, benötigt der Benutzer Zugriff auf den erstellten Ordnerpfad. In diesem Beispiel haben wir die folgenden Berechtigungen für den Ordnerpfad bereitgestellt:

    sudo chmod 755 /container/sql1/
    

Einbinden der Konfigurationsdateien und Bereitstellen der SQL Server-Container

Führen Sie Ihren SQL Server-Container aus, und verknüpfen Sie die richtigen Active Directory-Konfigurationsdateien, die zuvor erstellt wurden:

Wichtig

Die Umgebungsvariable SA_PASSWORD ist veraltet. Verwenden Sie stattdessen 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

Hinweis

Wenn Container mit dem LSM-Framework (Linux Security Module) ausgeführt werden, z. B. SELinux-fähige Hosts, müssen Sie die Volumes mithilfe der Z-Option verknüpfen. So wird Docker angewiesen, den Inhalt mit einer Bezeichnung als privat und nicht freigegebenen zu kennzeichnen. Weitere Informationen finden Sie unter Konfigurieren der selinux-Bezeichnung.

Im vorliegenden Beispiel sind die folgenden Befehle enthalten:

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
  • Die Dateien mssql.conf und krb5.conf befinden sich unter dem Hostdateipfad /container/sql1.
  • Die mssql.keytab-Datei, die erstellt wurde, befindet sich unter dem Hostdateipfad /container/sql1/secrets.
  • Da sich der Hostcomputer in Azure befindet, müssen die Active Directory-Details in derselben Reihenfolge an den docker run-Befehl angehängt werden. In unserem Beispiel befindet sich der Domänencontroller adVM in der Domäne contoso.com. Die IP-Adresse lautet 10.0.0.4. Der Domänencontroller führt DNS und KDC aus.

Erstellen von Active Directory-basierten SQL Server-Anmeldeinformationen mit Transact-SQL

Stellen Sie eine Verbindung mit dem SQL Server-Container her. Erstellen Sie mit den folgenden Befehlen die Anmeldung und vergewissern Sie sich, dass sie vorhanden ist. Sie können diesen Befehl auf einem Clientcomputer (Windows oder Linux) ausführen, auf dem SSMS, Azure Data Studio oder ein anderes Befehlszeilenschnittstellentool (CLI) ausgeführt wird.

CREATE LOGIN [contoso\amvin] FROM WINDOWS;

SELECT name FROM sys.server_principals;

Herstellen einer Verbindung mit SQL Server mithilfe der Active Directory-Authentifizierung

Melden Sie sich zum Herstellen einer Verbindung über SQL Server Management Studio (SSMS) oder Azure Data Studio mit Windows-Anmeldedaten bei SQL Server an und verwenden Sie dabei den SQL Server-Namen und die Portnummer (der Name kann der Containername oder der Hostname sein). Im vorliegenden Beispiel ist der Servername sql1.contoso.com,5433.

Sie können auch ein Tool wie sqlcmd verwenden, um eine Verbindung mit der SQL Server-Instanz in Ihrem Container herzustellen.

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

Ressourcen