Row-Level Security ile Satır Bazında Kısıtlama
Row-Level Security, SQL Server 2016 ile gelen, her kullanıcının sadece kendi verilerini görebilmesine olanak veren bir özelliktir. Yani kullanıcılar kendileri ile ilgili olan satırlar dışındaki satırları göremez. Hemen hemen her makalemde yaptığım gibi bir örnek üzerinden anlatarak konuya devam edeceğim. Bu şekilde daha anlaşılır olduğunu düşünüyorum.
Aşağıdaki script ile Hasta isminde bir tablo oluşturup için bazı örnek kayıtlar girelim. Burada dikkat edilmesi gereken kolon HemsireKullanici kolonu. Makalenin ilerleyen bölümlerinde bu kolon’daki verilerle ilgili kısıtlama yapacağız.
Create table dbo.Hasta ( HastaID INT, HemsireKullanici Varchar(100), OdaNO INT, HastaBilgisi varchar(4000) ) INSERT INTO dbo.Hasta VALUES(1,'Elifsu',105,'Enfeksiyon') INSERT INTO dbo.Hasta VALUES(2,'Elifsu',106,'Romatizma') INSERT INTO dbo.Hasta VALUES(3,'Elifsu',107,'Kan Tahlil') INSERT INTO dbo.Hasta VALUES(4,'Zeynep',108,'Varis') INSERT INTO dbo.Hasta VALUES(5,'Zeynep',109,'Kalça Kırığı') INSERT INTO dbo.Hasta VALUES(6,'Zeynep',110,'Bel Ağrısı') INSERT INTO dbo.Hasta VALUES(7,'Reyyan',111,'Soğuk Algınlığı') INSERT INTO dbo.Hasta VALUES(8,'Reyyan',112,'Enfeksiyon') INSERT INTO dbo.Hasta VALUES(9,'Reyyan',113,'Romatizma') INSERT INTO dbo.Hasta VALUES(10,'Reyyan',114,'Soğuk Algınlığı')
Daha sonra aşağıdaki gibi bir fonksiyon oluşturmamız gerekiyor. Bu fonksiyondaki where bloğunda sorguyu çalıştıran kişiyi tespit edeceğiz.
Create Function dbo.fn_securityPredicate (@HemsireKullanici sysname) returns table with Schemabinding as return select 1 as [fn_securityPredicate] from dbo.Hasta where @HemsireKullanici = user_name()
Son olarak da yukarda tanımladığımız fonksiyon ile beraber çalışacak aşağıdaki gibi bir security policy oluşturarak işlemi tamamlıyoruz.
CREATE SECURITY POLICY fn_security ADD Filter Predicate dbo.fn_securityPredicate(HemsireKullanici) ON dbo.Hasta WITH (STATE = ON);
Sonuç olarak;
Zeynep isimli bir login oluşturup Hasta tablosunda Select yetkisi verdiğimizde Zeynep isimli login ile veritabanına bağlanıp Hasta tablosuna Select çektiğimizde aşağıdaki gibi bir sonuç geliyor.
Login oluşturmak ve yetkilendirmek ile ilgili “Login oluşturmak ve yetkilendirmek” isimli makalemden faydalanabilirsiniz.
Yani Zeynep sadece kendi sorumlu olduğu oda ve hasta bilgilerini görebiliyor.
Benim gerçekten hoşuma gitti. Microsoft son versiyonlarında güvenliğe verdiği önemi arttırdı. Güvenlik ile ilgili beğendiğim diğer bir özellikte Always Encrypted. Bu özellik ile veriler uygulama seviyesinde şifreleniyor ve veritabanında kimse verileri göremiyor. (Evet veritabanı yöneticileri bile)
“Always Encrypted Nedir ve Nasıl Kullanılır?” isimli makalede Always Encrypted ile ilgili detaylı bilgi bulabilirsiniz.
Row-Level Security’i aktif edebilmek, değiştirebilmek ya da silebilmek için ALTER ANY SECURITY POLICY yetkisine ihtiyacımız var. Veritabanına sağ tıklayarak properties dedikten sonra permission sekmesinden spesifik kullanıcılar için verilebilir.