Probleme mit SQL Server EXECUTE AS

13

Beim Versuch, meine gespeicherte Prozedur zu verwenden, fehlt etwas EXECUTE AS. Die gespeicherte Prozedur liest Daten aus source_db, aggregiert sie und speichert das Ergebnis in target_db.

Der SP selbst ist in target_db. Ich habe ein dediziertes Login und ordne es Benutzern in source_dbund target_dbfür den Besitzer von sp zu (es gibt also einen Benutzer app_agentin source_dbund in target_dbfür das Login app_agent).

Wenn ich mich als app_agentanmelde und ausführe

EXEC target_db.app_agent_schema.import_data

alles funktioniert gut Aber wenn ich mich ändere

ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`) 

und versuchen Sie es auszuführen, wirft es

Der Serverprinzipal "app_agent" kann im aktuellen Sicherheitskontext nicht auf die Datenbank "source_db" zugreifen.

Ich verwende SQL Server 2008.

Könnte jemand auf meinen Fehler hinweisen?

Vielen Dank

Update Nachdem ich einige Nachforschungen angestellt hatte, stellte ich fest, dass dies ALTER DATABASE target_db SET TRUSTWORTHY ONdas Problem löst, aber das scheint mir nicht die richtige Lösung zu sein ...

a1ex07
quelle
1
Ich denke, die Antwort ist die Verwendung der datenbankübergreifenden Besitzkettenoption auf Datenbankebene . Ich konnte den Fehler in Ihrem Szenario reproduzieren, aber es wurden nicht genügend Details angegeben, um zu wissen, ob ich ihn exakt reproduziert habe.
Jon Seigel

Antworten:

24

Dies wird unter Erweitern des Datenbankidentitätswechsels mithilfe von EXECUTE AS erläutert . Der EXECUTE AS-Kontext wird nur in der aktuellen Datenbank als vertrauenswürdig eingestuft, und das Übergreifen auf andere Datenbanken ist eine Eskalation des Angriffsvektors für Berechtigungen.

Es gibt zwei Lösungen, die beide im oben verlinkten Artikel beschrieben sind:

  • die leicht ist die Datenbank TRUSTWORTHY markieren: ALTER DATABASE [source_db] SET TRUSTWORTHY ON;. Obwohl einfach, ist auch gefährlich , da sie das macht dbovon source_dbeinem de-facto sysadmin.

  • Die sichere Methode ist die Verwendung der Codesignatur. Ein Beispiel finden Sie unter Aufrufen einer Prozedur in einer anderen Datenbank . Dies ist komplexer, bietet aber 100% Sicherheit.

Remus Rusanu
quelle
0

Welcher Benutzer führt den Befehl ALTER PROCEDURE aus? Möglicherweise wurde die (Selbst-) Zugriffsebene des Besitzers auf diesen Benutzer festgelegt, nicht auf den von Ihnen beabsichtigten.

Himmel
quelle
Derselbe Benutzer, der die Prozedur ( app_agent) erstellt hat. Wenn ich eine Prozedur app_agentohne erstellt habe execute as owner/self, melden Sie sich an als app_agent, SP wird ordnungsgemäß ausgeführt. Wenn ich EXECUTE AS SELF(wieder derselbe Benutzer) hinzufüge und app_agentmich sogar als ...is not able to access the database...
anmelde