Row-Level Security ile Satır Bazında Kısıtlama

14 Kas by NURULLAH ÇAKIR

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.

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir