Verwenden von Dienst-SIDs zum Erteilen von Berechtigungen für Dienste in SQL Server

SQL Server verwendet dienstspezifische Sicherheits-IDs (SID), die auch als Dienstsicherheitsprinzipale bezeichnet werden, um berechtigungen direkt einem bestimmten Dienst zu gewähren. Diese Methode wird von SQL Server verwendet, um Berechtigungen für die Modul- und Agentdienste zu erteilen (NT SERVICE\MSSQL$<InstanceName> und NT SERVICE\SQLAGENT$<InstanceName> ). Damit können diese Dienste nur auf die Datenbank-Engine zugreifen, solange sie ausgeführt werden. Weitere Informationen finden Sie unter KB2620201 (Archivlink).

Mit dieser Methode können auch anderen Diensten Berechtigungen erteilt werden. Mithilfe einer Dienst-SID kann auf den Mehraufwand für das Verwalten und Warten von Dienstkonten verzichtet und das Erteilen von Berechtigungen für Systemressourcen enger und präziser gesteuert werden.

Eine Dienst-SID kann beispielsweise für die folgenden Dienste verwendet werden:

  • Integritätsdienst von System Center Operations Manager (NT SERVICE\HealthService)
  • WSFC-Dienst (Windows Server-Failoverclustering) (NT SERVICE\ClusSvc)

Einige Dienste besitzen standardmäßig keine Dienst-SID. In diesen Fällen muss die Dienst-SID über SC.exe erstellt werden. Diese Methode wurde von Microsoft System Center Operations Manager-Administratoren übernommen, um berechtigungen für den HealthService in SQL Server zu erteilen.

Nachdem die Dienst-SID erstellt und bestätigt wurde, muss ihr in SQL Server eine Berechtigung erteilt werden. Berechtigungen werden erteilt, indem entweder über SQL Server Management Studio (SSMS) oder über eine Abfrage ein Windows-Anmeldename erstellt wird. Sobald der Anmeldename erstellt wurde, kann er wie jeder andere Anmeldename Berechtigungen erhalten, Rollen hinzugefügt und Datenbanken zugeordnet werden.

Tipp

Tritt der Fehler Login failed for user 'NT AUTHORITY\SYSTEM' auf, vergewissern Sie sich, dass die Dienst-SID für den gewünschten Dienst vorhanden ist, der Anmeldename für die Dienst-SID in SQL Server erstellt wurde und der Dienst-SID die entsprechenden Berechtigungen in SQL Server erteilt wurden.

Sicherheit

Entfernen von Dienstkonten

Bisher wurden Dienstkonten dafür verwendet, Diensten das Anmelden bei SQL Server zu ermöglichen. Damit war auch ein Mehraufwand an Verwaltung verbunden, da das Kennwort des Dienstkontos verwaltet und regelmäßig aktualisiert werden musste. Außerdem konnten die Anmeldeinformationen des Dienstkontos von Personen benutzt werden, die beim Ausführen von Aktionen in der Instanz ihre Aktivitäten maskieren wollten.

Präzise Berechtigungen für Systemkonten

Berechtigungen für Systemkonten wurden bislang durch Erstellen eines Anmeldenamens für die Konten LocalSystem (NT-AUTORITÄT\SYSTEM in de-DE) oder NetworkService (NT-AUTORITÄT\NETZWERKDIENST in de-DE) erteilt. Diesem Anmeldenamen wurden dann die Berechtigungen erteilt. Bei dieser Methode werden jedem Vorgang oder Dienst, der als Systemkonto ausgeführt wird, Berechtigungen in SQL erteilt.

Mit einer Dienst-SID werden Berechtigungen nur für einen bestimmten Dienst erteilt. Der Dienst kann nur auf die Ressourcen zugreifen, für die er Berechtigungen erhielt, solange er ausgeführt wird. Wird beispielsweise HealthService als LocalSystem ausgeführt und erhält die Berechtigung View Server State, erhält das LocalSystem-Konto nur eine Berechtigung für View Server State, solange es im Kontext von HealthService ausgeführt wird. Versucht ein anderer Vorgang auf den SQL-Serverstatus als LocalSystem zuzugreifen, wird der Zugriff verweigert.

Beispiele

A. Erstellen einer Dienst-SID

Mit dem folgenden PowerShell-Befehl können Sie eine Dienst-SID für den Integritätsdienst von System Center Operations Manager erstellen:

sc.exe --% sidtype "HealthService" unrestricted

Wichtig

Durch die Angabe von --% wird PowerShell mitgeteilt, dass der Rest des Befehls nicht analysiert werden muss. Dies ist bei älteren Befehlen und Anwendungen nützlich.

B. Abfragen einer Dienst-SID

Führen Sie den folgenden Befehl in PowerShell aus, um eine Dienst-SID zu überprüfen oder wenn Sie sicherstellen möchten, dass eine Dienst-SID vorhanden ist:

sc.exe --% qsidtype "HealthService"

Wichtig

Durch die Angabe von --% wird PowerShell mitgeteilt, dass der Rest des Befehls nicht analysiert werden muss. Dies ist bei älteren Befehlen und Anwendungen nützlich.

C. Hinzufügen einer neu erstellten Dienst-SID als Anmeldename

Im folgenden Beispiel wird ein Anmeldename für den Integritätsdienst von System Center Operations Manager mithilfe von T-SQL erstellt:

CREATE LOGIN [NT SERVICE\HealthService] FROM WINDOWS
GO

D. Hinzufügen einer vorhandenen Dienst-SID als Anmeldename

Im folgenden Beispiel wird ein Anmeldename für den Clusterdienst mithilfe von T-SQL erstellt. Indem Sie dem Clusterdienst Berechtigungen erteilen, ist es nicht mehr erforderlich, dem Systemkonto übermäßige Berechtigungen zu erteilen.

CREATE LOGIN [NT SERVICE\ClusSvc] FROM WINDOWS
GO

E. Erteilen von Berechtigungen für eine Dienst-SID

Im folgenden Beispiel werden dem Clusterdienst die für das Verwalten von Verfügbarkeitsgruppen erforderlichen Berechtigungen erteilt:

GRANT ALTER ANY AVAILABILITY GROUP TO [NT SERVICE\ClusSvc]
GO

GRANT CONNECT SQL TO [NT SERVICE\ClusSvc]
GO

GRANT VIEW SERVER STATE TO [NT SERVICE\ClusSvc]
GO

Hinweis

Das Entfernen der Dienst-SID-Anmeldungen oder ihre Entfernung aus der sysadmin-Serverrolle kann zu Problemen für verschiedene Komponenten von SQL Server führen, die Verbindungen mit der SQL Server-Datenbank-Engine herstellen. Die folgenden sind einige dieser Probleme:

  • SQL Server Agent kann nicht gestartet werden oder keine Verbindung mit einem SQL Server-Dienst herstellen
  • SQL Server-Setupprogramme stoßen auf ein Problem, das im folgenden Microsoft Knowledge Base-Artikel erwähnt wird: https://mskb.pkisolutions.com/kb/955813

Für eine Standardinstanz von SQL Server lässt sich diese Situation korrigieren, indem die Dienst-SID mithilfe der folgenden Transact-SQL-Befehle hinzugefügt wird:

CREATE LOGIN [NT SERVICE\MSSQLSERVER] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\MSSQLSERVER]

CREATE LOGIN [NT SERVICE\SQLSERVERAGENT] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\SQLSERVERAGENT]

Verwenden Sie für eine benannte Instanz von SQL Server die folgenden Transact-SQL-Befehle:

CREATE LOGIN [NT SERVICE\MSSQL$SQL2019] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\MSSQL$SQL2019]

CREATE LOGIN [NT SERVICE\SQLAgent$SQL2019] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]

ALTER ROLE sysadmin ADD MEMBER [NT SERVICE\SQLAgent$SQL2019]

In diesem Beispiel ist SQL2019 der Instanzname des SQL Servers.

Nächste Schritte

Weitere Informationen zur Struktur der Dienst-SID finden Sie unter SERVICE_SID_INFO structure (Struktur von SERVICE_SID_INFO).

Hier finden Sie Informationen zu weiteren verfügbaren Optionen beim Erstellen eines Anmeldenamens.

Informationen zur Verwendung von rollenbasierter Sicherheit mit Dienst-SIDs finden Sie unter Erstellen von Rollen in SQL Server.

Hier finden Sie Informationen zu den unterschiedlichen Methoden für das Erteilen von Berechtigungen für Dienst-SIDs in SQL Server.

Weitere Informationen zum Konfigurieren von Dienstkonten für SQL Server finden Sie unter Konfigurieren von Windows-Dienstkonten und -berechtigungen.