26 Şubat 2019 Salı

SQL Server'da LOGON Trigger Nedir? Ne işe Yarar?

Logon Trigger'lar SQL Server de güvenlik ve kontrol amaçlı kullanılabilen objelerdir. Eğer SQL Server Instance'a bağlananlar üzerinde kısıtlar uygulamak isterseniz tam olarak ihtiyacınızı Logon trigger ile karşılayabilirsiniz.

Şimdi bu konunun demosunu küçük bir senorya ile inceleyelim.

Örneğin kullanıcılarınızın veritabanına dışarıdan bilinmeyen bir bilgisayardan bağlanmasını engellemek istiyorsunuz. Yani sadece şirket bilgisayarından login olmasına izin vereceksiniz. Bu durumda kullanıcılarınız SQL Server login ile sysadmin(Full Yetki) yetkisine sahip olsa bile başka bir bilgisayardan bağlanma izni olmayacak. 

Bunun için öncelikle küçük bir hazırlık çalışması yapmanız gerekecek. Şirket bilgisayarların isimlerini SQL Server'da bir tablo oluşturarak tutmanız gerekir. Ben aşağıdaki örnekte HostName adında bir tablo oluşturarak bilgisayar isimlerini burada tuttum.

Logon Trigger'ı prod ortamına almadan önce kesinlikle test ortamınızda denemenizi tavsiye ediyorum. Kodda gözden kaçan bir mantık hatası olursa bütün kullanıcıların SQL Server'la olan bağlantısını kesersiniz. Tabi bu durumu aşmanın da yolları mevcut ama genede sonradan uğraşmamak adına dikkat etmekte fayda var.

Fakat bu kurgulanan senaryo çok sağlıklı değil. Çünkü her bilgisayar değişimi olduğunda ilgili tabloya tanımlama yapılması gerekmektedir. Ayrıca kişi başka bir bilgisayarın adını tabloda olan kayıtlardan biriyle eşleşecek şekilde değiştirirse de SQL Server'a erişim sağlama ihtimalide var. Daha güvenli ve jenerik bir yapı kurulması faydalı olacaktır. 

Faydalı olması dileklerimle...



create TRIGGER pcName
ON ALL SERVER WITH EXECUTE AS 'sa'

FOR LOGON

AS

BEGIN

       if  exists (select * from server_b.dbo.HostName
       where name = (SELECT HOST_NAME()))

       ----Oluşturduğum HostName tablosunda eğer girilmeye çalışan bilgisayar ismi yoksa trigger tetiklenip rollback blogunun içerisine girecek ve kullanıcı bağlantı hatası almış olacak.
       begin

              COMMIT

       end

       else

              ROLLBACK

END



-- Triggeri silmek için bu kodu kullanabilirsiniz.
--DROP TRIGGER [triggerAdi] ON ALL SERVER