Ressourcenkontrollensicherheit

Bei der Ressourcenkontrolle werden vorhandene SQL Server-Sicherheitsmechanismen verwendet, z. B. Authentifizierung, Berechtigungsstufen und Besitzketten. In diesem Thema werden die Aspekte der Konfiguration und Verwendung der Ressourcenkontrolle beleuchtet, die beachtet werden müssen, um potenzielle Sicherheitsprobleme zu vermeiden.

Überlegungen

Beim Entwurf und bei der Implementierung der Ressourcenkontrolle müssen die folgenden Elemente berücksichtigt werden, um die maximale Sicherheit bei der Verwendung des Features zu gewährleisten:

  • Berechtigungen

  • Namen von Ressourcenpools und Arbeitsauslastungsgruppen

  • Benutzerdefinierte Klassifizierungsfunktion

Berechtigungen

Zum Ändern oder Anzeigen der Einstellungen der Ressourcenkontrolle sind die folgenden Berechtigungen erforderlich:

  • Zum Ändern der Konfiguration der Ressourcenkontrolle benötigt ein Benutzer die CONTROL SERVER-Berechtigung. Berechtigungen werden überprüft, wenn DDL-Anweisungen der Ressourcenkontrolle ausgeführt werden.

  • Zum Anzeigen der von dynamischen Verwaltungssichten bereitgestellten aktiven Konfiguration benötigt ein Benutzer die VIEW SERVER STATE-Berechtigung.

Es wird empfohlen, die Möglichkeit zum Erstellen oder Ändern der Konfiguration der Ressourcenkontrolle erfahrenen Datenbankadministratoren einzuräumen.

Namen von Ressourcenpools und Arbeitsauslastungsgruppen

Alle Namen von Ressourcenpools und Arbeitsauslastungsgruppen sind öffentlich zugänglich. Wählen Sie daher bei der Erstellung von Pools und Gruppen Namen aus, die keine Informationen zum Charakter der auf dem Server ausgeführten Anwendungen offenlegen. Der Name CompanyPayroll für eine Arbeitsauslastungsgruppe ließe z. B. eindeutige Rückschlüsse auf den Charakter und die Bedeutung der Anwendungen zu, die diese Arbeitsauslastungsgruppe verwenden.

Benutzerdefinierte Klassifizierungsfunktion

Die benutzerdefinierte Klassifizierungsfunktion (User-Defined Function, UDF) wird in der master-Datenbank gespeichert.

Diese Funktion ist in Entwurf und Implementierung mit LOGON-Triggern vergleichbar, und sie wird während des Anmeldeprozesses nach LOGON-Triggern ausgeführt. Die Funktion wird im Anmeldekontext der Sitzung ausgeführt, die eine Anforderung ausführt, und die Klassifizierung muss abgeschlossen werden, bevor tatsächlich eine Sitzung erstellt wird. Aus diesem Grund werden alle Meldungen, die aus der Klassifizierungsfunktion stammen und normalerweise den Benutzer erreichen (z. B. Fehlermeldungen und Meldungen aus der PRINT-Anweisung), zum SQL Server-Fehlerprotokoll umgeleitet.

VorsichtshinweisVorsicht

Obwohl in dieser Version der Ressourcenkontrolle die Schemabindung implementiert ist, um die Aufrufe einzuschränken, die in der benutzerdefinierten Klassifizierungsfunktion ausgeführt werden können, sind nicht unbedingt alle von der Funktion zurückgegebenen Daten sicher. Weitere Informationen finden Sie unter Überlegungen zum Schreiben einer Klassifizierungsfunktion.

Beachten Sie die folgenden Aspekte des Verhaltens der benutzerdefinierten Klassifizierungsfunktion:

  • Die Ressourcenkontrolle führt diese Funktion standardmäßig als Teil der Klassifizierung im Kontext des angemeldeten Benutzers aus. Wenn in der Funktion EXECUTE AS angegeben wird, führt die Ressourcenkontrolle die Funktion als der angegebene Benutzer aus.

  • Wenn die Ressourcenkontrolle die Funktion als Teil der Klassifizierung ausführt, wird die EXECUTE-Berechtigung für die benutzerdefinierte Klassifizierungsfunktion nicht überprüft. Allerdings werden für alle Objekte, auf die von der Funktion verwiesen wird, standardmäßige Berechtigungsüberprüfungen ausgeführt, wobei der Zugriff ggf. auf Grundlage der Besitzkette gewährt wird.

  • Wenn eine Funktion als Klassifizierungsfunktion der Ressourcenkontrolle registriert wird, hat dies keine Auswirkungen auf ihre Berechtigungsebenen, wenn sie außerhalb des Bereichs der Klassifizierung der Ressourcenkontrolle verwendet wird.

Besitzketten in der Ressourcenkontrolle

Sie können die standardmäßige schemabasierte Besitzverkettung nutzen oder EXECUTE AS verwenden, um einem einzelnen Benutzer Zugriff auf ein Schema zu gewähren, wenn die Klassifizierung der Ressourcenkontrolle ausgeführt wird. Das folgende Codebeispiel und die Kommentare veranschaulichen, wie die Besitzverkettung in der Ressourcenkontrolle funktioniert.

HinweisHinweis

Im folgenden Beispiel wird vorausgesetzt, dass SQL-Anmeldungen aktiviert sind.

Im folgenden Code werden Schemabenutzer (SchemaUser1 und SchemaUser2) erstellt, die Zugriff auf master haben.

use master
go

CREATE LOGIN SchemaUser1 WITH PASSWORD='your password here';
CREATE USER SchemaUser1 FOR LOGIN [SchemaUser1];
CREATE LOGIN SchemaUser2 WITH PASSWORD='your password here';
CREATE USER SchemaUser2 FOR LOGIN [SchemaUser2];
go

Im folgenden Code wird ein Benutzer (NormalUser1) mit Standardanmeldeberechtigungen erstellt.

CREATE LOGIN NormalUser1 WITH PASSWORD='your password here';
CREATE USER NormalUser1 FOR LOGIN [NormalUser1];
go

Im folgenden Code werden Schemas (Schema1 und Schema2) erstellt und den neu erstellten Schemabenutzern zugeordnet. Außerdem wird eine Tabelle (groupTable) für die Schemas erstellt.

CREATE SCHEMA Schema1 AUTHORIZATION SchemaUser1
CREATE TABLE groupTable (uname sysname, gname sysname);
CREATE SCHEMA Schema2 AUTHORIZATION SchemaUser2
CREATE TABLE groupTable (uname sysname, gname sysname);
go

Im folgenden Code werden groupTable Werte hinzugefügt.

INSERT Schema1.groupTable VALUES(N'NormalUser1',N'Group1');
INSERT Schema2.groupTable VALUES(N'NormalUser1',N'Group2');
go

An diesem Punkt sind Schema1 und Schema2 im Besitz von SchemaUser1 bzw. SchemaUser2. Im nächsten Codebeispiel wird eine Funktion für den Zugriff auf Schema1 und Schema2 erstellt.

CREATE FUNCTION Schema1.classifier() RETURNS sysname WITH SCHEMABINDING AS
BEGIN
      DECLARE @n sysname
      SELECT @n = gname FROM Schema1.groupTable WHERE uname = SUSER_NAME()
      SELECT @n = gname FROM Schema2.groupTable WHERE uname = SUSER_NAME()
      RETURN @n
END
go

Mit dem folgenden Code wird die vorgenannte Funktion als benutzerdefinierte Klassifizierungsfunktion registriert. Beachten Sie, dass SchemaUser1 über keine Zugriffsberechtigung für Schema2 verfügt.

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=Schema1.classifier);
ALTER RESOURCE GOVERNOR RECONFIGURE
go

Versuchen Sie zum Test, sich über eine andere Clientverbindung als NormalUser1 anzumelden. Öffnen Sie die Windows-Ereignisanzeige. Im Anwendungsprotokoll sollte ein Eintrag zu einem Klassifizierungsfehler zu finden sein. NormalUser1 erbt durch Besitzverkettung von Schema1.classifier Zugriffsrechte für Schema1.groupTable. Allerdings verfügt Schema1 nicht über die Berechtigung zum Zugriff auf Schema2.groupTable.

Führen Sie einen weiteren Test aus, indem Sie SchemaUser1 die SELECT-Berechtigung für Schema2.groupTable erteilen. 

GRANT SELECT ON Schema2.groupTable TO SchemaUser1
go

Melden Sie sich als NormalUser1 an. Im Ereignisprotokoll ist erneut ein Eintrag zu einem Klassifizierungsfehler zu finden. Dieser Fehler wird dadurch verursacht, dass der Server überprüft, ob NormalUser1 über die SELECT-Berechtigung verfügt, die nicht von SchemaUser1 vererbt wird.

Im nächsten Codebeispiel wird eine weitere Klassifizierungsfunktion erstellt. Diesmal erhalten die Anmeldenamen die EXECUTE AS-Berechtigung als SchemaUser1.

CREATE FUNCTION Schema1.classifier2() RETURNS sysname WITH SCHEMABINDING, EXECUTE AS 'SchemaUser1' AS
BEGIN
      DECLARE @n sysname
      SELECT @n = gname FROM Schema1.groupTable WHERE uname = SUSER_NAME()
      SELECT @n = gname FROM Schema2.groupTable WHERE uname = SUSER_NAME()
      RETURN @n
END
go

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=Schema1.classifier2);
ALTER RESOURCE GOVERNOR RECONFIGURE;
go

Da die neue Funktion im Kontext von SchemaUser1 ausgeführt wird und SchemaUser1 über die SELECT-Berechtigung für Schema2.groupTable verfügt, wird die Funktion Schema1.classifier2() für den Anmeldenamen NormalUser1 erfolgreich ausgeführt.

Melden Sie sich erneut als NormalUser1 an, und überprüfen Sie das Ereignisprotokoll auf einen Klassifizierungsfehler.

HinweisHinweis

Da NormalUser1 die EXECUTE-Berechtigung für die Funktion Schema1.classifier2 nicht erteilt wurde, kann NormalUser1 die Funktion nicht als Ad-hoc-Abfrage ausführen.

Weitere Informationen finden Sie unter Besitzketten.

Testen der Klassifizierungsfunktion

Sie sollten die Klassifizierungsfunktion testen und optimieren, bevor Sie sie zum Klassifizieren eingehender Anforderungen verwenden. Eine fehlerhaft geschriebene Funktion kann dazu führen, dass das System durch ein Timeout nicht mehr verwendet werden kann und Konfigurationsinformationen verfügbar gemacht werden. Sie können für die Problembehandlung für eine Klassifizierungsfunktion eine dedizierte Administratorverbindung (Dedicated Administrator Connection, DAC) verwenden, während die Ressourcenkontrolle aktiviert ist, weil diese Verbindung der Klassifizierung nicht unterliegt. Es wird empfohlen, die DAC auf dem Server zu aktivieren. Weitere Informationen finden Sie unter Verwenden einer dedizierten Administratorverbindung.

HinweisHinweis

Wenn keine DAC für die Problembehandlung verfügbar ist, können Sie alternativ das System im Einzelbenutzermodus neu starten. Der Einzelbenutzermodus unterliegt nicht der Klassifizierung, allerdings haben Sie in diesem Modus nicht die Möglichkeit, die Klassifizierung der Ressourcenkontrolle während der Ausführung zu diagnostizieren.