Zarządzanie zabezpieczeniami wyzwalacza

Domyślnie LŚD i DDL wyzwala wykonać w kontekście użytkownika, że wyzwalacz wywołuje.Wywołujący wyzwalacz jest użytkownik, który wykonuje instrukcja , która powoduje wyzwalacza.Na przykład jeśli użytkownik Maria wykonuje usunięcia instrukcja wyzwalacz DML, która powoduje DML_trigMary uruchomienie kodu wewnątrz DML_trigMary jest wykonywany w kontekście uprawnienia użytkownika Maria.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, następujący wyzwalacz DLL utworzone przez użytkownika JohnDoe:

CREATE TRIGGER DDL_trigJohnDoe

ON DATABASE

FOR ALTER_TABLE

AS

GRANT CONTROL SERVER TO JohnDoe ;

GO

Oznacza ten wyzwalacz jest tak szybko, jak użytkownik, który ma uprawnienia do wykonać GRANT CONTROL SERVER instrukcja, takich jak element członkowski z sysadmin wykonuje rolę serwera stała ALTER TABLE instrukcja, JohnDoe jest przyznawana CONTROL SERVER uprawnienia.Innymi słowy chociaż JohnDoe nie może udzielić CONTROL SERVER do siebie, mu udzielone uprawnienie kod wyzwalacza, który udziela mu tego uprawnienia do wykonać w escalated uprawnienia.Obie DML i wyzwalacze DDL są otwarte dla tego rodzaju zagrożeniem bezpieczeństwa.

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

Można podjąć następujące środki, aby zapobiec wykonywaniu uprawnień escalated w obszarze kod wyzwalacza:

  • Należy pamiętać o wyzwalaczy LŚD i DDL, które istnieją w bazie danych, a na serwerze wystąpienie przez badanie sys.triggers i sys.server_triggers wykazu widoki.Następująca kwerenda zwraca wszystkie LŚD i wyzwalacze DDL poziom bazy danych w bieżącej bazie danych i wszystkie wyzwalacze DDL poziom serwera na serwerze wystąpienie:

    SELECT type, name, parent_class_desc FROM sys.triggers
    UNION
    SELECT type, name, parent_class_desc FROM sys.server_triggers ;
    
  • Użyj Wyłączenia WYZWALACZA wyłączania wyzwalaczy, które mogą uszkodzić integralność bazy danych lub serwera, jeśli Wyzwalacze wykonać w obszarze przekazany uprawnień.Poniższa instrukcja wyłącza wszystkie wyzwalacze DDL poziom bazy danych w bieżącej bazie danych:

    DISABLE TRIGGER ALL ON DATABASE
    

    To instrukcja wyłącza wszystkie wyzwalacze DDL poziom serwera w wystąpieniu serwera:

    DISABLE TRIGGER ALL ON ALL SERVER
    

    Ta instrukcja powoduje wyłączenie wszystkich DML wyzwalaczy 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;