Freigeben über


Triggersicherheit verwalten

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 DATABASE  
    

    Diese Anweisung deaktiviert alle DDL-Trigger auf Serverebene in der Serverinstanz:

    DISABLE TRIGGER ALL ON ALL SERVER  
    

    Diese 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;  
    

Siehe auch

CREATE TRIGGER (Transact-SQL)
DML-Trigger
DDL-Trigger