Tetikleyici güvenliği yönetme
Varsayılan olarak, dml ve ddl Tetikleyiciler tetikleyici çağıran kullanıcının bağlamında yürütmek. Çağıran tetikleyici çalıştırmak için tetikleyici ateşlenmesine deyimini yürütür kullanıcı var. Örneğin, eğer kullanıcı Mary dml tetikleyici ateşlenmesine delete deyimi yürütür DML_trigMary içinde kod çalıştırmak için DML_trigMary yürütür kullanıcı önceliklerine bağlamında Mary. Bu varsayılan davranış, kötü amaçlı kod veritabanı veya sunucu örneği tanıtmak isteyen kullanıcılar tarafından yararlanılabilir. Örneğin, aşağıdaki ddl tetikleyici kullanıcı tarafından oluşturulan JohnDoe:
CREATE TRIGGER DDL_trigJohnDoe
ON DATABASE
FOR ALTER_TABLE
AS
GRANT CONTROL SERVER TO JohnDoe ;
GO
Yürütme izni olan bir kullanıcı olarak Bu tetikleyici ne demek olduğunu bir GRANT CONTROL SERVERbir üyesi gibi deyimi sysadmin sunucu rolü yürütür bir ALTER TABLEdeyimi, JohnDoeverilir CONTROL SERVERizni. Diğer bir deyişle, her ne kadar JohnDoevermek olamaz CONTROL SERVERizni kendisi için o, onu escalated ayrıcalıklarıyla yürütmesine bu izin veren tetik kodu etkin. dml ve ddl Tetikleyiciler, bu tür bir güvenlik tehdidi için açıktır.
Tetikleyici güvenlik en iyi uygulamalar
Tetikleyici kod escalated ayrıcalıklarıyla yürütmesine engel olmak için aşağıdaki önlemleri alabilir:
Varolan veritabanı ve sunucu örneği sorgulayarak dml ddl Tetikleyiciler haberdar sys.triggers ve sys.server_triggers katalog görünümler. Aşağıdaki sorgu tüm dml ve veritabanı düzeyinde ddl Tetikleyiciler geçerli veritabanı ve tüm sunucu düzeyinde ddl Tetikleyiciler sunucu örneği döndürür:
SELECT type, name, parent_class_desc FROM sys.triggers UNION SELECT type, name, parent_class_desc FROM sys.server_triggers ;
Kullanım Tetikleyici devre dışı escalated ayrıcalıkları altında Tetikleyiciler yürütmek veritabanı veya sunucu bütünlüğüne zarar verme Tetikleyiciler devre dışı bırakma. Aşağıdaki deyimi geçerli veritabanındaki tüm veritabanı düzeyinde ddl Tetikleyiciler devre dışı bırakır:
DISABLE TRIGGER ALL ON DATABASE
Bu sunucu örneği üzerinde tüm sunucu düzeyinde ddl Tetikleyiciler devre dışı bırakır:
DISABLE TRIGGER ALL ON ALL SERVER
Bu deyimi geçerli veritabanındaki tüm dml Tetikleyiciler devre dışı bırakır:
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;