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_db
und target_db
für den Besitzer von sp zu (es gibt also einen Benutzer app_agent
in source_db
und in target_db
für das Login app_agent
).
Wenn ich mich als app_agent
anmelde 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 ON
das Problem löst, aber das scheint mir nicht die richtige Lösung zu sein ...
quelle
Antworten:
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 machtdbo
vonsource_db
einem de-factosysadmin
.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.
quelle
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.
quelle
app_agent
) erstellt hat. Wenn ich eine Prozedurapp_agent
ohne erstellt habeexecute as owner/self
, melden Sie sich an alsapp_agent
, SP wird ordnungsgemäß ausgeführt. Wenn ichEXECUTE AS SELF
(wieder derselbe Benutzer) hinzufüge undapp_agent
mich sogar als...is not able to access the database...