Problem z programem SQL Server WYKONAJ JAKO

13

Coś mi brakuje podczas próby użycia procedury składowanej EXECUTE AS. Procedura składowana odczytuje dane source_db, agreguje je i przechowuje wynik target_db.

Sam SP jest w target_db. Mam dedykowany logowanie i mapować je do użytkowników w obu source_dbi target_dbdla właściciela SP jest (więc jest łatwy app_agentw source_dba target_dbdo logowania app_agent).

Jeśli zaloguję się jako app_agenti wykonam

EXEC target_db.app_agent_schema.import_data

wszystko dziala. Ale jeśli się zmienię

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

i spróbuj go wykonać, rzuca

Główny serwer „app_agent” nie może uzyskać dostępu do bazy danych „source_db” w obecnym kontekście bezpieczeństwa.

Używam SQL Server 2008.

Czy ktoś mógłby wskazać mój błąd?

Dzięki

Aktualizacja Po przeprowadzeniu badań odkryłem, że ALTER DATABASE target_db SET TRUSTWORTHY ONrozwiązuje problem, ale nie wydaje mi się to właściwym rozwiązaniem ...

a1ex07
źródło
1
Myślę, że odpowiedź jest za pomocą Database -level cross-bazy łańcuch własności opcję. Byłem w stanie odtworzyć błąd w twoim scenariuszu, ale nie podano wystarczających szczegółów, aby wiedzieć, czy dokładnie go odtworzyłem ... opcja CDOC nie działała dla mnie, ale wypróbuj ją i sprawdź, czy to się uda.
Jon Seigel,

Odpowiedzi:

24

Jest to wyjaśnione w temacie Rozszerzanie personifikacji bazy danych za pomocą EXECUTE AS . Kontekst EXECUTE AS jest zaufany tylko w bieżącej bazie danych, a przeniesienie go do innych baz danych stanowi eskalację wektora ataku uprzywilejowanego.

Istnieją dwa rozwiązania opisane w powyższym artykule:

  • łatwe jeden jest, aby zaznaczyć godny zaufania bazy danych: ALTER DATABASE [source_db] SET TRUSTWORTHY ON;. Chociaż łatwo jest również niebezpieczne, ponieważ sprawia, że dbostanowi source_dbde facto sysadmin.

  • bezpiecznym jest użycie podpisu kodu, patrz przykład Wywołanie procedury w innej bazie danych . Jest to bardziej złożone, ale zapewnia 100% bezpieczeństwo buletproff.

Remus Rusanu
źródło
0

Który użytkownik uruchamia polecenie ALTER PROCEDURE? Może ustawić poziom dostępu właściciela (własny) na tego użytkownika, a nie na zamierzony.

Niebo
źródło
Ten sam użytkownik, który utworzył procedurę ( app_agent). Jeśli mam procedurę utworzoną przez app_agentbez execute as owner/self, zaloguj się jako app_agentSP wykonuje się poprawnie. Jeśli dodam EXECUTE AS SELF(ponownie tego samego użytkownika) i app_agent...is not able to access the database...
zaloguję się