Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Standardmäßig werden sowohl DML- als auch DDL-Trigger im Kontext des Benutzers ausgeführt, der den Trigger aufruft. Der Aufrufer eines Triggers ist der Benutzer, der die Anweisung ausführt, die bewirkt, dass der Trigger ausgeführt wird. Wenn beispielsweise Benutzer Mary eine DELETE-Anweisung ausführt, die bewirkt, dass DML-Trigger DML_trigMary ausgeführt wird, wird der Code innerhalb DML_trigMary im Kontext der Benutzerberechtigungen für Mary ausgeführt. Dieses Standardverhalten kann von Benutzern ausgenutzt werden, die bösartigen Code in die Datenbank- oder Serverinstanz einführen möchten. Der folgende DDL-Trigger wird z. B. vom Benutzer JohnDoeerstellt:
CREATE TRIGGER DDL_trigJohnDoe
ON DATABASE
FOR ALTER_TABLE
AS
GRANT CONTROL SERVER TO JohnDoe ;
GO
Was dieser Auslöser bedeutet, ist, dass sobald ein Benutzer, der über die Berechtigung zum Ausführen einer GRANT CONTROL SERVER Anweisung verfügt, wie etwa ein Mitglied der festen Serverrolle sysadmin, eine ALTER TABLE Anweisung ausführt, dem JohnDoe die Berechtigung CONTROL SERVER erteilt wird. Mit anderen Worten, obwohl JohnDoe er keine Berechtigung für sich selbst erteilen CONTROL SERVER kann, aktivierte er den Triggercode, der ihm diese Berechtigung erteilt, unter eskalierten Berechtigungen auszuführen. Sowohl DML- als auch DDL-Trigger sind offen für diese Art von Sicherheitsrisiken.
Sicherheitsbewährte Praktiken auslösen
Sie können die folgenden Maßnahmen ergreifen, um zu verhindern, dass Triggercode unter eskalierten Berechtigungen ausgeführt wird:
Beachten Sie die DML- und DDL-Trigger, die in der Datenbank und in der Serverinstanz vorhanden sind, indem Sie die sys.triggers und sys.server_triggers Katalogansichten abfragen. Die folgende Abfrage gibt alle DML- und DDL-Trigger auf Datenbankebene in der aktuellen Datenbank sowie alle DDL-Trigger auf Serverebene in der Serverinstanz zurück:
SELECT type, name, parent_class_desc FROM sys.triggers UNION SELECT type, name, parent_class_desc FROM sys.server_triggers ;Verwenden Sie DISABLE TRIGGER , um Trigger zu deaktivieren, die die Integrität der Datenbank oder des Servers beeinträchtigen können, wenn die Trigger unter eskalierten Rechten ausgeführt werden. Mit der folgenden Anweisung werden alle DDL-Trigger auf Datenbankebene in der aktuellen Datenbank deaktiviert:
DISABLE TRIGGER ALL ON DATABASEDiese Anweisung deaktiviert alle DDL-Trigger auf Serverebene in der Serverinstanz:
DISABLE TRIGGER ALL ON ALL SERVERDiese Anweisung deaktiviert alle DML-Trigger in der aktuellen Datenbank:
DECLARE @schema_name sysname, @trigger_name sysname, @object_name sysname ; DECLARE @sql nvarchar(max) ; DECLARE trig_cur CURSOR FORWARD_ONLY READ_ONLY FOR SELECT SCHEMA_NAME(schema_id) AS schema_name, name AS trigger_name, OBJECT_NAME(parent_object_id) as object_name FROM sys.objects WHERE type in ('TR', 'TA') ; OPEN trig_cur ; FETCH NEXT FROM trig_cur INTO @schema_name, @trigger_name, @object_name ; WHILE @@FETCH_STATUS = 0 BEGIN SELECT @sql = 'DISABLE TRIGGER ' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@trigger_name) + ' ON ' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@object_name) + ' ; ' ; EXEC (@sql) ; FETCH NEXT FROM trig_cur INTO @schema_name, @trigger_name, @object_name ; END GO -- Verify triggers are disabled. Should return an empty result set. SELECT * FROM sys.triggers WHERE is_disabled = 0 ; GO CLOSE trig_cur ; DEALLOCATE trig_cur;