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
SQL Server 2017 (14.x)-Container werden standardmäßig als Stammbenutzer gestartet, was zu Sicherheitsbedenken führen kann. In diesem Artikel werden die Sicherheitsoptionen beschrieben, die beim Ausführen von SQL Server Linux-Containern verfügbar sind, und wie Sie einen SQL Server-Container als Nicht-Root-Benutzer erstellen.
In den Beispielen in diesem Artikel wird davon ausgegangen, dass Sie Docker verwenden, aber Sie können dieselben Prinzipien auf andere Containerorchestrierungstools anwenden, einschließlich Kubernetes.
Erstellen und Ausführen von SQL Server 2017-Containern ohne Root-Berechtigung
Führen Sie die folgenden Schritte aus, um einen SQL Server 2017 (14.x)-Container zu erstellen, der als mssql-Nicht-Root-Benutzer gestartet wird.
Note
Container für SQL Server 2019 (15.x) oder neuere Versionen werden automatisch als Nicht-Stammcontainer gestartet, während SQL Server 2017-Container (14.x) standardmäßig als Stammcontainer gestartet werden. Weitere Informationen finden Sie unter Container als anderen Nicht-Root-Benutzer auf dem Host ausführen.
Laden Sie das Beispiel-Dockerfile für SQL Server-Container ohne Root-Berechtigung herunter, und speichern Sie es als
Dockerfile.Führen Sie folgenden Befehl im Verzeichnis aus, das die Dockerfile enthält, um den nicht-rootbasierten SQL Server-Container zu erstellen:
cd <path to Dockerfile directory> docker build -t 2017-latest-non-root .Starten Sie den Container.
Important
Die Umgebungsvariable
SA_PASSWORDist veraltet. Verwenden Sie stattdessenMSSQL_SA_PASSWORD.docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE --name sql1 -p 1433:1433 -d 2017-latest-non-rootNote
Um Speicherabbilder für die Problembehandlung zu erzeugen, wird das
--cap-add SYS_PTRACE-Flag für SQL Server-Container ohne Root-Rechte benötigt.Überprüfen Sie, ob der Container als Benutzer ohne Root-Rechte ausgeführt wird:
docker exec -it sql1 bashFühren Sie
whoamiaus, um den Benutzer anzuzeigen, der innerhalb des Containers aktiv ist.whoami
Ausführen eines Containers als anderer Nicht-Root-Benutzer auf dem Host
Um den SQL Server-Container als anderer Nicht-Root-Benutzer auszuführen, fügen Sie dem -u-Befehl das docker run-Flag hinzu. Der Container ohne Root-Berechtigung hat die Einschränkung, dass er als Teil der root-Gruppe ausgeführt werden muss, es sei denn, es wird ein Volume für /var/opt/mssql bereitgestellt, auf das der Nicht-Root-Benutzer zugreifen kann. Die root-Gruppe gewährt dem Nicht-Root-Benutzer keine zusätzlichen Root-Berechtigungen.
Ausführen als Benutzer mit einer UID 4000
Sie können SQL Server mit einer benutzerdefinierten UID starten. Der folgende Befehl startet beispielsweise SQL Server mit der UID 4000:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u 4000:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Warning
Stelle sicher, dass der SQL Server-Container einen benannten Benutzer wie mssql oder root hat. Andernfalls kann sqlcmd nicht innerhalb des Containers ausgeführt werden. Sie können überprüfen, ob der SQL Server-Container als benannter Benutzer ausgeführt wird, indem Sie whoami innerhalb des Containers ausführen.
Führen Sie den Nicht-Root-Container als Root-Benutzer aus
Du kannst den nicht-rootbezogenen Container bei Bedarf als Root-Benutzer ausführen, was dem Container automatisch alle Dateiberechtigungen gewährt, da er höhere Rechte hat.
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -u 0:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Ausführen als Benutzer auf Ihrem Hostcomputer
Mit dem folgenden Befehl können Sie SQL Server mit einem vorhandenen Benutzer auf dem Hostcomputer starten:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u $(id -u myusername):0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Ausführen als anderer Benutzer und Gruppe
Sie können SQL Server mit einer benutzerdefinierten benutzenden Person oder einer benutzerdefinierten Gruppe starten. In diesem Beispiel verfügt das bereitgestellte Volume über Berechtigungen, die für den Benutzer oder die Gruppe auf dem Hostcomputer konfiguriert sind.
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u $(id -u myusername):$(id -g myusername) -v /path/to/mssql:/var/opt/mssql -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Konfigurieren von persistenten Speicherberechtigungen für Container ohne Root-Berechtigung
Damit der Nicht-Root-Benutzer auf Datenbankdateien zugreifen kann, die sich auf eingebundenen Volumes befinden, stelle sicher, dass der Benutzer oder die Gruppe, unter der du den Container ausführst, aus dem persistenten Speicher lesen und in ihn schreiben kann.
Mit diesem Befehl können Sie den aktuellen Besitzer der Datenbankdateien ermitteln.
ls -ll <database file dir>
Führen Sie einen der folgenden Befehle aus, wenn SQL Server keinen Zugriff auf persistierte Datenbankdateien hat.
Zuweisen von Root-Gruppenzugriffsberechtigungen zum Lesen und Schreiben von Datenbankdateien
Erteilen Sie die Root-Gruppenberechtigungen für die folgenden Verzeichnisse, damit der SQL Server-Container ohne Root-Berechtigungen Zugriff auf Datenbankdateien hat.
chgrp -R 0 <database file dir>
chmod -R g=u <database file dir>
Festlegen des Nicht-Root-Benutzers als Besitzer der Dateien
Der Besitzer kann der festgelegte Nicht-Root-Benutzer oder ein anderer Nicht-Root-Benutzer sein, den Sie angeben möchten. In diesem Beispiel legen Sie die UID 10001 als Nicht-Stammbenutzer fest.
chown -R 10001:0 <database file dir>
Verschlüsseln von Verbindungen mit SQL Server Linux-Containern
Important
Wenn Sie Active Directory-Authentifizierungs- oder Verschlüsselungsoptionen wie Transparent Data Encryption (TDE) und TLS für SQL Server für Linux oder Container konfigurieren, gibt es mehrere Dateien, wie Keytab, Zertifikate und Maschinenschlüssel, die standardmäßig unter dem Ordner /var/opt/mssql/secretserstellt werden, und der Zugriff darauf ist standardmäßig auf mssql Benutzer root beschränkt. Wenn Sie beständigen Speicher für SQL Server-Container konfigurieren, verwenden Sie dieselbe Zugriffsstrategie, um sicherzustellen, dass der Pfad auf dem Host oder freigegebenen Volume, der dem /var/opt/mssql/secrets-Ordner innerhalb des Containers zugeordnet ist, geschützt ist und nur für die Benutzer mssql und root auf dem Host zugänglich ist. Wenn der Zugriff auf diesen Pfad bzw. Ordner kompromittiert ist, kann ein böswilliger Benutzer Zugriff auf diese kritischen Dateien erhalten, wodurch die Verschlüsselungshierarchie und/oder die Active Directory-Konfigurationen gefährdet werden.
Zum Verschlüsseln von Verbindungen mit SQL Server Linux-Containern benötigen Sie ein Zertifikat mit den folgenden Anforderungen.
Das folgende Beispiel zeigt, wie die Verbindungen mit SQL Server für Linux-Containern verschlüsselt werden können. Hier verwenden Sie ein selbstsigniertes Zertifikat, das nicht für Produktionsszenarien verwendet werden sollte. Für solche Umgebungen sollten Sie stattdessen CA-Zertifikate verwenden.
Erstellen Sie ein ausschließlich für Test- und Nichtproduktionsumgebungen geeignetes selbstsigniertes Zertifikat.
openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=sql1.contoso.com' -keyout /container/sql1/mssql.key -out /container/sql1/mssql.pem -days 365Im vorherigen Codebeispiel ist der Hostname des SQL-Containers
sql1, sodass beim Herstellen einer Verbindung mit diesem Container der in der Verbindungszeichenfolge verwendete Namesql1.contoso.com,5434lautet. Sie müssen auch sicherstellen, dass der Ordnerpfad/container/sql1/bereits vorhanden ist, bevor Sie den vorherigen Befehl ausführen.Stellen Sie sicher, dass Sie die richtigen Berechtigungen für die
mssql.keyund-Dateienmssql.pemfestlegen, damit Sie Fehler vermeiden, wenn Sie die Dateien in den SQL Server-Container mounten:chmod 440 /container/sql1/mssql.pem chmod 440 /container/sql1/mssql.keyErstellen Sie nun eine
mssql.confDatei mit folgendem Inhalt, um die serverinitiierte Verschlüsselung zu ermöglichen. Für die vom Client initiierte Verschlüsselung ändere die letzte Zeile zuforceencryption = 0.[network] tlscert = /etc/ssl/certs/mssql.pem tlskey = /etc/ssl/private/mssql.key tlsprotocols = 1.2 forceencryption = 1Note
Bei einigen Linux-Distributionen kann der Pfad zum Speichern des Zertifikats und des Schlüssels ebenfalls
/etc/pki/tls/certs/bzw/etc/pki/tls/private/. sein. Überprüfen Sie den Pfad, bevor Sie diemssql.conffür SQL Server-Container aktualisieren. Der Speicherort, den Sie immssql.confContainer festgelegt haben, ist der Speicherort, an dem SQL Server im Container nach dem Zertifikat und seinem Schlüssel sucht. In diesem Fall ist der Speicherort/etc/ssl/certs/und/etc/ssl/private/.Die Datei
mssql.confwird ebenfalls im selben Ordner unter/container/sql1/erstellt. Nachdem Sie die obigen Schritte ausgeführt haben, sollten Sie über die drei Dateienmssql.conf,mssql.keyundmssql.pemim Ordnersql1verfügen.Stellen Sie den SQL Server-Container mit dem folgenden Befehl bereit (ersetzen Sie
<password>es durch ein gültiges Kennwort):docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 5434:1433 --name sql1 -h sql1 -v /container/sql1/mssql.conf:/var/opt/mssql/mssql.conf -v /container/sql1/mssql.pem:/etc/ssl/certs/mssql.pem -v /container/sql1/mssql.key:/etc/ssl/private/mssql.key -d mcr.microsoft.com/mssql/server:2019-latestIm vorherigen Befehl hast du die
mssql.conf,mssql.pem, und-Dateienmssql.keyauf den Container montiert und den SQL Server-Standardport 1433 im Container auf Port 5434 auf dem Host zugeordnet.Note
Wenn Sie Red Hat Enterprise Linux ab Version 8 verwenden, können Sie auch den
podman run-Befehl anstelle vondocker runverwenden.
Befolgen Sie die Abschnitte "Zertifikat auf Ihrem Client-Rechner registrieren" und "Beispiel-Verbindungsstrings", die in Client Initiated Encryption dokumentiert sind, um Verbindungen zu SQL Server für Linux-Containern zu verschlüsseln.
Verwandte Inhalte
- Der Schnellstart erleichtert Ihnen den Einstieg in die Verwendung von SQL Server 2017-Containerimages (14.x) in Docker.
- Beginnen Sie mit SQL Server 2019 (15.x) Container-Images auf Docker, indem Sie den Schnellstart durchgehen.
- Um mit den Containerimages von SQL Server 2022 (16.x) auf Docker zu beginnen, verwenden Sie den Schnellstart.
- Der Schnellstart erleichtert Ihnen den Einstieg in die Verwendung von SQL Server 2025-Containerimages (17.x) in Docker.