Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server unter 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:
- Installation 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 (Service Principal Name, SPN) mithilfe des Tools
adutil - Erstellen der Schlüsseltabellendatei für den SQL Server-Dienst
- Erstellen der Dateien
mssql.confundkrb5.confzur Verwendung durch den SQL Server-Container - Einbinden der Konfigurationsdateien und Bereitstellen der SQL Server-Container
- Erstellen von Active Directory-basierten SQL Server-Logins 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
adutilauf einem Linux-Hostcomputer, der einer Domäne beigetreten 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. In diesem Tutorial wird der Port 5433 auf dem Host zu dem Port 1433 des Containers zugeordnet. Weitere Informationen finden Sie in unserem Schnellstart, 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.
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 läuft. Er wird als Client-Computer verwendet und hat das SQL Server Management Studio (SSMS) installiert. 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
Um adutil zu installieren, führen Sie die Schritte in Introduction to adutil - Active Directory Utility auf einem Hostcomputer aus, der der Domäne beigetreten ist.
Erstellen Sie einen Active Directory-Benutzer, SPNs und eine SQL Server-Service-Keytab.
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:
Erstellen Sie einen Active Directory Benutzer für SQL Server, und legen Sie den SPN mithilfe von
adutilfest.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.
Erwerben oder erneuern Sie das Kerberos-TGT (Ticket-Granting Ticket) mithilfe des
kinit-Befehls. Verwenden Sie ein privilegiertes Konto für denkinit-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.COMauf dem Domänencontroller erstellt.kinit privilegeduser@CONTOSO.COMErstellen Sie mit
adutilden neuen Benutzer, der von SQL Server als privilegiertes Active Directory Konto verwendet wird. Ersetzen Sie<password>durch ein gültiges Kennwort.adutil user create --name sqluser --distname CN=sqluser,CN=Users,DC=CONTOSO,DC=COM --password '<password>'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 OU-Name (--ou) Vorrang vor dem Distinguished Name. Sie können den folgenden Befehl ausführen, um weitere Informationen zu erhalten:adutil user create --help- Kennwort-Flag:
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
5433anstelle von1433verwendet. 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-
addautoerstellt die SPNs automatisch, sofern ausreichende Berechtigungen für daskinitKonto vorhanden sind. -
-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 istsql1der Containername, und der FQDN lautetsql1.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 Standardport1433lauscht.
-
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 in den Container eingebunden, dadurch kann die Datei an jedem Speicherort des Hosts erstellt werden. Sie können diesen Pfad sicher ändern, solange der resultierende Keytab beim Einsatz von Docker/Podman zum Bereitstellen des Containers korrekt eingebunden wird.
Zum Erstellen der Keytab für alle SPNs können wir die createauto Option verwenden. Ersetzen Sie <password> durch ein gültiges Kennwort.
adutil keytab createauto -k /container/sql1/secrets/mssql.keytab -p 5433 -H sql1.contoso.com --password '<password>' -s MSSQLSvc
-
-k: Dies ist der Pfad, in dem diemssql.keytab-Datei erstellt werden soll. Im vorangehenden Beispiel sollte das Verzeichnis/container/sql1/secretsbereits 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 istsql1der Containername, und der FQDN lautetsql1.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. -
-eoder--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. Um weitere Hilfe zu den adutil Befehlen zu finden, führen Sie den folgenden Befehl aus.
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.
Um die Tastentabelle für den Benutzer zu erstellen, lautet der Befehl wie folgt. Ersetzen Sie <password> durch ein gültiges Kennwort.
adutil keytab create -k /container/sql1/secrets/mssql.keytab -p sqluser --password '<password>'
-
-k: Dies ist der Pfad, in dem diemssql.keytab-Datei erstellt werden soll. Im vorangehenden Beispiel sollte das Verzeichnis/container/sql1/secretsbereits auf dem Host vorhanden sein. -
-p: Prinzipal zur Schlüsseltabelle hinzufügen.
Das adutil Erstellen/Automatische Erstellen der Schlüsseltabelle überschreibt die vorherigen Dateien nicht; sie wird an die Datei angefügt, wenn sie bereits vorhanden ist.
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
Erstellen Sie eine Datei
mssql.confmit 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 Dateimssql.confunter/container/sql1gespeichert. Dabei handelt es sich um das Containerverzeichnis. Der Inhalt vonmssql.confwird 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 Dateimssql.keytabbefindet.
-
Erstellen Sie eine
krb5.conf-Datei wie im folgenden Beispiel. Groß- und Kleinschreibung muss in diesen Dateien beachtet werden.[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.COMKopieren 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.confundkrb5.confwerden unter/container/sql1/abgelegt.mssql.keytabwird am Speicherort/container/sql1/secrets/platziert.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=<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
Achtung
Ihr Kennwort sollte der standardmäßigen Kennwortrichtlinie von SQL Server folgen. Ein Standardkennwort enthält mindestens acht Zeichen, die aus drei der folgenden vier Kategorien stammen müssen: Großbuchstaben, Kleinbuchstaben, Grundzahlen (0–9) und Symbole. Kennwörter können bis zu 128 Zeichen lang sein. Verwenden Sie möglichst lange und komplexe Kennwörter.
Wenn Container auf LSM (Linux Security Module) wie SELinux-fähigen Hosts ausgeführt werden, müssen Sie die Volumes mit der Z-Option mounten, wodurch Docker angewiesen wird, den Inhalt mit einer privaten, nicht freigegebenen Bezeichnung zu labeln. Weitere Informationen finden Sie unter Konfigurieren der selinux-Bezeichnung.
Unser Beispiel würde die folgenden Befehle enthalten. Ersetzen Sie <password> durch ein gültiges Kennwort.
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
- Die Dateien
mssql.confundkrb5.confbefinden 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änencontrolleradVMin der Domänecontoso.com. Die IP-Adresse lautet10.0.0.4. Der Domänencontroller führt DNS und KDC aus.
Erstellen von Active Directory-basierten SQL Server-Logins 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.
Hinweis
Sie können eine Verbindung mit einer Sql Server-Instanz herstellen, indem Sie ein vertrautes SQL Server-Clienttool verwenden, z. B. sqlcmd, SQL Server Management Studio (SSMS) oder die MSSQL-Erweiterung für Visual Studio Code.
CREATE LOGIN [contoso\amvin]
FROM WINDOWS;
SELECT name
FROM sys.server_principals;
Herstellen einer Verbindung mit SQL Server mithilfe der Active Directory-Authentifizierung
Sie können eine Verbindung mit einer Sql Server-Instanz herstellen, indem Sie ein vertrautes SQL Server-Clienttool verwenden, z. B. sqlcmd, SQL Server Management Studio (SSMS) oder die MSSQL-Erweiterung für Visual Studio Code.
Melden Sie sich bei SQL Server mit Windows-Anmeldeinformationen mithilfe des SQL Server-Namens und der Portnummer an (Name kann der Containername oder der Hostname sein). Im vorliegenden Beispiel ist der Servername sql1.contoso.com,5433.
Der folgende Befehl zeigt, wie Sie eine Verbindung mit Ihrem Container herstellen.sqlcmd
sqlcmd -E -S 'sql1.contoso.com,5433'
Ressourcen
- Grundlegendes zur Active Directory-Authentifizierung für SQL Server für Linux und Container
- Problembehandlung der Active Directory-Authentifizierung bei SQL Server auf Linux und Containern