Sorszintű biztonság megvalósítása munkamenet-környezettel a Data API Builderben

Az SQL munkamenet-környezet funkciójával sorszintű biztonságot valósíthat meg a Data API Builderben.

Ábra arról, hogy a Data API Builder hogyan állíthatja be az SQL-munkamenet környezetét a sorszintű biztonság engedélyezéséhez.

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

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.

  1. Csatlakozzon az SQL-adatbázishoz az előnyben részesített ügyfél vagy eszköz használatával.

  2. Hozzon létre egy Revenues nevű táblát, amely id, category, revenue, és accessible_role oszlopokat 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  
    );
    GO
    
  3. Szúrjon be négy mintasort a Revenues táblázatba.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    

    Ebben a példában a accessible_role oszlop 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
  1. Tesztelje az adatokat egy egyszerű SELECT * lekérdezéssel.

    SELECT * FROM dbo.Revenues
    
  2. Hozzon 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));
    
  3. Hozzon létre egy, a függvény használatával elnevezett RevenuesSecurityPolicy biztonsá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.

  1. Hozzon létre egy tárolt eljárást, amely beolvassa a roles munkamenet 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.

  1. Hozzon létre egy új konfigurációt igaz értékre állítás --set-session-context közben.

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true \
        --auth.provider Simulator
    

    Ha 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ául roles). 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.

  1. Adjon hozzá egy új entitást a revenue táblához.dbo.Revenues

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "Authenticated:read"
    
  2. Indítsa el a Data API Builder eszközt.

    dab start
    
  3. A 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
    
  4. A végpont lekérdezése a tényleges szerepkör Oscarbeállításakor. Figyelje meg, hogy a szűrt eredmények csak a Oscar sorokat tartalmazzák.

    curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenue
    
  5. Ismételje meg a szerepkör Hannah haszná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.

  1. Csatlakozzon ismét az SQL Serverhez az előnyben részesített ügyfél vagy eszköz használatával.

  2. Futtassa a sp_set_session_context elemet, hogy manuálisan állítsa be a munkamenet-környezet roles jogcímét a Oscar statikus értékre.

    EXEC sp_set_session_context 'roles', 'Oscar';
    
  3. 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;  
    
  4. (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 true be 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 vonatkozik 1 .
  • 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.