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:

CREATE DATABASE DBPUB
GO
USE DBPUB
GO
EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false
CREATE DATABASE DBPRIV
GO
USE DBPRIV
GO
EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false

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

USE DBPRIV
GO
CREATE TABLE tblPriv
(id int)
USE DBPUB
GO
CREATE VIEW vwPub AS
SELECT id FROM DBPRIV.dbo.tblPriv
GO

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:

SELECT * FROM vwPub
GO

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:

USE [master]
GO
CREATE LOGIN [PubLogin] WITH PASSWORD=N'Pa$$w0rd'
GO
USE DBPRIV
GO
CREATE USER [PubLogin] FOR LOGIN [PubLogin]
USE DBPUB
GO
CREATE USER [PubLogin] FOR LOGIN [PubLogin]
ALTER ROLE [db_owner] ADD MEMBER [PubLogin]
GO

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:

exec sp_configure 'cross db ownership chaining', 1
RECONFIGURE

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