SQL Server güvenliğinde bazen kullanıcıların kim olduğundan bağımsız olarak, hangi araçla bağlandıkları kritik önem taşır. Özellikle canlı (production) veritabanlarında, kullanıcıların SQL Server Management Studio (SSMS) veya Excel gibi araçlarla doğrudan veritabanına bağlanıp plansız sorgular çalıştırmasını engellemek isteyebilirsiniz.
SQL Server, her bağlantı isteği sırasında istemci tarafından gönderilen uygulama adını APP_NAME() fonksiyonu ile hafızasında tutar. Biz de bir LOGON trigger yazarak, bu uygulama ismini kontrol ederiz. Eğer isim yasaklı listemizdeyse, bağlantı isteğini henüz kurulmadan ROLLBACK ile iptal ederiz.
Aşağıdaki kod, bağlantı kurmaya çalışan uygulamanın adı SSMS ise (versiyon fark etmeksizin), bağlantıyı anında koparacaktır:
CREATE TRIGGER trg_SafeBlockApplication
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @AppName NVARCHAR(128)
SET @AppName = APP_NAME() -- Bağlanmaya çalışan uygulamanın adını alır
IF @AppName LIKE '%Microsoft SQL Server Management Studio%'
BEGIN
ROLLBACK;
END
END
Aşağıdaki yapı, sadece belirli bir uygulamayı (SSMS gibi) engellemekle kalmaz, aynı zamanda kodun kendisinde bir hata çıksa bile sistemi kilitlemeyecek şekilde tasarlanmıştır. Bu yapı login trigger makalesinde detaylı açıkladığımız gibi olmazsa olmaz bir yapımızdır.
CREATE TRIGGER trg_SafeBlockApplication
ON ALL SERVER
FOR LOGON
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE @AppName NVARCHAR(128);
SET @AppName = APP_NAME();
-- Sadece engellenmek istenen uygulama kontrol edilir
IF @AppName LIKE '%Microsoft SQL Server Management Studio%'
BEGIN
-- İsteğe bağlı: Hata mesajını SQL Error Log'a yazdırabiliriz
RAISERROR('Bu uygulama üzerinden bağlantı yetkiniz yok!', 16, 1);
ROLLBACK;
END
END TRY
BEGIN CATCH
-- ROLLBACK yapmadığımız için hata çıksa bile bağlantı kurulur.
-- Bu, sistemin kilitlenmesini engelleyen "Emniyet Kemeri"dir.
PRINT 'Bir hata oluştu ama giriş engellenmedi';
END CATCH
END
Bazı üçüncü parti yazılımlar veya özel geliştirilmiş uygulamalar farklı isimler gönderebilir. Engellemek istediğiniz uygulamanın SQL Server’a hangi isimle “merhaba” dediğini bulmak için şu sorguyu kullanabilirsiniz:
SELECT DISTINCT program_name
FROM sys.dm_exec_sessions
WHERE is_user_process = 1
Buradan aldığınız program_name bilgisini trigger içerisindeki LIKE kontrolüne ekleyerek kısıtlamayı özelleştirebilirsiniz.
Oluşturulan Trigger server seviyesinde olduğu için SSMS üzerinde Server Object kısmında bulunan Triggers kısmından server seviyesinde oluşturulan trigger görülebilir.

Aşağıdaki komut ile Server seviyesinde Trigger’ları görebiliriz.
SELECT * FROM sys.server_triggers
WHERE type_desc = 'SQL_TRIGGER';

Eğer trigger hatalı çalışıyor ve bağlantıları engelliyorsa (veya üzerinde değişiklik yapmak istiyorsanız) şu komutları kullanabilirsiniz:
Trigger’ı Geçici Olarak Devre Dışı Bırakmak:
DISABLE TRIGGER trg_SafeBlockApplicationON ALL SERVER;
Eğer yanlışlıkla tüm girişleri kapatırsanız, SQL Server’a DAC (Dedicated Administrator Connection) üzerinden bağlanarak trigger’ı devre dışı bırakmanız gerekir:
Trigger’ı Tekrar Aktif Etmek:
ENABLE TRIGGER trg_SafeBlockApplicationON ALL SERVER;
Trigger’ı Tamamen Silmek:
DROP TRIGGER trg_SafeBlockApplication ON ALL SERVER;
Eğer trigger yüzünden sunucuya hiç bağlanamıyorsanız, SQL Server’ı “Minimal Configuration Mode” (-f parametresiyle) başlatarak trigger’ları devre dışı bırakıp sisteme girebilirsiniz. Aynı işlemi DAC ile de yapabiliriz.
Bu makalede login trigger yöntemi ile herhangi bir uygulamadan gelen isteklerin engelleneceği güvenli trigger yapısı oluşturduk. Başka makalede görüşmek dileğiyle..
“Dua ibadettir.”(Hadis)
