Udostępnij za pośrednictwem


Managing Trigger Security

Domyślnie, zarówno DML, jak i DDL wyzwala wykonać w kontekście użytkownika, że wyzwalacz wywołuje.Wywołujący wyzwalacz jest użytkownik, który wykonuje instrukcję, która powoduje, że wyzwalacz do uruchomienia.Na przykład jeśli użytkownik Anna Instrukcja DELETE, która powoduje, że wyzwalacz DML jest wykonywanyDML_trigMary uruchomienie kodu wewnątrz DML_trigMary jest wykonywany w kontekście uprawnienia użytkownika dotyczące Anna.To zachowanie domyślne może zostać wykorzystana przez użytkowników, którzy chcą wprowadzenie złośliwego kodu w bazie danych lub serwera wystąpienie.Na przykład przez użytkownika zostanie utworzony następujący wyzwalacz DLL JohnDoe:

CREATE TRIGGER DDL_trigJohnDoe

ON DATABASE

FOR ALTER_TABLE

AS

GRANT CONTROL SERVER TO JohnDoe ;

GO

Oznacza to, co ten wyzwalacz jest tak szybko, jak użytkownik, który ma uprawnienia do wykonać GRANT CONTROL SERVER Instrukcja, takie jak członkiem sysadmin ustala rolę serwera jest wykonywanyALTER TABLE Instrukcja, JohnDoe przyznaje się CONTROL SERVER uprawnienie. Innymi słowy mimo że JohnDoe Nie można udzielić CONTROL SERVER uprawnienia do siebie, on włączony kod wyzwalacza, który udziela mu tego uprawnienia do wykonać w obszarze escalated uprawnień. Wyzwalacze zarówno DML, jak i DDL są dostępne dla tego rodzaju zagrożeniem bezpieczeństwa.

Najważniejsze wskazówki dotyczące zabezpieczeń wyzwalacza

Należy wykonać następujące działania, aby zapobiec wykonywaniu zgodnie z uprawnieniami escalated kod wyzwalacza:

  • Należy zwrócić uwagę na wyzwalaczy DML i DDL, które istnieją w bazie danych i na serwerze wystąpienie za pomocą kwerend wysyłanych do sys.Triggers and sys.server_triggers widoki wykazu.Następująca kwerenda zwraca wszystkie DML i wyzwalaczy DDL poziom bazy danych w bieżącej bazie danych, a wszystkie wyzwalacze DDL poziomie serwera w wystąpieniu serwera:

    SELECT type, name, parent_class_desc FROM sys.triggers
    UNION
    SELECT type, name, parent_class_desc FROM sys.server_triggers ;
    
  • Użycie WYŁĄCZ WYZWALACZA wyłączania wyzwalaczy, które mogą uszkodzić integralność bazy danych lub serwera, jeśli wykonana Wyzwalacze w obszarze przekazany uprawnień.Poniższa instrukcja powoduje wyłączenie wszystkich wyzwalaczy DDL poziom bazy danych w bieżącej bazie danych:

    DISABLE TRIGGER ALL ON DATABASE
    

    Ta instrukcja powoduje wyłączenie wszystkich wyzwalaczy DDL poziomie serwera dla wystąpienie serwera:

    DISABLE TRIGGER ALL ON ALL SERVER
    

    Ta instrukcja powoduje wyłączenie wszystkich wyzwalaczy DML w bieżącej bazie danych:

    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;