Sorszintű biztonság

Csoporttagság vagy végrehajtási környezet használata az adatbázistáblák soraihoz való hozzáférés szabályozásához.

A sorszintű biztonság (RLS) egyszerűsíti a védelem megtervezését és kódolását. Lehetővé teszi, hogy korlátozásokat alkalmazzon az adatsor-hozzáférésre az alkalmazásban. Korlátozhatja például a felhasználó hozzáférését a részlege szempontjából releváns sorokra, vagy korlátozhatja az ügyfélhozzáférést csak a vállalata számára releváns adatokra.

A hozzáférés-korlátozási logika az adatbázis szintjén található, nem pedig egy másik alkalmazásréteg adataitól. Az adatbázis-rendszer minden alkalommal alkalmazza a hozzáférési korlátozásokat, amikor az adathozzáférést bármilyen szintről megkísérlik. Ez a logika a biztonsági rendszer felületének csökkentésével megbízhatóbbá és robusztusabbá teszi a biztonsági rendszert.

Az RLS lehetővé teszi, hogy hozzáférést biztosítson más alkalmazásokhoz és felhasználókhoz, csak a tábla egy bizonyos részére. Előfordulhat például, hogy a következőt szeretné:

  • Csak bizonyos feltételeknek megfelelő sorokhoz adjon hozzáférést
  • Adatok anonimizálása egyes oszlopokban
  • A fentiek mindegyike

Megjegyzés

Ha egy táblán engedélyezve van egy RLS-szabályzat, a hozzáférést teljes egészében a táblában definiált RLS-lekérdezés váltja fel. A hozzáférési korlátozás az összes felhasználóra vonatkozik, beleértve az adatbázis-rendszergazdákat és az RLS-létrehozót is. Az RLS-lekérdezésnek explicit módon tartalmaznia kell definíciókat az összes olyan felhasználótípushoz, akiknek hozzáférést szeretne adni.

További információ: A sorszintű biztonsági szabályzat kezelésének felügyeleti parancsai.

Tipp

Ezek a függvények gyakran hasznosak row_level_security lekérdezésekhez:

Korlátozások

  • Nincs korlátozva azon táblák száma, amelyeken a sorszintű biztonsági házirend konfigurálható.
  • A sorszintű biztonsági szabályzat nem konfigurálható külső táblákon.
  • Az RLS-szabályzat a következő körülmények között nem engedélyezhető egy táblán:

Példák

A Sales táblához való hozzáférés korlátozása

Egy nevű Salestáblában minden sor egy értékesítés részleteit tartalmazza. Az egyik oszlop tartalmazza az értékesítő nevét. Ahelyett, hogy az értékesítőnek hozzáférést ad az összes rekordhoz a táblában Sales, engedélyezze a sorszintű biztonsági házirendet, hogy csak olyan rekordokat adjon vissza, ahol az értékesítő az aktuális felhasználó:

Sales | where SalesPersonAadUser == current_principal()

Az e-mail-címet maszkolhatja is:

Sales | where SalesPersonAadUser == current_principal() | extend EmailAddress = "****"

Ha azt szeretné, hogy minden értékesítő lássa egy adott ország/régió összes értékesítését, a következőhöz hasonló lekérdezést adhat meg:

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))

Ha van egy olyan csoportja, amely tartalmazza a vezetőket, érdemes lehet hozzáférést adni nekik az összes sorhoz. Itt található a sorszintű biztonsági szabályzat lekérdezése.

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

Különböző adatok elérhetővé tétele különböző Microsoft Entra csoportok tagjai számára

Ha több Microsoft Entra csoportja van, és azt szeretné, hogy az egyes csoportok tagjai az adatok egy másik részhalmazát lássák, használja ezt a struktúrát egy RLS-lekérdezéshez.

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>)

Ugyanazt az RLS-függvényt alkalmazza több táblára

Először definiáljon egy függvényt, amely sztringparaméterként fogadja a tábla nevét, és az operátorral hivatkozik a table() táblára.

Például:

.create-or-alter function RLSForCustomersTables(TableName: string) {
    table(TableName)
    | ...
}

Ezután konfigurálja az RLS-t több táblán így:

.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')"

Hiba keletkezése jogosulatlan hozzáférés esetén

Ha azt szeretné, hogy a nem hitelesített tábla felhasználói hibaüzenetet kapjanak üres tábla visszaadása helyett, használja a függvényt assert() . Az alábbi példa bemutatja, hogyan állíthatja elő ezt a hibát egy RLS-függvényben:

.create-or-alter function RLSForCustomersTables() {
    MyTable
    | where assert(current_principal_is_member_of('aadgroup=mygroup@mycompany.com') == true, "You don't have access")
}

Ezt a megközelítést más példákkal is kombinálhatja. Például különböző eredményeket jeleníthet meg a különböző Microsoft Entra csoportokban lévő felhasználók számára, és mindenki másnak hibát okozhat.

A követő adatbázisokra vonatkozó engedélyek szabályozása

Az éles adatbázison konfigurált RLS-szabályzat a követő adatbázisokban is érvénybe lép. Nem konfigurálhat különböző RLS-szabályzatokat az éles és követő adatbázisokon. current_cluster_endpoint() Az RLS-lekérdezésben található függvénnyel azonban ugyanazt a hatást érheti el, mint a követő táblákban található különböző RLS-lekérdezések.

Például:

.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
}

Megjegyzés

A fenti RLS-függvénynek nincs semmilyen hatása a vezetőfürt lekérdezéseire. A követő fürtök lekérdezéseire gyakorolt teljesítményre csak a komplexitás DataForFollowerClusterslesz hatással.

További használati esetek

  • A telefonos ügyfélszolgálat ügyfélszolgálata a hívókat a társadalombiztosítási számuk több számjegyével azonosíthatja. Ezt a számot nem szabad teljes mértékben kitenni a támogatási személynek. A táblán RLS-szabályzat alkalmazható a társadalombiztosítási szám utolsó négy számjegyének maszkolására bármely lekérdezés eredményhalmazában.
  • Állítson be egy RLS-szabályzatot, amely elfedi a személyazonosításra alkalmas adatokat (PII), és lehetővé teszi a fejlesztők számára az éles környezetek hibaelhárítási célú lekérdezését anélkül, hogy megsértenék a megfelelőségi előírásokat.
  • A kórházak RLS-szabályzatot állíthatnak be, amely lehetővé teszi, hogy a nővérek csak a betegeik adatsorait tekintsék meg.
  • A bankok RLS-szabályzatot állíthatnak be, amely az alkalmazott üzleti részlege vagy szerepköre alapján korlátozza a pénzügyi adatsorokhoz való hozzáférést.
  • A több-bérlős alkalmazások több bérlőtől származó adatokat tárolhatnak egyetlen táblakészletben (ami hatékony). RLS-szabályzattal kényszerítenék ki az egyes bérlők adatsorainak logikai elkülönítését az összes többi bérlő soraitól, így minden bérlő csak az adatsorait láthatja.

A lekérdezések teljesítményre gyakorolt hatása

Ha egy táblán engedélyezve van egy RLS-szabályzat, akkor a tábla eléréséhez hozzáférő lekérdezések teljesítményre gyakorolt hatása lesz. A táblához való hozzáférést a táblában definiált RLS-lekérdezés váltja fel. Az RLS-lekérdezések teljesítményhatása általában két részből áll:

  • Tagság-ellenőrzések a Microsoft Entra ID: Az ellenőrzések hatékonyak. Több tíz vagy akár több száz csoportban is ellenőrizheti a tagságot anélkül, hogy ez jelentős hatással lenne a lekérdezési teljesítményre.
  • Az adatokra alkalmazott szűrők, illesztések és egyéb műveletek: A hatás a lekérdezés összetettségétől függ

Például:

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

Ha a felhasználó nem része a fájlnak some_group@domain.com, a IsRestrictedUser kiértékelése a következő lesz: false. A kiértékelt lekérdezés a következőhöz hasonló:

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

Hasonlóképpen, ha IsRestrictedUser a értéke true, akkor csak a lekérdezés PartialData lesz kiértékelve.

Lekérdezési teljesítmény javítása RLS használata esetén

A betöltési teljesítményre gyakorolt hatás

A betöltési teljesítmény nincs hatással a teljesítményre.