Anpassen von Berechtigungen mit Identitätswechsel in SQL Server (ADO.NET)
Aktualisiert: November 2007
Viele Anwendungen verwenden für den Zugriff auf Daten gespeicherte Prozeduren, wobei der Zugriff auf die Basistabellen per Besitzverkettung gesteuert wird. Sie können EXECUTE-Berechtigungen für gespeicherte Prozeduren gewähren und so Berechtigungen für die Basistabellen widerrufen oder verweigern. Wenn der Besitzer der gespeicherten Prozedur identisch mit dem Besitzer der Tabellen ist, nimmt SQL Server keine Prüfung der Berechtigungen des Aufrufers vor. Bei Objekten, die verschiedenen Besitzern gehören, und bei dynamischem SQL funktioniert die Besitzverkettung jedoch nicht.
Seit der Einführung von SQL Server 2005 können Sie in einer gespeicherten Prozedur die EXECUTE AS-Klausel ausführen, wenn der Aufrufer keine Berechtigung für die Datenbankobjekte besitzt, auf die verwiesen wird. Durch die EXECUTE AS-Klausel geht der Ausführungskontext auf den Proxybenutzer über. Sämtlicher Code sowie alle Aufrufe geschachtelter gespeicherter Prozeduren oder Trigger werden im Sicherheitskontext des Proxybenutzers ausgeführt. Der Ausführungskontext wechselt erst wieder zum ursprünglichen Aufrufer zurück, nachdem die Ausführung der Prozedur abgeschlossen wurde oder wenn eine REVERT-Anweisung ausgegeben wird.
Kontextwechsel mit der EXECUTE AS-Anweisung
Mit der Transact-SQL-EXECUTE AS-Anweisung können Sie den Ausführungskontext einer Anweisung wechseln, indem ein Identitätswechsel zu einer anderen Anmeldung oder einem anderen Datenbankbenutzer erfolgt. Diese Vorgehensweise empfiehlt sich, wenn Abfragen und Prozeduren unter einem anderen Benutzernamen getestet werden sollen.
EXECUTE AS LOGIN = 'loginName';
EXECUTE AS USER = 'userName';
Sie müssen IMPERSONATE-Berechtigungen für die Anmeldung oder den Benutzer besitzen, mit dessen Identität Sie auftreten möchten. Benutzer mit der sysadmin-Rolle haben per se IMPERSONATE-Berechtigungen für alle Datenbanken, und für Benutzer mit der db_owner-Rolle gelten diese Berechtigungen für die Datenbanken, deren Besitzer sie sind.
Gewähren von Berechtigungen mit der EXECUTE AS-Klausel
Sie können die EXECUTE AS-Klausel im Definitionsheader einer gespeicherten Prozedur, eines Triggers oder einer benutzerdefinierten Funktion (nicht aber in Inline-Tabellenwertfunktionen) verwenden. Die Prozedur wird dann im Kontext des Benutzernamens oder Schlüsselworts ausgeführt, der oder das in der EXECUTE AS-Klausel angegeben ist. Sie können einen Proxybenutzer in der Datenbank erstellen, der keiner Anmeldung zugeordnet ist, indem Sie ihm nur die erforderlichen Berechtigungen für die Objekte gewähren, auf die die Prozedur zugreift. Nur der in der EXECUTE AS-Klausel angegebene Proxybenutzer muss eine Berechtigung für alle Objekte besitzen, auf die das Modul zugreift.
Hinweis: |
---|
Einige Aktionen, z. B. TRUNCATE TABLE, besitzen keine Berechtigungen, die gewährt werden können. Durch Integrieren der Anweisung in eine Prozedur und Angeben eines Proxybenutzers, der ALTER TABLE-Berechtigungen besitzt, können Sie die Berechtigungen so erweitern, dass die Tabelle für die Aufrufer, die nur EXECUTE-Berechtigungen für die Prozedur besitzen, abgeschnitten wird. |
Der in der EXECUTE AS-Klausel angegebene Kontext ist für die Dauer der Prozedur, einschließlich der geschachtelten Prozeduren und Trigger, gültig. Nach Abschluss der Ausführung oder bei Ausgabe der REVERT-Anweisung wechselt der Kontext wieder zum Aufrufer zurück.
Für die Aufnahme der EXECUTE AS-Klausel in eine Prozedur sind die folgenden drei Schritte auszuführen.
- Erstellen Sie einen Proxybenutzer in der Datenbank, der keiner Anmeldung zugeordnet wird. Dieser Schritt ist nicht zwingend erforderlich, erleichtert aber das Verwalten der Berechtigungen.
CREATE USER proxyUser WITHOUT LOGIN
Gewähren Sie dem Proxybenutzer die notwendigen Berechtigungen.
Fügen Sie der gespeicherten Prozedur oder der benutzerdefinierten Funktion die EXECUTE AS-Klausel hinzu.
CREATE PROCEDURE [procName] WITH EXECUTE AS 'proxyUser' AS ...
Hinweis: |
---|
Anwendungen, die eine Überwachung erfordern, können abgebrochen werden, da der ursprüngliche Sicherheitskontext des Aufrufers nicht beibehalten wird. Integrierte Funktionen, die die Identität des aktuellen Benutzers zurückgeben, z. B. SESSION_USER, USER oder USER_NAME, geben den mit der EXECUTE AS-Klausel verknüpften Benutzer und nicht den ursprünglichen Aufrufer zurück. |
Verwenden von EXECUTE AS mit REVERT
Mit der Transact-SQL-REVERT-Anweisung können Sie zum ursprünglichen Ausführungskontext zurückkehren.
Die optionale WITH NO REVERT COOKIE = @Variablenname erlaubt es Ihnen, den Ausführungskontext zurück zum Aufrufer zu wechseln, sofern die Variable @Variablenname den korrekten Wert enthält. Auf diese Weise kann der Ausführungskontext in Umgebungen, in denen Verbindungspooling verwendet wird, wieder an den Aufrufer zurückgegeben werden. Da nur der Aufrufer der EXECUTE AS-Anweisung den Wert von @Variablenname kennt, kann der Aufrufer gewährleisten, dass der Ausführungskontext vom Endbenutzer, der die Anwendung aufruft, nicht geändert werden kann. Beim Schließen wird die Verbindung an den Pool zurückgegeben. Weitere Informationen zum Verbindungspooling in ADO.NET finden Sie unter SQL Server-Verbindungspooling (ADO.NET).
Angeben des Ausführungskontexts
Neben dem Angeben eines Benutzers können Sie EXECUTE AS auch zusammen mit den folgenden Schlüsselwörtern verwenden.
CALLER: Das Ausführen als CALLER ist die Standardeinstellung. Wenn nichts anderes angegeben ist, wird die Prozedur im Sicherheitskontext des Aufrufers ausgeführt.
OWNER: Mit OWNER wird die Prozedur im Kontext des Prozedurbesitzers ausgeführt. Wenn die Prozedur in einem Schema erstellt wird, dessen Besitzer der Datenbankbesitzer (dbo) ist, wird die Prozedur mit uneingeschränkten Berechtigungen ausgeführt.
SELF: Mit SELF wird die Prozedur im Sicherheitskontext des Erstellers der gespeicherten Prozedur ausgeführt. Dies entspricht der Ausführung der Prozedur als ein spezifischer Benutzer, wobei der spezifische Benutzer die Person ist, die die Prozedur erstellt oder geändert hat.
Externe Ressourcen
Weitere Informationen finden Sie in den folgenden Ressourcen:
Ressource |
Beschreibung |
---|---|
Kontextwechsel in der SQL Server 2008-Onlinedokumentation |
Enthält Links zu Themen, die die Verwendung der EXECUTE AS-Klausel beschreiben. |
Verwenden von EXECUTE AS zum Erstellen benutzerdefinierter Berechtigungssätze und Verwenden von EXECUTE AS in Modulen in der SQL Server 2005-Onlinedokumentation |
Enthält Themen, in denen die Verwendung der EXECUTE AS-Klausel beschrieben wird. |
Siehe auch
Konzepte
Anwendungssicherheitsszenarien in SQL Server (ADO.NET)
Verwalten von Berechtigungen mit gespeicherten Prozeduren in SQL Server (ADO.NET)
Schreiben von sicherem dynamischen SQL in SQL Server (ADO.NET)
Signieren gespeicherter Prozeduren in SQL Server (ADO.NET)
Ändern von Daten mit gespeicherten Prozeduren (ADO.NET)