SQL: cross db ownership chaining

30-Gru-2015

Drobna uwaga na temat tego, co się stanie jeśli właścicielem bazy danych jest sa i dodatkowo masz włączoną opcję serwera cross db ownership chaining

Zaczynamy od założenia 2 baz danych:

Teraz w bazach danych zakładamy obiekty: tabelę w bazie DBPRIV, a w bazie DBPUB widok korzystający z tabeli z bazy DBPRIV

Czy taka konstrukcja zadziała? Tak, w końcu w tej chwili jesteś w roli sysadmin, która ma db_owner w każdej bazie danych:

Ale czy zadziała to również dla innych użytkowników? Zakładamy login PubLogin, który w bazie DBPUB ma uprawnienia db_owner, ale w bazie DBPRIV jest tylko w roli public, bez żadnych dodatkowych uprawnień, więc nie może np. wykonywać select do tabeli:

Jeśli zalogujesz się na PubLogin i wykonasz w bazie DBPUB select do widoku vwPub to otrzymasz błąd (o ile nie grzebałeś wcześniej przy opcji cross db ownershp chaining):

Msg 229, Level 14, State 5, Line 4
The SELECT permission was denied on the object ‚tblPriv’, database ‚DBPRIV’, schema ‚dbo’.

W sumie sensowne. PubLogin ma uprawnienia w DBPUB ale w bazie DPPRIV jest bardzo nisko uprzywilejowany. Zmieńmy teraz opcję cross db ownership chaining:

Teraz zapytanie do widoku wykonane przez PubLogin zakonczy się sukcesem (nawet bez przelogowywania). Oznacza to, że użytkownik, który jest db_owner w bazie DBPUB może tworzyć sobie widoki/procedury, które będą sięgać do obiektów innych baz, nawet jeśli nie ma do nich nadanych bezpośrednio uprawnień!

To właśnie dlatego cross db ownership chaining jest domyślnie wyłączona. Jeśli tego rodzaju mechanizmy chesz włączyć to lepiej robić to za pomocą ustawiania opcji wybranych baz danych. Działaniu opcji nie podlegają bazy systemowe, które zawsze pozwalają na ownership chaining, nawet przy wyłączonej opcji.

 

Dodaj komentarz:

Autor: Rafał Kraik