Sdílet prostřednictvím


Zásady zabezpečení na úrovni řádků

Platí pro: ✅Microsoft FabricAzure 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í:

Příklady

Omezení přístupu k tabulce Sales

V tabulce s názvem Salesobsahuje 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 Salesté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 falsehodnotu . 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ů

Dopad na výkon při příjmu dat

Příjem dat nemá žádný vliv na výkon.