none
Zugriff auf andere Datenbank mit "EXECUTE AS" funktioniert nicht RRS feed

  • 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!

    Mittwoch, 28. November 2012 16:37

Antworten

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.html


    Uwe 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
    Mittwoch, 28. November 2012 16:51
  • 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

    Donnerstag, 29. November 2012 11:49