Jogosult felhasználó és munkamenet-felhasználó

A következőkre vonatkozik:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet Databricks Runtime

Ha Azure Databricks SQL-utasítást futtat, két különböző felhasználót követ nyomon:

  • Munkamenet-felhasználó: az a felhasználó, aki Azure Databricks csatlakozik, és kiadta az utasítást. A munkamenet-felhasználó az SQL-kapcsolat élettartamára van javítva. Az utasítás futása közben nem változik, még akkor sem, ha az utasítás nézetekbe, SQL UDF-ekbe vagy tárolt eljárásokba kerül.
  • Jogosult felhasználó: az a felhasználó, akinek a jogosultságait ellenőrzi a rendszer, amikor az aktuálisan végrehajtó utasítás beolvassa vagy írja az objektumokat. A jogosult felhasználó módosíthatja a végrehajtás során a nézettörzset, az SQL UDF-törzset vagy az eljárás törzsét SQL SECURITY DEFINER .

A session_user függvény visszaadja a munkamenet-felhasználót.

Warning

A current_user és a felhasználói függvények olyan aliasok, amelyek a munkamenet felhasználóját is visszaadják, nem pedig a jogosult felhasználót. A standard SQL-ben a jogosult felhasználót adja vissza, CURRENT_USER Azure Databricks nem. A session_user használatával explicit módon hivatkozhat a munkamenet-felhasználóra.

A jogosult felhasználó fejlődése

A nézet, az SQL UDF vagy a tárolt eljárás minden egyes meghívása új bejegyzést küld a hívásverembe. Az utasítás jogosult felhasználóját a tulajdonost javító legfelső verembejegyzés határozza meg:

Objektum Jogosult felhasználó a törzsben
View A nézet tulajdonosa
SQL UDF A függvény tulajdonosa
CREATE PROCEDURE ... SQL SECURITY DEFINER Az eljárás tulajdonosa (definiáló)
CREATE PROCEDURE ... SQL SECURITY INVOKER A hívási utasítás jogosult felhasználója (örökölt)

A nézetek, az SQL UDF-ek és SQL SECURITY DEFINER az eljárások a jogosult felhasználót a tulajdonosukra állítják a törzs összes utasításához. Egy SQL SECURITY INVOKER eljárás örökli a jogosult felhasználót a hívójától.

Amikor egy törzs befejezi a végrehajtást, és a vezérlés visszakerül a hívóhoz, a jogosult felhasználó visszaugrik a hívás helyszínére.

Ezzel szemben a munkamenet-felhasználó soha nem változik egyetlen kapcsolat során. SQL SECURITY DEFINER Az eljárás törzsében session_user() továbbra is az eredeti utasítást kiadó felhasználót adja vissza.

Az egyes rétegekben ellenőrzött jogosultságok

Azure Databricks jogosultságokat ellenőriz a jogosult felhasználóval a végrehajtás minden egyes rétegében:

  • A munkamenet-felhasználónak meg kell tartania EXECUTE a legfelső szintű eljárást vagy függvényt, valamint SELECT a felső szintű nézetet. A munkamenet-felhasználónak rendelkeznie USE CATALOG kell a szülőtárolókkal is USE SCHEMA .
  • SQL SECURITY INVOKER Az eljárás törzsén belül minden utasítás a munkamenet-felhasználó jogosultságait használja, beleértve a más rutinokra irányuló beágyazott EXECUTE hívásokat is.
  • Egy SQL SECURITY DEFINER eljárástörzsben, egy nézettörzsben vagy egy SQL UDF-törzsben minden utasítás a tulajdonos jogosultságait használja. A munkamenet-felhasználónak csak a külső rutin meghívásához van szüksége jogosultságra, a törzshivatkozások objektumaihoz nem.

Példa

Ez a példa különböző felhasználók nézeteit, SQL UDF-eit és tárolt eljárásait láncolják. Az egyes rétegek az alábbi rétegből olvasnak, így az engedélyezés végigjárja a teljes vermet. A példa három felhasználót (Athos, Porthos és Aramis) használ, és nyomon követi, hogy mi történik, amikor Aramis, aki csak a legfelső szintű eljárásokhoz fér hozzá, meghívja a láncot.

Setup

Az Athos létrehoz egy kétoszlopos táblát, és olvasási hozzáférést biztosít a Porthosnak:

-- Run as Athos.
> CREATE TABLE t(a INT, b INT);
> INSERT INTO t VALUES (1, 10), (2, 20), (3, 30);

> GRANT SELECT ON TABLE t TO `porthos@musketeers.fr`;

A Porthos létrehoz egy nézetet az Athos táblája felett, és olvasási hozzáférést biztosít az Athosnak a nézetben:

-- Run as Porthos.
> CREATE VIEW v_p AS
    SELECT a, b * 100 AS b100 FROM t;

> GRANT SELECT ON VIEW v_p TO `athos@musketeers.fr`;

Az Athos létrehoz egy SQL UDF-t, amely a Porthos nézetéből olvas, és porthosot EXECUTE ad hozzá:

-- Run as Athos.
> CREATE FUNCTION f_a(p INT) RETURNS INT
    RETURN (SELECT b100 FROM v_p WHERE a = p);

> GRANT EXECUTE ON FUNCTION f_a TO `porthos@musketeers.fr`;

A Porthos létrehoz egy SQL UDF-t, amely összesíti az Athos UDF-jének eredményeit, és egy SQL SECURITY DEFINER olyan eljárást, amely közzéteszi az eredményt:

-- Run as Porthos.
> CREATE FUNCTION f_p() RETURNS INT
    RETURN f_a(1) + f_a(2) + f_a(3);

> CREATE PROCEDURE p_def()
    LANGUAGE SQL
    SQL SECURITY DEFINER
    AS BEGIN
      SELECT f_p();
    END;

Az Athos létrehoz egy SQL SECURITY INVOKER eljárást, amely meghívja a Porthos eljárását:

-- Run as Athos.
> CREATE PROCEDURE p_inv()
    LANGUAGE SQL
    SQL SECURITY INVOKER
    AS BEGIN
      CALL p_def();
    END;

Végül Athos és Porthos megadják Aramisnak, hogy mire van szüksége a lánc meghívásához. Mivel p_inv ez egy SQL SECURITY INVOKER eljárás, a törzse az azt (Aramis) nevező felhasználóként fut, így az Aramisnak egymástól függetlenül kell rendelkeznie EXECUTE a következővel p_def:

-- Run as Athos.
> GRANT EXECUTE ON PROCEDURE p_inv TO `aramis@musketeers.fr`;

-- Run as Porthos.
> GRANT EXECUTE ON PROCEDURE p_def TO `aramis@musketeers.fr`;

Az Aramis nem rendelkezik jogosultságokkal az t, f_a, v_pvagy f_p.

Az Aramis meghívja a láncot

Aramis-problémák:

-- Run as Aramis.
> CALL p_inv();

A híváslánc az alábbiak szerint bontakozik ki, és mindegyik nyíl egy új törzsbe lép:

Aramis's session
   │
   │ CALL
   ▼
p_inv()      (Athos, SQL SECURITY INVOKER)
   │
   │ CALL
   ▼
p_def()      (Porthos, SQL SECURITY DEFINER)
   │
   │ SELECT
   ▼
f_p()        (Porthos's SQL UDF)
   │
   │ invokes
   ▼
f_a(p)       (Athos's SQL UDF)
   │
   │ SELECT
   ▼
v_p          (Porthos's view)
   │
   │ SELECT
   ▼
t            (Athos's table)

Az alábbi táblázat végigvezeti az utasításokat a végrehajtás során.

Step Statement A futtatás helye Jogosult felhasználó session_user()
1 CALL p_inv() Aramis előadása Aramis Aramis
2 CALL p_def() Törzse p_inv (SQL SECURITY INVOKER) Aramis (a hívótól örökölt) Aramis
3 SELECT f_p() Törzse p_def (SQL SECURITY DEFINER) Porthos (eljárás tulajdonosa) Aramis
4 RETURN f_a(1) + f_a(2) + f_a(3) Az SQL UDF törzse f_p Porthos (függvény tulajdonosa) Aramis
5 RETURN (SELECT b100 FROM v_p WHERE a = p) Az SQL UDF törzse f_a Athos (függvény tulajdonosa) Aramis
6 SELECT a, b * 100 AS b100 FROM t Nézet törzse v_p Porthos (nézet tulajdonosa) Aramis

A végrehajtás kikapcsolásakor az engedélyezett felhasználó rétegről rétegre előugrik, amíg a vezérlő vissza nem tér az Aramis munkamenetéhez az 1. lépésben.