Wyobraź sobie następujący scenariusz
CREATE DATABASE test
GO
USE test;
CREATE TABLE dbo.Customer
(
CustomerId INT,
Email VARCHAR(100),
SensitiveData VARCHAR(20)
);
INSERT INTO dbo.Customer
VALUES (1,'[email protected]','12346789');
W pewnym momencie zapisywany jest proces ETL, który wykonuje pewne działania w test
bazie danych.
CREATE USER etlUser WITHOUT LOGIN; /*For demo purposes*/
CREATE TABLE dbo.StagingTable
(
StagingTableId INT,
SomeData VARCHAR(100),
)
GRANT UPDATE,INSERT,DELETE,SELECT,ALTER ON dbo.StagingTable TO etlUser;
DENY SELECT ON dbo.Customer TO etlUser;
DENY SELECT ON dbo.Customer (SensitiveData) TO etlUser; /*For good measure*/
EtlUser nie powinien mieć uprawnień do Customer
tabeli (a już na pewno nie do SensitiveData
kolumny), więc wyraźnie odmawia się ich powyżej.
Proces ETL jest obcinany, dbo.StagingTable
więc ma ALTER
na to uprawnienia do tabeli.
Jest to oznaczane podczas audytu bezpieczeństwa. Jak niebezpieczny jest ten scenariusz?
sql-server
permissions
Martin Smith
źródło
źródło
Odpowiedzi:
Całkiem niebezpieczne ...
Oprócz oczywistego uprawnienia do zmiany samej struktury
StagingTable
,ALTER TABLE
uprawnienie pozwala im tworzyć wyzwalacze na stole. W tym przypadku dzięki łańcuchowi własności są w stanie zarówno zobaczyć poufne dane klientów (pomimo wyraźnychDENY
zezwoleń), jak i dokonać wandalizmu na tym drugim stole.źródło
Oprócz możliwości dodawania wyzwalaczy uprawnienie ALTER TABLE pozwala również na:
Pozwala również na usunięcie kolumn, ale nie pozostanie to niezauważone (ponieważ wydaje się, że szukamy tutaj potencjalnych działań, które będą bardziej zwodnicze niż złośliwe).
Na szczęście nigdy nie jest konieczne, aby udzielić zgody na nikogo, ani nie jest to konieczne, by zakończyć to w procedurze przechowywanej, który korzysta z
EXECUTE AS
klauzuli (zazwyczaj następuje'dbo'
alboOWNER
). Podpisywanie modułów pozwala na łatwą abstrakcję uprzywilejowanych działań za podpisanym kodem (procedury składowane, wyzwalacze, skalarne UDF i wielofazowe TVF). Mam przykładowy kod pokazujący, jak to zrobić w następujących odpowiedziach, tutaj na DBA.SE:Różnica między tymi dwiema odpowiedziami polega na uprawnieniu przyznanym Użytkownikowi opartemu na podpisach. Zezwolenie, które ma zostać przyznane (lub rola DB, do której ma zostać dodane) zależy od zakresu potrzebnych potrzeb. Jeśli potrzebujesz uprawnień tylko dla pojedynczej tabeli, udziel jej tylko
ALTER
dla tej tabeli. Jeśli potrzebne są uprawnienia do wszystkich tabel w określonym schemacie, nie udzielaj uprawnień do poszczególnych tabel, ale zamiast tego przyznaj uprawnienia do samego schematu. I tak dalej.Podpisywanie modułów to kilka dodatkowych kroków w porównaniu do tworzenia schematu specjalnie dla użytkownika ETL lub korzystania z
EXECUTE AS
klauzuli, ale:EXECUTE
pozwolenia na ten kod. Bycie właścicielem schematu pozwala na pewne niejawne uprawnienia, które są niepotrzebne. I użycieEXECUTE AS 'dbo'
lubEXECUTE AS OWNER
(zakładając, że właścicielem jestdbo
) da cały proces , od tego momentu,dbo
uprawnienia, a nie tylko procedurę przechowywaną / wyzwalacz / funkcję, której użyłeśEXECUTE AS
. Podpisywanie modułów ogranicza uprawnienia tylko do podpisanego kodu, a nie do żadnego kodu wywoływanego przez podpisany kod.źródło
Lepszą praktyką byłoby utworzenie schematu pomostowego, którego właścicielem jest użytkownik ETL. Następnie proces ETL może obcinać tabele, wyłączać ograniczenia, przeprowadzać przełączanie partycji itp. W ramach schematu pomostowego. Użytkownik ETL potrzebowałby jedynie ograniczonego pozwolenia na inne schematy.
Możesz także użyć roli bazy danych zamiast jednego użytkownika.
Oczywiście możesz również umożliwić ograniczonemu użytkownikowi wykonywanie obcinania tabel za pomocą procedury składowanej będącej własnością dbo, w następujący sposób:
źródło