Benutzer mit den meisten Antworten
Zugriff auf andere Datenbank mit "EXECUTE AS" funktioniert nicht

Frage
-
Hallo allerseits,
ich habe im SQL Server 2012 eine Service Broker Architektur aufgebaut, um Berechnungen asynchron auszuführen. Die Activation Procedure der Queue wird dabei mit der Option "EXECUTE AS N'dbo'" aufgerufen. Nun habe ich innerhalb der ActivationProcedure eine Änderung gemacht, sodass diese auf eine zweite Datenbank namens "DBA" zugreift, um dort eine Prozedur auszuführen:
EXEC DBA.dbo.DebugOutput
Dies führt leider dazu, dass bei jedem Aufruf der ActivationProcedure der folgende Fehler auftritt:
The server principal "sa" is not able to access the database "DBA" under the current security context.
Der Nutzer "sa" sollte doch auf jede Datenbank auf dem Server (also auch auf "DBA") Zugriff haben, oder irre ich mich da?
Um das Problem außerhalb der Broker-Architektur nachstellen zu können, nutze ich "EXECUTE AS USER =" in einer normalen Abfrage im SSMS. Der gesamte Aufruf lautet nun
USE A EXECUTE AS USER = N'dbo' EXEC DBA.dbo.DebugOutput REVERT
Auch hier erhalte ich dieselbe Fehlermeldung:
The server principal "sa" is not able to access the database "DBA" under the current security context.
Nun habe ich versucht, einen Account anzulegen, der genug Rechte auf beiden Datenbanken (Datenbank "DBA" und die Ausgangsdatenbank "A") hat. Ferner habe ich mir selbst Impersonate-Rechte auf den Login sowie die User gegeben. Den Account habe ich "BrokerDude" genannt, dies sind die CREATE Skripte aus dem SSMS:
CREATE LOGIN [BrokerDude] WITH PASSWORD=N'bÝ0"Ì*µKoÈÖ?á{Qÿ=h¬·w$Ý!¿Åsî', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO GRANT IMPERSONATE ON LOGIN:: BrokerDude TO [meinAccount] GO USE A CREATE USER [BrokerDude] FOR LOGIN [BrokerDude] WITH DEFAULT_SCHEMA=[dbo] GO ALTER ROLE [db_owner] DROP MEMBER [BrokerDude] GO GRANT IMPERSONATE ON USER:: BrokerDude TO [meinAccount] GO USE DBA CREATE USER [BrokerDude] FOR LOGIN [BrokerDude] WITH DEFAULT_SCHEMA=[dbo] GO ALTER ROLE [db_owner] DROP MEMBER [BrokerDude] GO GRANT IMPERSONATE ON USER:: BrokerDude TO [meinAccount] GO
Nun versuche ich, diesen Account zu Nutzen, um das Query auszuführen:
USE A EXECUTE AS USER = N'BrokerDude' EXEC DBA.dbo.DebugOutput REVERT
Leider erhalte ich auch hier die Fehlermeldung:
The server principal "BrokerDude" is not able to access the database "DBA" under the current security context.
Das verstehe ich nicht, da der "BrokerDude" ja alle Rechte auf der Datenbank "DBA" hat. Über jeden Hinweis, wo mein Denkfehler liegen könnte, wäre ich sehr dankbar!
Antworten
-
Hallo,
Du must die Datenbank TRUSTWORTHY stellen, sonst geht es nur mit Zertifikaten (ist auch die bessere Lösung)
ALTER DATABASE YourDB SET TRUSTWORTHY ON;
Ist ein Sicherheitsrisiko und das solltest Du auf jeden Fall beachten:
http://msdn.microsoft.com/de-de/library/ms187861.aspx
Wie man es mit Zertifikaten macht, findest Du in meinem Blog in diesem Artikel:
http://db-berater.blogspot.de/2012/11/zertifikate-fur-die-ausfuhrung-von.htmlUwe Ricken
MCITP Database Administrator 2005
MCITP Database Administrator 2008
MCITP Microsoft SQL Server 2008, Database Development
db Berater GmbH
http://www-db-berater.de
SQL Server Blog (german only)- Als Antwort vorgeschlagen Olaf HelperMVP Mittwoch, 28. November 2012 17:51
- Als Antwort markiert Wilfried Weber Donnerstag, 29. November 2012 09:06
Alle Antworten
-
Hallo,
Du must die Datenbank TRUSTWORTHY stellen, sonst geht es nur mit Zertifikaten (ist auch die bessere Lösung)
ALTER DATABASE YourDB SET TRUSTWORTHY ON;
Ist ein Sicherheitsrisiko und das solltest Du auf jeden Fall beachten:
http://msdn.microsoft.com/de-de/library/ms187861.aspx
Wie man es mit Zertifikaten macht, findest Du in meinem Blog in diesem Artikel:
http://db-berater.blogspot.de/2012/11/zertifikate-fur-die-ausfuhrung-von.htmlUwe Ricken
MCITP Database Administrator 2005
MCITP Database Administrator 2008
MCITP Microsoft SQL Server 2008, Database Development
db Berater GmbH
http://www-db-berater.de
SQL Server Blog (german only)- Als Antwort vorgeschlagen Olaf HelperMVP Mittwoch, 28. November 2012 17:51
- Als Antwort markiert Wilfried Weber Donnerstag, 29. November 2012 09:06
-
Vielen Dank für die schnelle Antwort!
Das Problem konnte durch
ALTER DATABASE A SET TRUSTWORTHY ON
gelöst werden.
Auch die Lösung über Zertifikate (danke für den ausführlichen und verständlichen Blog-Eintrag!) funktioniert wunderbar. Hat leider etwas Nerven gekostet, da ich die Option "WITH EXECUTE AS OWNER" beim Erstellen der Prozedur die über die Datenbanken hinweg zugreift nicht definiert hatte - dann funktioniert der Zugriff nämlich nicht.
Schöne Grüße,
Wilfried Weber