Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az SQL munkamenet-környezet funkciójával sorszintű biztonságot valósíthat meg a Data API Builderben.
Fontos
Az SQL Server sorszintű biztonsági munkamenet-környezete eltér a Data API Builder adatbázis-szabályzataitól. Az adatbázis-szabályzatokat (például --policy-database "@item.owner eq @claims.user_id") a Data API Builder WHERE záradékokra fordítja le, míg a munkamenet-környezet a jogcímeket az SQL Servernek továbbítja, hogy az SQL-natív sorszintű biztonság kezelje a szűrést.
Jótanács
A DAB 2.0-s és újabb verziói szintén támogatják az On-Behalf-Of (OBO) felhasználó által delegált hitelesítést SQL Server esetében, amely a bejövő felhasználói jogkivonatot egy alsóbb rétegbeli SQL-jogkivonatra cseréli, így az adatbázis tényleges hívó felhasználóként hitelesíti magát. Az OBO lehetővé teszi a valós felhasználói identitástól függő sorszintű biztonsági szabályzatokat. További információkért tekintse meg a felhasználó által delegált hitelesítést és az újdonságokat.
Előfeltételek
- Meglévő SQL-kiszolgáló és -adatbázis.
- Adat API-építő CLI. A parancssori felület telepítése
Megjegyzés:
A munkamenet környezet az alábbiakban támogatott:
- SQL Server 2016 és újabb verziók
- Azure SQL Database
- Azure Synapse Analytics (dedikált SQL-készlet)
- Az Azure Synapse Analytics (kiszolgáló nélküli SQL-készlet) nem támogatott
SQL-tábla és -adatok létrehozása
Hozzon létre egy táblát fiktív adatokkal, amelyet ebben a példaforgatókönyvben használhat.
Csatlakozzon az SQL-adatbázishoz az előnyben részesített ügyfél vagy eszköz használatával.
Hozzon létre egy
Revenuesnevű táblát, amelyid,category,revenue, ésaccessible_roleoszlopokat tartalmaz.DROP TABLE IF EXISTS dbo.Revenues; CREATE TABLE dbo.Revenues( id int PRIMARY KEY, category varchar(max) NOT NULL, revenue int, accessible_role varchar(max) NOT NULL ); GOSzúrjon be négy mintasort a
Revenuestáblázatba.INSERT INTO dbo.Revenues VALUES (1, 'Book', 5000, 'Oscar'), (2, 'Comics', 10000, 'Oscar'), (3, 'Journals', 20000, 'Hannah'), (4, 'Series', 40000, 'Hannah') GOEbben a példában a
accessible_roleoszlop tárolja a sorhoz hozzáférő szerepkör nevét.
Jótanács
Gyakori munkamenet-környezethasználati esetek:
- Szerepköralapú szűrés (itt látható)
roles - Több-bérlős szeparáció a
tenant_id - Felhasználóspecifikus szűrés a következő használatával:
user_id
Tesztelje az adatokat egy egyszerű
SELECT *lekérdezéssel.SELECT * FROM dbo.RevenuesHozzon létre egy nevű függvényt
RevenuesPredicate. Ez a függvény az aktuális munkamenet-környezet alapján szűri az eredményeket.CREATE FUNCTION dbo.RevenuesPredicate(@accessible_role varchar(max)) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @accessible_role = CAST(SESSION_CONTEXT(N'roles') AS varchar(max));Hozzon létre egy, a függvény használatával elnevezett
RevenuesSecurityPolicybiztonsági szabályzatot.CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(accessible_role) ON dbo.Revenues;
Megjegyzés:
A WITH SCHEMABINDING záradék a biztonsági szabályzatokban használt függvényekhez szükséges, így a mögöttes sémamódosítások nem érvényteleníti a predikátumot.
(Nem kötelező) Tárolt eljárás létrehozása
Ez a szakasz egy egyszerű "hello world" mintát mutat be a munkamenet-környezet értékeinek közvetlen T-SQL-ben való használatára.
Hozzon létre egy tárolt eljárást, amely beolvassa a
rolesmunkamenet környezeti értékét, és az eredmények szűrésére használja.CREATE OR ALTER PROCEDURE dbo.GetRevenuesForCurrentRole AS BEGIN SET NOCOUNT ON; DECLARE @role varchar(max) = CAST(SESSION_CONTEXT(N'roles') AS varchar(max)); SELECT id, category, revenue, accessible_role FROM dbo.Revenues WHERE accessible_role = @role; END GO
Eszköz futtatása
Futtassa a Data API Builder (DAB) eszközt egy konfigurációs fájl létrehozásához és egy entitás generálásához.
Hozzon létre egy új konfigurációt igaz értékre állítás
--set-session-contextközben.dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" \ --set-session-context true \ --auth.provider SimulatorHa a munkamenet-környezet engedélyezve van az SQL Serverhez, a Data API Builder hitelesített felhasználói jogcímeket küld az SQL-nek hívással
sp_set_session_context(példáulroles). A munkamenet-környezet engedélyezése az adatforrás esetében is letiltja a válasz gyorsítótárazását.
Figyelmeztetés
Ha set-session-context engedélyezve van, a válasz gyorsítótárazása le van tiltva az adatforrás számára. Nagy forgalmú forgatókönyvek esetén fontolja meg a teljesítmény tesztelését, a predikátumoszlop indexelését vagy a Data API Builder adatbázis-szabályzatainak használatát, ha megfelelnek az igényeinek.
Adjon hozzá egy új entitást a
revenuetáblához.dbo.Revenuesdab add revenue \ --source "dbo.Revenues" \ --permissions "Authenticated:read"Indítsa el a Data API Builder eszközt.
dab startA végpont lekérdezése hatékony szerepkör megadása nélkül. Figyelje meg, hogy a függvény nem ad vissza adatokat, mert:
- Az érvényes szerepkör alapértelmezés szerint a következő.
Authenticated - Egyetlen sor sem rendelkezik
accessible_role = 'Authenticated'. - A biztonsági szabályzat akkor szűri az eredményeket, ha a szerepkör nem egyezik.
curl http://localhost:5000/api/revenue- Az érvényes szerepkör alapértelmezés szerint a következő.
A végpont lekérdezése a tényleges szerepkör
Oscarbeállításakor. Figyelje meg, hogy a szűrt eredmények csak aOscarsorokat tartalmazzák.curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenueIsmételje meg a szerepkör
Hannahhasználatával.curl -H "X-MS-API-ROLE: Hannah" http://localhost:5000/api/revenue
Tesztelés a GraphQL használatával
A munkamenet-környezet a GraphQL-lekérdezésekkel is működik.
query {
revenues {
items {
id
category
revenue
accessible_role
}
}
}
Adja át a szerep fejlécet:
curl -X POST http://localhost:5000/graphql \
-H "Content-Type: application/json" \
-H "X-MS-API-ROLE: Oscar" \
-d '{"query": "{ revenues { items { id category revenue accessible_role } } }"}'
Mit küld a Data API Builder az SQL Servernek?
Ha engedélyezve van a munkamenet-környezet, a Data API Builder minden kéréshez beállítja a munkamenet-környezeti értékeket a lekérdezés végrehajtása előtt.
EXEC sp_set_session_context 'roles', 'Oscar', @read_only = 0;
-- Then executes your query
SELECT * FROM dbo.Revenues;
A rendszer az összes hitelesített felhasználói jogcímet kulcs-érték párként küldi el. A gyakori jogcímek közé tartoznak az roles, sub vagy oid, és az identitásszolgáltatótól származó egyéni jogcímek.
Tesztelés SQL-ben
Tesztelje közvetlenül az SQL-ben a szűrőt és a predikátumot, hogy biztosan működjön.
Csatlakozzon ismét az SQL Serverhez az előnyben részesített ügyfél vagy eszköz használatával.
Futtassa a
sp_set_session_contextelemet, hogy manuálisan állítsa be a munkamenet-környezetrolesjogcímét aOscarstatikus értékre.EXEC sp_set_session_context 'roles', 'Oscar';Futtasson egy tipikus
SELECT *lekérdezést. Figyelje meg, hogy az eredmények automatikusan szűrve lesznek a predikátum használatával.SELECT * FROM dbo.Revenues;(Nem kötelező) A tábla lekérdezése a tárolt eljárással.
EXEC dbo.GetRevenuesForCurrentRole;
Erőforrások tisztítása
Ha el szeretné távolítani a mintaobjektumokat, futtassa a következőt:
DROP SECURITY POLICY IF EXISTS dbo.RevenuesSecurityPolicy;
DROP FUNCTION IF EXISTS dbo.RevenuesPredicate;
DROP PROCEDURE IF EXISTS dbo.GetRevenuesForCurrentRole;
DROP TABLE IF EXISTS dbo.Revenues;
Hibaelhárítás
-
Nincsenek visszaadott eredmények: Ellenőrizze, hogy a biztonsági szabályzat aktív-e (
SELECT * FROM sys.security_policies), ellenőrizze a munkamenet környezeti értékét (SELECT SESSION_CONTEXT(N'roles')), és ellenőrizze, hogy--set-session-context truebe van-e állítva a Data API Builder konfigurációja. -
Minden visszaadott sor: Győződjön meg arról, hogy a biztonsági szabályzat nincs letiltva (
WITH STATE = OFF), és hogy a predikátum csak az engedélyezett sorokra vonatkozik1. -
Teljesítményproblémák: Indexelje a predikátum oszlopot (
accessible_role), és fontolja meg a szabályzat ideiglenes letiltását a teljesítményeffektus elkülönítése érdekében.