SQL Server 2016 ile duyurulmuş olan satır seviyesinde güvenlik uygulaması kullanıcıların sadece yetkileri oldukları satırlara erişmesini sağlar.
Birçok kullanıcının aynı veri tabanını kullandığı ortamlarda kullanıcılar tablolarda sadece kendilerine ait bilgileri filtreleyerek eriştirmemizi sağlar.
Önemli bir uygulama olan RLS veri tabanı katmanında çalışır. Herhangi bir uygulamadan veriye erişim sağlanmak istendiğinde erişim kısıtlamaları uygulanır. Böylelikle daha iyi bir güvenlik katmanı sağlanır.
RLS Uygulaması:
Veri tabanıma ürün satışları ile ilgili bir tablo oluşturuyorum.
1 2 3 4 5 6 |
CREATE TABLE UrunSatis ( ID INT IDENTITY(1,1) PRIMARY KEY, Kisi NVARCHAR(10), Ulke NVARCHAR(10), SatisMiktari DECIMAL(10, 2) ); |
Satış tabloma satışlardan sorumlu personelin adı, satışın yapıldığı ülke ve miktarı giriyorum.
1 2 3 4 5 6 7 |
INSERT INTO UrunSatis (Kisi, Ulke, SatisMiktari) VALUES ('User1', 'Türkiye', 680), ('User3', 'USA', 1200), ('User2', 'Germany', 2300), ('User1', 'Türkiye', 750), ('User3', 'USA', 1100), ('User2', 'Germany', 790); |
Bu satırlardan yer alan kişilerin sadece kendi satış bilgilerini görmelerini sağalacağım.
Üç kullanıcı için hesap oluşturuyorum.
1 2 3 |
CREATE USER User1 WITHOUT LOGIN; CREATE USER User2 WITHOUT LOGIN; CREATE USER User3 WITHOUT LOGIN; |
Kullanıcılara tablodan veri çekmek yetkisi veriyorum.
1 2 3 |
GRANT SELECT ON UrunSatis TO User1; GRANT SELECT ON UrunSatis TO User2; GRANT SELECT ON UrunSatis TO User3; |
Satırları kullanıcıya göre filtreleyen bir fonksiyon oluşturuyorum.
1 2 3 4 5 6 |
CREATE FUNCTION dbo.fn_SalesSecurity(@Kisi AS sysname) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_SalesSecurity_Sonuc WHERE @Kisi = USER_NAME(); |
Son olarak ise bir güvenlik politikası oluşturuyorum. Bu politika tabloya her erişimde filtrelemeyi zorunlu olarak uygulayacaktır.
1 2 3 4 |
CREATE SECURITY POLICY SatisGüvenlikPolitikasi ADD FILTER PREDICATE dbo.fn_SalesSecurity(Kisi) ON dbo.UrunSatis WITH (STATE = ON); |
Bu aşamadan son kullanıcılar (User1,User2 ve User3) sadece kendi verilerini görebilirler.
1 2 3 |
EXECUTE AS USER = 'User1'; SELECT * FROM UrunSatis; REVERT; |
1 2 3 |
EXECUTE AS USER = 'User2'; SELECT * FROM UrunSatis; REVERT; |
1 2 3 |
EXECUTE AS USER = 'User3'; SELECT * FROM UrunSatis; REVERT; |
Sorgunun planına baktığımızda “predicates” bölümünde filtreyi görmekteyiz.
Güvenlik politikasını aşağıdaki komut ile devre dışı bırakabiliriz.
Alter Security Policy SatisGuvenlikPolitikasi with (State = off)
Fonksiyona farklı değişkenler de ekleyebiliriz. Örneğin son yılın verisini gözükmesini isteyebiliriz.
1 2 3 4 5 6 7 |
CREATE FUNCTION dbo.fn_SalesSecurity(@Kisi AS sysname) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_SalesSecurity_Sonuc WHERE @Kisi = USER_NAME(); AND @tarih = getdate() -365 |
İşlemleri geri almak için fonksiyon ve güvenlik politikası silinebilir.
1 2 |
DROP SECURITY POLICY SatisGuvenlikPolitikasi; DROP FUNCTION dbo.fn_SalesSecurity; |
Kaynak: