Row Level Security (Satır Düzeyinde Güvenlik), SQL Server 2016 ve sonraki sürümlerde sunulan, tablolardaki tek tek satırlara erişimi kontrol etmenizi sağlayan bir güvenlik özelliğidir.
RLS, kullanıcıların sorgularına otomatik olarak filtre uygulayarak, her kullanıcının yalnızca yetkili olduğu satırları görmesini sağlar.
- Güvenlik Politikaları (Security Policies): Hangi tablolara RLS uygulanacağını tanımlar
- Filtre İşlevleri (Predicate Functions): Hangi satırların görülebileceğini belirleyen mantığı içerir
Bir çalışan tablosunda, her çalışanın yalnızca kendi departmanındaki kayıtları görebilmesini sağlayalım.
-- Örnek tablo oluşturma
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name NVARCHAR(100),
Department NVARCHAR(50),
Salary DECIMAL(10,2)
);
-- Örnek veri ekleme
INSERT INTO Employees VALUES
(1, 'Ahmet Yılmaz', 'IT', 5000),
(2, 'Mehmet Demir', 'HR', 4500),
(3, 'Ayşe Kaya', 'IT', 5200),
(4, 'Fatma Şahin', 'Finance', 4800);
Filtreleme işlemi oluşturma:
İlk olarak geriye tablo dönen bir fonksiyonun oluşturulması gerekmektedir.
-- Kullanıcının departmanına göre filtreleme işlevi
CREATE SCHEMA Security;
GO
CREATE FUNCTION Security.fn_securitypredicate(@Department AS NVARCHAR(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS fn_securitypredicate_result
WHERE @Department = USER_NAME() OR USER_NAME() = 'dbo';
Güvenlik politikası oluşturma:
İlgili policy yapımıza bir isim tahsis ediyoruz.(Security.DepartmentFilter) Daha sonra yukarıda oluşturduğumuz fonksiyonumuzu filtre olarak ekliyoruz. Hangi tablo üzerinde hangi kolon filtrelenecekse ilgili kolon yazılmaktadır.
-- Güvenlik politikası oluşturma
CREATE SECURITY POLICY Security.DepartmentFilter
ADD FILTER PREDICATE Security.fn_securitypredicate(Department)
ON dbo.Employees
WITH (STATE = ON);
İlgili kullanıcılar oluşturulur ve yetki verilir.
-- Departman adlarında kullanıcılar oluşturma
CREATE USER IT WITHOUT LOGIN;
CREATE USER HR WITHOUT LOGIN;
CREATE USER Finance WITHOUT LOGIN;
-- Kullanıcılara tablo erişim izni verme
GRANT SELECT ON dbo.Employees TO IT, HR, Finance;
Yukarıda oluşturulan kullanıcılar ile bağlantı sağladığında sadece bağlantı sağladığı kullanıcı ile ilgili veri gösterecektir. Aşağdaki resimlerde oluşturulan kullanıcılar ile giriş yapıldıktan sonra sadece ilgili kullanıcı bilgilerini getirmektedir.


Tüm filtreleme veritabanı düzeyinde yapılır. Güvenlik kuralları tek bir noktadan yönetilebilir. Kullanıcı kimliğine, rolüne veya diğer bağlamsal bilgilere göre filtreleme yapabilir. Filtreler sorgu optimizasyonu ile entegre çalışır.
Karmaşık filtre işlevleri performansı etkileyebilir. Çok sayıda politika yönetimi zorlaştırabilir. Kapsamlı testler yapılmadan üretimde kullanılmamalıdır. Güvenlik politikaları yedekleme sırasında da korunur
Devre dışı bırakmak için aşağıdaki komut kullanılmaktadır.
-- Güvenlik politikasını devre dışı bırakma
ALTER SECURITY POLICY Security.DepartmentFilter
WITH (STATE = OFF);
-- Güvenlik politikasını tamamen kaldırma
DROP SECURITY POLICY Security.DepartmentFilter;
-- Filtre işlevini kaldırma
DROP FUNCTION Security.fn_securitypredicate;
Row Level Security, özellikle çok kiracılı uygulamalarda, veri gizliliği gerektiren sistemlerde ve karmaşık yetkilendirme ihtiyaçlarında oldukça kullanışlıdır. Doğru uygulandığında, uygulama kodunda yapılacak güvenlik kontrollerine gerek kalmadan veri erişim güvenliği sağlayabilir.
Başka makalede görüşmek dileğiyle..
Mallarını gece ve gündüz, gizli ve açık hayra sarfedenler var ya, onların mükâfatları allah katındadır. onlara korku yoktur, üzüntü de çekmezler. Bakara süresi 274. ayet