Satır düzeyi güvenlik ilkesi
Şunlar için geçerlidir: ✅Microsoft Fabric✅Azure Veri Gezgini
Veritabanı tablosundaki satırlara erişimi denetlemek için grup üyeliği veya yürütme bağlamı kullanın.
Satır Düzeyinde Güvenlik (RLS), güvenliğin tasarımını ve kodlamasını basitleştirir. Uygulamanızda veri satırı erişimine kısıtlamalar uygulamanıza izin verir. Örneğin, kullanıcı erişimini kendi departmanıyla ilgili satırlara sınırlayın veya müşteri erişimini yalnızca kendi şirketiyle ilgili verilerde kısıtlayın.
Erişim kısıtlama mantığı, başka bir uygulama katmanındaki verilerden uzakta değil, veritabanı katmanında bulunur. Veritabanı sistemi, herhangi bir katmandan her veri erişimi denenişinde erişim kısıtlamalarını uygular. Bu mantık, güvenlik sisteminizin yüzey alanını azaltarak güvenlik sisteminizi daha güvenilir ve sağlam hale getirir.
RLS, tablonun yalnızca belirli bir bölümüne diğer uygulamalara ve kullanıcılara erişim sağlamanıza olanak tanır. Örneğin, şunları yapmak isteyebilirsiniz:
- Yalnızca bazı ölçütleri karşılayan satırlara erişim verme
- Bazı sütunlardaki verileri anonimleştirme
- Yukarıdakilerin tümü
Not
Tabloda bir RLS ilkesi etkinleştirildiğinde, erişim tamamen tabloda tanımlanan RLS sorgusuyla değiştirilir. Erişim kısıtlaması, veritabanı yöneticileri ve RLS oluşturucusu da dahil olmak üzere tüm kullanıcılar için geçerlidir. RLS sorgusu, erişim vermek istediğiniz tüm kullanıcı türlerinin tanımlarını açıkça içermelidir.
Daha fazla bilgi için bkz . Satır Düzeyi Güvenlik ilkesini yönetmek için yönetim komutları.
İpucu
Bu işlevler genellikle row_level_security sorgular için kullanışlıdır:
Sınırlamalar
- Satır Düzeyi Güvenlik ilkesinin yapılandırılabildiği tablo sayısıyla ilgili bir sınır yoktur.
- Satır Düzeyi Güvenlik ilkesi Dış Tablolarda yapılandırılamaz.
- RLS ilkesi aşağıdaki koşullarda bir tabloda etkinleştirilemiyor:
- Güncelleştirme ilkesi sorgusu tarafından başvurulduğunda, güncelleştirme ilkesi yönetilen kimlikle yapılandırılmamışsa.
- Kimliğe bürünme dışında bir kimlik doğrulama yöntemi kullanan sürekli dışarı aktarma tarafından başvurulduğunda.
- Tablo için kısıtlanmış görünüm erişim ilkesi yapılandırıldığında.
- RLS sorgusu diğer veritabanlarında bulunan tablolara başvuramaz.
Örnekler
Sales tablosuna erişimi sınırlama
adlı Sales
tabloda her satır bir satışla ilgili ayrıntıları içerir. Sütunlardan biri satış temsilcisinin adını içerir. Satış temsilcilerinize içindeki Sales
tüm kayıtlara erişim vermek yerine, bu tabloda satır düzeyi güvenlik ilkesini etkinleştirerek yalnızca satış temsilcisinin geçerli kullanıcı olduğu kayıtları döndürebilir:
Sales | where SalesPersonAadUser == current_principal()
E-posta adresini de maskeleyebilirsiniz:
Sales | where SalesPersonAadUser == current_principal() | extend EmailAddress = "****"
Her satış sorumlusunun belirli bir ülkenin/bölgenin tüm satışlarını görmesini istiyorsanız, şuna benzer bir sorgu tanımlayabilirsiniz:
let UserToCountryMapping = datatable(User:string, Country:string)
[
"john@domain.com", "USA",
"anna@domain.com", "France"
];
Sales
| where Country in ((UserToCountryMapping | where User == current_principal_details()["UserPrincipalName"] | project Country))
Yöneticileri içeren bir grubunuz varsa, onlara tüm satırlara erişim vermek isteyebilirsiniz. Satır Düzeyi Güvenlik ilkesinin sorgusu aşağıdadır.
let IsManager = current_principal_is_member_of('aadgroup=sales_managers@domain.com');
let AllData = Sales | where IsManager;
let PartialData = Sales | where not(IsManager) and (SalesPersonAadUser == current_principal()) | extend EmailAddress = "****";
union AllData, PartialData
Farklı Microsoft Entra gruplarının üyelerine farklı veriler sunma
Birden çok Microsoft Entra grubunuz varsa ve her grubun üyelerinin farklı bir veri alt kümesi görmesini istiyorsanız, RLS sorgusu için bu yapıyı kullanın.
Customers
| where (current_principal_is_member_of('aadgroup=group1@domain.com') and <filtering specific for group1>) or
(current_principal_is_member_of('aadgroup=group2@domain.com') and <filtering specific for group2>) or
(current_principal_is_member_of('aadgroup=group3@domain.com') and <filtering specific for group3>)
Aynı RLS işlevini birden çok tabloya uygulama
İlk olarak, tablo adını dize parametresi olarak alan ve işlecini kullanarak tabloya table()
başvuran bir işlev tanımlayın.
Örneğin:
.create-or-alter function RLSForCustomersTables(TableName: string) {
table(TableName)
| ...
}
Ardından RLS'yi birden çok tabloda şu şekilde yapılandırın:
.alter table Customers1 policy row_level_security enable "RLSForCustomersTables('Customers1')"
.alter table Customers2 policy row_level_security enable "RLSForCustomersTables('Customers2')"
.alter table Customers3 policy row_level_security enable "RLSForCustomersTables('Customers3')"
Yetkisiz erişimde hata oluşturma
Kimliği doğrulanmamış tablo kullanıcılarının boş bir tablo döndürmek yerine hata almasını istiyorsanız işlevini kullanın assert()
. Aşağıdaki örnekte, bir RLS işlevinde bu hatayı nasıl oluşturabileceğiniz gösterilmektedir:
.create-or-alter function RLSForCustomersTables() {
MyTable
| where assert(current_principal_is_member_of('aadgroup=mygroup@mycompany.com') == true, "You don't have access")
}
Bu yaklaşımı diğer örneklerle birleştirebilirsiniz. Örneğin, farklı Microsoft Entra gruplarındaki kullanıcılara farklı sonuçlar görüntüleyebilir ve diğer herkes için bir hata oluşturabilirsiniz.
takipçi veritabanlarındaki izinleri denetleme
Üretim veritabanında yapılandırdığınız RLS ilkesi, takipçi veritabanlarında da geçerli olur. Üretim ve takipçi veritabanlarında farklı RLS ilkeleri yapılandıramazsınız. Ancak, aynı etkiyi current_cluster_endpoint()
elde etmek için RLS sorgunuzdaki işlevi kullanabilirsiniz; örneğin, takipçi tablolarında farklı RLS sorguları olabilir.
Örneğin:
.create-or-alter function RLSForCustomersTables() {
let IsProductionCluster = current_cluster_endpoint() == "mycluster.eastus.kusto.windows.net";
let DataForProductionCluster = TempTable | where IsProductionCluster;
let DataForFollowerClusters = TempTable | where not(IsProductionCluster) | extend EmailAddress = "****";
union DataForProductionCluster, DataForFollowerClusters
}
Not
Yukarıdaki RLS işlevinin öncü kümedeki sorgular üzerinde herhangi bir performans etkisi yoktur. Takipçi kümelerindeki sorgular üzerindeki performans etkisi yalnızca karmaşıklığından DataForFollowerClusters
etkilenecektir.
Kısayol veritabanlarındaki izinleri denetleme
Üretim veritabanında yapılandırdığınız RLS ilkesi, kısayol veritabanlarında da geçerli olur. Üretim ve kısayol veritabanlarında farklı RLS ilkeleri yapılandıramazsınız. Bununla birlikte, RLS sorgunuzdaki current_cluster_endpoint()
işlevi kullanarak kısayol tablolarında farklı RLS sorguları olmasıyla aynı etkiyi elde edebilirsiniz.
Örneğin:
.create-or-alter function RLSForCustomersTables() {
let IsProductionCluster = current_cluster_endpoint() == "mycluster.eastus.kusto.windows.net";
let DataForProductionCluster = TempTable | where IsProductionCluster;
let DataForFollowerClusters = TempTable | where not(IsProductionCluster) | extend EmailAddress = "****";
union DataForProductionCluster, DataForFollowerClusters
}
Not
Yukarıdaki RLS işlevinin kaynak veritabanındaki sorgular üzerinde herhangi bir performans etkisi yoktur. Kısayol veritabanlarındaki sorgular üzerindeki performans etkisi yalnızca karmaşıklığından etkilenecektir DataForFollowerClusters
.
Diğer kullanım örnekleri
- Bir çağrı merkezi destek görevlisi, arayanları sosyal güvenlik numarasının birkaç rakamı ile tanımlayabilir. Bu numara, destek görevlisine tam olarak açık olmamalıdır. Herhangi bir sorgunun sonuç kümesindeki sosyal güvenlik numarasının son dört basamağını maskelemek için tabloya bir RLS ilkesi uygulanabilir.
- Kişisel bilgileri (PII) maskeleyen ve geliştiricilerin uyumluluk düzenlemelerini ihlal etmeden sorun giderme amacıyla üretim ortamlarını sorgulamasına olanak tanıyan bir RLS ilkesi ayarlayın.
- Bir hastane, hemşirelerin yalnızca hastalarının veri satırlarını görüntülemesine olanak tanıyan bir RLS ilkesi ayarlayabilir.
- Banka, bir çalışanın iş bölümüne veya rolüne göre finansal veri satırlarına erişimi kısıtlamak için bir RLS ilkesi ayarlayabilir.
- Çok kiracılı bir uygulama, birçok kiracıdan gelen verileri tek bir tablo kümesinde depolayabilir (bu verimlidir). Her kiracının veri satırlarının diğer kiracı satırlarından mantıksal ayrımını zorunlu kılmak için bir RLS ilkesi kullanır, böylece her kiracı yalnızca veri satırlarını görebilir.
Sorgular üzerindeki performans etkisi
Bir tabloda RLS ilkesi etkinleştirildiğinde, bu tabloya erişen sorgular üzerinde bazı performans etkileri olacaktır. Tabloya erişim, bu tabloda tanımlanan RLS sorgusuyla değiştirilir. RLS sorgusunun performans etkisi normalde iki bölümden oluşur:
- Microsoft Entra Id' de üyelik denetimleri: Denetimler verimlidir. Sorgu performansı üzerinde önemli bir etki yaratmadan onlarca, hatta yüzlerce grupta üyeliği de kontrol edebilirsiniz.
- Verilere uygulanan filtreler, birleşimler ve diğer işlemler: Etki, sorgunun karmaşıklığına bağlıdır
Örneğin:
let IsRestrictedUser = current_principal_is_member_of('aadgroup=some_group@domain.com');
let AllData = MyTable | where not(IsRestrictedUser);
let PartialData = MyTable | where IsRestrictedUser and (...);
union AllData, PartialData
Kullanıcı öğesinin some_group@domain.comIsRestrictedUser
bir parçası değilse, olarak değerlendirilirfalse
. Değerlendirilen sorgu şuna benzer:
let AllData = MyTable; // the condition evaluates to `true`, so the filter is dropped
let PartialData = <empty table>; // the condition evaluates to `false`, so the whole expression is replaced with an empty table
union AllData, PartialData // this will just return AllData, as PartialData is empty
Benzer şekilde, olarak değerlendirilirse IsRestrictedUser
true
yalnızca için PartialData
sorgu değerlendirilir.
RLS kullanıldığında sorgu performansını geliştirme
- DeviceID gibi yüksek kardinaliteli bir sütuna filtre uygulanmışsa Bölümleme ilkesini veya Satır Sırası ilkesini kullanmayı göz önünde bulundurun
- Düşük-orta kardinalite sütununa filtre uygulanmışsa, Satır Sırası ilkesini kullanmayı göz önünde bulundurun
Veri alımı üzerindeki performans etkisi
Alım üzerinde performans etkisi yoktur.