Mengelola Keamanan Pemicu

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Secara default, pemicu DML dan DDL dijalankan di bawah konteks pengguna yang memanggil pemicu. Pemanggil pemicu adalah pengguna yang menjalankan pernyataan yang menyebabkan pemicu berjalan. Misalnya, jika pengguna Mary menjalankan pernyataan DELETE yang menyebabkan pemicu DML DML_trigMary berjalan, kode di dalam DML_trigMary dijalankan dalam konteks hak istimewa pengguna untuk Mary. Perilaku default ini dapat dieksploitasi oleh pengguna yang ingin memperkenalkan kode berbahaya dalam database atau instans server. Misalnya, pemicu DDL berikut dibuat oleh pengguna JohnDoe:

CREATE TRIGGER DDL_trigJohnDoe
ON DATABASE
FOR ALTER_TABLE
AS
SET NOCOUNT ON;

BEGIN TRY
  EXEC(N'
    USE [master];
    GRANT CONTROL SERVER TO [JohnDoe];
');
END TRY
BEGIN CATCH
  DECLARE @DoNothing INT;
END CATCH;
GO

Artinya pemicu ini adalah bahwa segera setelah pengguna yang memiliki izin untuk menjalankan GRANT CONTROL SERVER pernyataan, seperti anggota peran server tetap sysadmin , menjalankan ALTER TABLE pernyataan, JohnDoe diberikan CONTROL SERVER izin. Dengan kata lain, meskipun JohnDoe tidak dapat memberikan CONTROL SERVER izin kepada dirinya sendiri, ia mengaktifkan kode pemicu yang memberinya izin ini untuk dijalankan di bawah hak istimewa yang dieskalasikan. Pemicu DML dan DDL terbuka untuk ancaman keamanan semacam ini.

Memicu Praktik Terbaik Keamanan

Anda dapat mengambil langkah-langkah berikut untuk mencegah kode pemicu dijalankan di bawah hak istimewa yang ditingkatkan:

  • Waspadai pemicu DML dan DDL yang ada di database dan pada instans server dengan mengkueri tampilan katalog sys.triggers dan sys.server_triggers . Kueri berikut mengembalikan semua pemicu DML dan DDL tingkat database dalam database saat ini, dan semua pemicu DDL tingkat server pada instans server:

    SELECT type, name, parent_class_desc FROM sys.triggers
    UNION ALL
    SELECT type, name, parent_class_desc FROM sys.server_triggers;
    

Catatan

Hanya sys.triggers yang tersedia untuk Azure SQL Database kecuali Anda menggunakan Azure SQL Managed Instance.

  • Ketahui pemicu DML dan DDL yang ada di database dengan mengkueri tampilan katalog sys.triggers . Kueri berikut mengembalikan semua pemicu DML dan DDL tingkat database dalam database saat ini:

    SELECT type, name, parent_class_desc FROM sys.triggers;
    
  • Gunakan DISABLE TRIGGER untuk menonaktifkan pemicu yang dapat membahayakan integritas database atau server jika pemicu dijalankan di bawah hak istimewa yang diluaskan. Pernyataan berikut menonaktifkan semua pemicu DDL tingkat database dalam database saat ini:

    DISABLE TRIGGER ALL ON DATABASE;
    

    Pernyataan ini menonaktifkan semua pemicu DDL tingkat server pada instans server:

    DISABLE TRIGGER ALL ON ALL SERVER;
    

    Pernyataan ini menonaktifkan semua pemicu DML dalam database saat ini:

    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 = N'DISABLE TRIGGER ' + QUOTENAME(@schema_name) + N'.'
            + QUOTENAME(@trigger_name)
            + N' ON ' + QUOTENAME(@schema_name) + N'.'
            + QUOTENAME(@object_name) + N'; ';
        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;
    

Lihat Juga

BUAT PEMICU (Transact-SQL)
Pemicu DML
Pemicu DDL
Pemicu Masuk