Stellen Sie sich das folgende Szenario vor
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');
Irgendwann wird ein ETL-Prozess geschrieben, der einige Aktivitäten in der test
Datenbank ausführt .
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*/
Der etlUser sollte keine Berechtigungen für die Customer
Tabelle (und schon gar nicht für die SensitiveData
Spalte) haben, daher werden diese oben ausdrücklich verweigert.
Der ETL-Prozess wird abgeschnitten, dbo.StagingTable
sodass ALTER
Tabellenberechtigungen dafür erteilt werden.
Dies wird während einer Sicherheitsüberprüfung markiert. Wie gefährlich ist dieses Szenario?
sql-server
permissions
Martin Smith
quelle
quelle
Antworten:
Ziemlich gefährlich ...
Zusätzlich zu der offensichtlichen Berechtigung, die Struktur von sich
StagingTable
selbst zu ändern,ALTER TABLE
können sie mit der Berechtigung Trigger für die Tabelle erstellen. In diesem Fall können sie durch Verkettung der Eigentumsverhältnisse sowohl sensible Kundendaten (trotz der ausdrücklichenDENY
Berechtigungen) anzeigen als auch Vandalismus an dieser zweiten Tabelle ausführen.quelle
Die Berechtigung ALTER TABLE ermöglicht nicht nur das Hinzufügen von Triggern, sondern auch Folgendes :
Es ermöglicht auch das Entfernen von Spalten, aber das wird wahrscheinlich nicht unbemerkt bleiben (da wir hier anscheinend nach potenziellen Aktionen suchen, die eher täuschen als böswillig sind).
Glücklicherweise ist es niemals erforderlich, diese Berechtigung jemandem zu erteilen, noch ist es erforderlich, sie in eine gespeicherte Prozedur zu verpacken, die die
EXECUTE AS
Klausel verwendet (normalerweise gefolgt von'dbo'
oderOWNER
). Die Modulsignierung ermöglicht die einfache Abstraktion privilegierter Aktionen hinter signiertem Code (gespeicherte Prozeduren, Trigger, skalare UDFs und TVFs mit mehreren Anweisungen). Ich habe Beispielcode, der zeigt, wie dies in den folgenden Antworten hier auf DBA.SE erreicht werden kann:Der Unterschied zwischen diesen beiden Antworten besteht in der Berechtigung, die dem signaturbasierten Benutzer erteilt wurde. Die zu erteilende Berechtigung (oder die hinzuzufügende DB-Rolle) hängt vom Umfang der erforderlichen Aufgaben ab. Wenn Sie nur die Berechtigung für eine einzelne Tabelle benötigen, gewähren Sie nur
ALTER
diese Tabelle. Wenn für alle Tabellen in einem bestimmten Schema eine Berechtigung erforderlich ist, erteilen Sie einzelnen Tabellen keine Berechtigung, sondern erteilen Sie dem Schema selbst die Berechtigung. Und so weiter.Das Signieren von Modulen ist ein paar zusätzliche Schritte im Vergleich zum Erstellen eines Schemas speziell für den ETL-Benutzer oder zum Verwenden der
EXECUTE AS
Klausel, aber:EXECUTE
Berechtigung für diesen Code erteilt wurde. Als Schemabesitzer sind bestimmte implizite Berechtigungen zulässig, die nicht erforderlich sind. Wenn SieEXECUTE AS 'dbo'
oder verwendenEXECUTE AS OWNER
(vorausgesetzt, der Eigentümer istdbo
) , erhalten Sie von diesem Zeitpunkt an den gesamten Prozessdbo
Berechtigungen, nicht nur die gespeicherte Prozedur / den Trigger / die Funktion, mit der Sie gearbeitet habenEXECUTE AS
. Die Modulsignatur beschränkt die Berechtigungen nur auf den von Ihnen signierten Code und nicht auf den vom signierten Code aufgerufenen Code.quelle
Eine bessere Vorgehensweise wäre, ein Staging-Schema zu erstellen, das dem ETL-Benutzer gehört. Anschließend kann der ETL-Prozess Tabellen abschneiden, Einschränkungen deaktivieren, Partitionswechsel durchführen usw. innerhalb des Staging-Schemas. Der ETL-Benutzer würde nur eine eingeschränkte Berechtigung für die anderen Schemas benötigen.
Sie können auch eine Datenbankrolle anstelle eines einzelnen Benutzers verwenden.
Natürlich können Sie Ihrem eingeschränkten Benutzer auch ermöglichen, Tabellenkürzungen mit einer im Besitz von dbo befindlichen gespeicherten Prozedur wie folgt durchzuführen:
quelle