SQL Server Führt Identitätswechsel aus

8

Was ist der Unterschied zwischen ...

? %Vor%

AND

%Vor%

Ich führe eine Cross-Datenbank-Prozedur unter diesen Logins aus und es arbeitet mit dem exceecute als Login, aber nicht mit dem execute als Benutzer. Es heißt, dass der Server-Principal "testuser" nicht in der Lage ist, auf die Datenbank "xxx" im sicheren Kontext zuzugreifen.

Wenn ich nach beiden Befehlen SELECT SYSTEM_USER sehe, sehe ich, dass es auf 'testuser'

gesetzt ist     
JBone 06.04.2012, 15:36
quelle

3 Antworten

11

execute as login stellt den Identitätswechsel für den gesamten Server bereit, da sich die Anmeldungen auf Serverebene befinden. Da Benutzer pro Datenbank definiert sind, gilt der execute as user - Identitätswechsel nur für eine bestimmte Datenbank. Daher wird der Fehler beim Überqueren von Datenbanken angezeigt.

    
goric 06.04.2012, 15:40
quelle
3

Beispiel zum Ausführen als:

CREATE PROCEDURE dbo.MyProcedure MIT EXECUTE AS OWNER

In diesem Fall imitieren Sie den Besitzer des aufgerufenen Moduls. Sie können sich auch als SELF ausgeben, ODER der Benutzer, der das Modul erstellt oder ändert ODER ... imperonate CALLER, der es ermöglicht, dass Module die Berechtigungen des aktuellen Benutzers übernehmen, ODER ... Impersonate OWNER, die die Erlaubnis des Eigentümers der Prozedur, die OR genannt wird, übernehmen wird ... Imitieren von 'user_name', die einen bestimmten Benutzer annimmt ODER ... Impersonate 'Login-Name' mit wird eine bestimmte Anmeldung imitieren.

Das Setzen von Berechtigungen für Objekte wie gespeicherte Prozeduren kann mit "GRANT EXECUTE ON. to; Sie können jedoch auch Sicherheitsrechte sowohl auf der Anmelde- als auch auf der Benutzerebene erteilen. Sie werden NUR die notwendigen Rechte bestimmen und gewähren für die Objekte, die Zugriff benötigen (z. B. Ausführung). Erwägen Sie die Verwendung der Funktion "EXECUTE AS", die den Identitätswechsel eines anderen Benutzers ermöglicht um Berechtigungen zu überprüfen, die zum Ausführen des Codes erforderlich sind, OHNE dass alle notwendigen Rechte für alle zugrundeliegenden Objekte (z. B. Tabellen) gewährt werden müssen. Der EXECUTE AS kann zu gespeicherten Procs, Funktionen, Triggern usw. hinzugefügt werden.

Meistens müssen Sie den gespeicherten Prozeduren nur EXECUTE-Rechte erteilen, und dann werden allen Objekten Rechte gewährt, auf die im gespeicherten Proc verwiesen wird. Auf diese Weise müssen Sie keine impliziten Rechte angeben (Beispiel: Daten aktualisieren oder zusätzliche Procs aufrufen). Besitzverkettung behandelt dies für Sie. Dies ist besonders hilfreich für dynamische SQL oder wenn Sie erweiterte Sicherheitsaufgaben wie CREATE TABLE erstellen müssen. EXECUTE AS ist ein praktisches Werkzeug, um diese zu berücksichtigen.

Dieses Beispiel kann helfen, dies alles zu verdeutlichen:

Erstellen Sie einen Benutzer mit dem Namen NoPrivUser mit öffentlichem Zugriff auf eine Datenbank (z. B. dbadb)

VERWENDEN [Meister] GEHEN CREATE LOGIN [NoPrivUser] MIT PASSWORD = N'ABC5% ', DEFAULT_DATABASE = [dbadb], CHECK_EXPIRATION = ON, CHECK_POLICY = ON GEHEN VERWENDEN [DBAdb] GEHEN CREATE USER [NoPrivUser] FÜR LOGIN [NoPrivUser] GEHEN

HINWEIS: ERSTELLER ODER EIGENTÜMER DIESES VERFAHRENS ERFORDERN CREATE TABLE RIGHTS innerhalb der Zieldatenbank.

verwende DBAdb gehen CREATE PROCEDURE dbo.MyProcedure MIT AUSFÜHREN ALS EIGENTÜMER WIE WENN NICHT EXISTIERT (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID (N '[dbo] .MyTable') UND eintippen (N'U ')) CREATE TABLE MyTable (PKid int, spalte1 char (10)) INSERT IN MyTable WERTE (1, 'ABCDEF')

Gehe

GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; GEHEN

- Melden Sie sich jetzt als NoPrivUser bei Ihrem Datenbankserver an und führen Sie Folgendes aus:

benutze dbadb Gehe

EXEC dbo.MyProcedure

(1 Zeile (n) betroffen)

Versuchen Sie nun, aus der neuen Tabelle auszuwählen, während Sie als NoPribuser angemeldet sind.

Sie erhalten Folgendes:

Wählen Sie * aus MyTable Gehe

Msg 229, Ebene 14, Staat 5, Linie 1 Die SELECT-Berechtigung wurde für das Objekt 'MyTable', Datenbank 'DBAdb', Schema 'Dbo' verweigert.

Dies wird erwartet, da Sie die Prozedur nur im Sicherheitskontext des Besitzers ausgeführt haben, während Sie als NoPrivUser angemeldet sind.
NoPrivUser als keine Rechte, die Tabelle tatsächlich zu lesen. Nur um die Prozedur auszuführen, die die Zeilen erstellt und einfügt.

Mit der EXECUTE AS-Klausel wird die gespeicherte Prozedur im Kontext des Objekteigentümers ausgeführt. Dieser Code erstellt erfolgreich dbo.MyTable und Zeilen werden erfolgreich eingefügt. In diesem Beispiel hat der Benutzer "NoPrivUser" absolut keine Rechte zum Ändern der Tabelle oder zum Lesen oder Ändern von Daten in dieser Tabelle.
Es nimmt nur die Rechte an, die benötigt werden, um diese spezifische Aufgabe zu beenden, die INNERHALB des Kontexts dieser Prozedur codiert ist.

Diese Methode zum Erstellen von gespeicherten Prozeduren, die Aufgaben ausführen können, für die erhöhte Sicherheitsrechte erforderlich sind, ohne diese Rechte dauerhaft zuweisen zu müssen, ist sehr nützlich.

    
Richard Ouimet 23.06.2012 00:02
quelle
2

Der Anmeldebereich befindet sich auf Serverebene, während sich der Benutzerbereich auf der aktuellen Datenbankebene befindet

Ссылка

    
Gratzy 06.04.2012 15:41
quelle