Zásady zabezpečení na úrovni řádků
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer
Pomocí členství ve skupině nebo kontextu provádění můžete řídit přístup k řádkům v tabulce databáze.
Zabezpečení na úrovni řádků (RRLS) zjednodušuje návrh a kódování zabezpečení. Umožňuje použít omezení přístupu k datovým řádkům v aplikaci. Můžete například omezit přístup uživatelů k řádkům relevantním pro jejich oddělení nebo omezit přístup zákazníků jenom na data relevantní pro svoji společnost.
Logika omezení přístupu se nachází v databázové vrstvě, nikoli mimo data v jiné aplikační vrstvě. Databázový systém použije omezení přístupu při každém pokusu o přístup k datům z libovolné vrstvy. Díky této logice je systém zabezpečení spolehlivější a robustnější tím, že sníží plochu systému zabezpečení.
Zabezpečení na úrovni řádků umožňuje poskytovat přístup k jiným aplikacím a uživatelům jenom k určité části tabulky. Můžete například chtít:
- Udělení přístupu pouze k řádkům, které splňují určitá kritéria
- Anonymizace dat v některých sloupcích
- Všechny výše uvedené možnosti
Poznámka:
Pokud je v tabulce povolená zásada zabezpečení na úrovni řádků, je přístup zcela nahrazen dotazem RLS definovaným v tabulce. Omezení přístupu platí pro všechny uživatele, včetně správců databází a tvůrce zabezpečení na úrovni řádků. Dotaz RLS musí explicitně obsahovat definice pro všechny typy uživatelů, kterým chcete udělit přístup.
Další informace najdete v tématu příkazy pro správu zásad zabezpečení na úrovni řádků.
Tip
Tyto funkce jsou často užitečné pro dotazy row_level_security:
Omezení
- Počet tabulek, na kterých je možné nakonfigurovat zásady zabezpečení na úrovni řádků, není nijak omezený.
- Zásady zabezpečení na úrovni řádků nelze konfigurovat u externích tabulek.
- Zásady zabezpečení na úrovni řádků není možné v tabulce povolit za následujících okolností:
- Když na něj odkazuje dotaz zásad aktualizace, zatímco zásady aktualizace nejsou nakonfigurované se spravovanou identitou.
- Pokud na něj odkazuje průběžný export, který používá jinou metodu ověřování než zosobnění.
- Pokud je pro tabulku nakonfigurovaná zásada přístupu s omezeným zobrazením.
Příklady
Omezení přístupu k tabulce Sales
V tabulce s názvem Sales
obsahuje každý řádek podrobnosti o prodeji. Jeden ze sloupců obsahuje název prodejce. Místo toho, aby prodejci měli přístup ke všem záznamům v Sales
této tabulce, povolte v této tabulce zásady zabezpečení na úrovni řádků, aby vracely jenom záznamy, ve kterých je prodejce aktuálním uživatelem:
Sales | where SalesPersonAadUser == current_principal()
E-mailovou adresu můžete také maskovat:
Sales | where SalesPersonAadUser == current_principal() | extend EmailAddress = "****"
Pokud chcete, aby každý prodejce viděl všechny prodeje v konkrétní zemi nebo oblasti, můžete definovat dotaz podobný dvěma účelům:
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))
Pokud máte skupinu, která obsahuje správce, můžete jim dát přístup ke všem řádkům. Tady je dotaz na zásady zabezpečení na úrovni řádků.
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
Zveřejnění různých dat členům různých skupin Microsoft Entra
Pokud máte více skupin Microsoft Entra a chcete, aby členové každé skupiny viděli jinou podmnožinu dat, použijte tuto strukturu pro dotaz RLS.
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>)
Použití stejné funkce RLS u více tabulek
Nejprve definujte funkci, která přijímá název tabulky jako řetězcový parametr a odkazuje na tabulku pomocí operátoru table()
.
Příklad:
.create-or-alter function RLSForCustomersTables(TableName: string) {
table(TableName)
| ...
}
Pak nakonfigurujte zabezpečení na úrovni řádků na více tabulkách tímto způsobem:
.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')"
Vytvoření chyby při neoprávněném přístupu
Pokud chcete, aby se uživatelům neověřené tabulky místo vrácení prázdné tabulky zobrazila chyba, použijte assert()
funkci. Následující příklad ukazuje, jak vytvořit tuto chybu ve funkci RLS:
.create-or-alter function RLSForCustomersTables() {
MyTable
| where assert(current_principal_is_member_of('aadgroup=mygroup@mycompany.com') == true, "You don't have access")
}
Tento přístup můžete kombinovat s dalšími příklady. Můžete například zobrazit různé výsledky uživatelům v různých skupinách Microsoft Entra a vyvolat chybu pro všechny ostatní.
Řízení oprávnění pro následující databáze
Zásady zabezpečení na úrovni řádků, které nakonfigurujete v produkční databázi, se projeví také v následných databázích. V produkčních a následných databázích nemůžete nakonfigurovat různé zásady zabezpečení na úrovni řádků. Pomocí funkce v dotazu na zabezpečení na úrovni řádků ale můžete current_cluster_endpoint()
dosáhnout stejného efektu jako použití různých dotazů RLS v následujících tabulkách.
Příklad:
.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
}
Poznámka:
Výše uvedená funkce zabezpečení na úrovni řádků nemá žádný vliv na výkon dotazů v clusteru vedoucího serveru. Dopad na výkon dotazů na následující clustery bude mít vliv pouze na složitost DataForFollowerClusters
.
Řízení oprávnění pro místní databáze
Zásady zabezpečení na úrovni řádků, které nakonfigurujete v produkční databázi, se projeví také v místních databázích. V produkčních a místních databázích nemůžete konfigurovat různé zásady zabezpečení na úrovni řádků. Pomocí funkce v dotazu na zabezpečení na úrovni řádků ale můžete current_cluster_endpoint()
dosáhnout stejného efektu, jako když máte různé dotazy na zabezpečení na úrovni řádků v místních tabulkách.
Příklad:
.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
}
Poznámka:
Výše uvedená funkce zabezpečení na úrovni řádků nemá žádný vliv na výkon dotazů ve zdrojové databázi. Dopad na výkon dotazů na klávesové zkratky bude mít vliv pouze na složitost DataForFollowerClusters
.
Další případy použití
- Pracovník podpory call centra může volajícího identifikovat několika číslicemi čísla sociálního pojištění. Toto číslo by nemělo být plně vystaveno osobě podpory. Zásady zabezpečení na úrovni řádků lze v tabulce použít k maskování všech čtyř číslic čísla sociálního pojištění v sadě výsledků libovolného dotazu.
- Nastavte zásadu zabezpečení na úrovni řádků, která maskuje identifikovatelné osobní údaje (PII) a umožňuje vývojářům dotazovat se do produkčních prostředí pro účely řešení potíží bez porušení předpisů o dodržování předpisů.
- Nemocnice může nastavit zásady zabezpečení na úrovni řádků, které zdravotní sestram umožňují zobrazit pouze řádky dat pro své pacienty.
- Banka může nastavit zásadu zabezpečení na úrovni řádků, která omezí přístup k řádkům finančních dat na základě obchodní divize nebo role zaměstnance.
- Aplikace s více tenanty může ukládat data z mnoha tenantů do jedné sady tabulek (což je efektivní). Pomocí zásad zabezpečení na úrovni řádků (RLS) by vynucovali logické oddělení řádků dat každého tenanta od řádků každého druhého tenanta, aby každý tenant viděl jenom jeho datové řádky.
Dopad na výkon dotazů
Pokud je v tabulce povolená zásada zabezpečení na úrovni řádků, bude mít vliv na výkon dotazů, které k této tabulce přistupují. Přístup k tabulce se nahradí dotazem RLS definovaným v této tabulce. Dopad na výkon dotazu na zabezpečení na úrovni řádků se obvykle skládá ze dvou částí:
- Kontroly členství v Microsoft Entra ID: Kontroly jsou efektivní. Můžete zkontrolovat členství v desítkách nebo i stovkách skupin, aniž by to mělo velký dopad na výkon dotazů.
- Filtry, spojení a další operace použité na data: Dopad závisí na složitosti dotazu.
Příklad:
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
Pokud uživatel není součástí some_group@domain.com, vyhodnotí IsRestrictedUser
se na false
hodnotu . Vyhodnocený dotaz se podobá tomuto:
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
Podobně platí, že pokud IsRestrictedUser
se vyhodnotí jako true
, bude vyhodnocen pouze dotaz pro PartialData
.
Zlepšení výkonu dotazů při použití zabezpečení na úrovni řádků
- Pokud se filtr použije ve sloupci s vysokou kardinalitou, například ID zařízení, zvažte použití zásad dělení nebo zásad pořadí řádků.
- Pokud se filtr použije u sloupce s nízkou kardinalitou, zvažte použití zásad pořadí řádků.
Dopad na výkon při příjmu dat
Příjem dat nemá žádný vliv na výkon.