Autorizovaný uživatel a uživatel relace

Platí pro:označeno jako ano Databricks SQL označeno jako ano Databricks Runtime

Když Azure Databricks spustí příkaz SQL, sleduje dva různé uživatele:

  • Uživatel relace: uživatel, který je připojený k Azure Databricks a vydal příkaz. Uživatel relace je opravený po celou dobu životnosti připojení SQL. Během spuštění příkazu se nezmění, a to ani v případě, že příkaz přejde do zobrazení, funkcí DEFINOVANÝch uživatelem SQL nebo uložených procedur.
  • Autorizovaný uživatel: uživatel, jehož oprávnění jsou kontrolována, když aktuálně spouštěný příkaz čte nebo zapisuje objekty. Autorizovaný uživatel se může změnit jako křížek provádění do textu zobrazení, textu uživatele SQL nebo SQL SECURITY DEFINER textu procedury.

Funkce session_user vrátí uživatele relace.

Warning

Current_user a uživatelské funkce jsou aliasy, které také vracejí uživatele relace, nikoli autorizovaného uživatele. Ve standardním SQL CURRENT_USER vrátí autorizovaný uživatel; v Azure Databricks ne. Pomocí session_user můžete explicitně odkazovat na uživatele relace.

Jak se autorizovaný uživatel vyvíjí

Každé vyvolání zobrazení, funkce DEFINOVANÁ uživatelem SQL nebo uložená procedura odešle novou položku do zásobníku volání. Autorizovaný uživatel pro příkaz je určen nejvyšší položkou zásobníku, která opravuje vlastníka:

Object Autorizovaný uživatel uvnitř textu
View Vlastník zobrazení
SQL UDF Vlastník funkce
CREATE PROCEDURE ... SQL SECURITY DEFINER Vlastník procedury (definer)
CREATE PROCEDURE ... SQL SECURITY INVOKER Autorizovaný uživatel volajícího příkazu (zděděný)

Zobrazení, uživatelem definované uživatelem SQL a SQL SECURITY DEFINER procedury nastavují autorizovaného uživatele pro všechny příkazy v těle. Procedura SQL SECURITY INVOKER dědí autorizovaného uživatele z volajícího.

Když tělo dokončí provádění a řízení se vrátí volajícímu, autorizovaný uživatel se vrátí zpět na cokoli, co bylo na webu volání.

Uživatel relace se naopak během jednoho připojení nikdy nezmění. SQL SECURITY DEFINER Uvnitř těla procedury stále vrací uživatele, session_user() který vydal původní příkaz.

Oprávnění kontrolovaná v každé vrstvě

Azure Databricks kontroluje oprávnění vůči autorizovanému uživateli v každé vrstvě provádění:

  • Uživatel relace musí držet EXECUTE proceduru nebo funkci nejvyšší úrovně a SELECT v zobrazení nejvyšší úrovně. Uživatel relace musí mít USE CATALOG také nadřazené kontejnery a USE SCHEMA v nadřazených kontejnerech.
  • SQL SECURITY INVOKER V těle procedury používají všechny příkazy oprávnění uživatele relace, včetně všech vnořených EXECUTE volání jiných rutin.
  • SQL SECURITY DEFINER V těle procedury, textu zobrazení nebo textu uživatele SQL používají všechny příkazy oprávnění vlastníka. Uživatel relace potřebuje pouze oprávnění k vyvolání vnější rutiny, nikoli oprávnění k objektům, na které odkazuje tělo.

Example

Tento příklad zřetědí zobrazení, uživatelem definované uživatelem SQL a uložené procedury vlastněné různými uživateli. Každá vrstva čte z níže uvedené vrstvy, takže autorizace prochází celým zásobníkem. Příklad používá tři uživatele (Athos, Porthos a Aramis) a trasuje, co se stane, když Aramis, který má přístup pouze k procedurám nejvyšší úrovně, vyvolá řetěz.

Nastavení

Athos vytvoří tabulku se dvěma sloupci a udělí Porthos přístup pro čtení:

-- 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`;

Porthos vytvoří zobrazení nad tabulkou Athos a udělí Athos přístup pro čtení v zobrazení:

-- 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`;

Athos vytvoří UDF SQL, který čte ze zobrazení Porthos, a udělí mu porthos EXECUTE :

-- 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`;

Porthos vytvoří definovanou uživatelem SQL, která agreguje výsledky z funkce definované uživatelem Athosu, a procedura SQL SECURITY DEFINER , která zpřístupňuje výsledek:

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

Athos vytvoří proceduru SQL SECURITY INVOKER , která volá proceduru Porthos:

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

Athos a Porthos každý uděluje Aramis, co potřebuje k vyvolání řetězce. Protože p_inv je procedura SQL SECURITY INVOKER , její tělo běží jako uživatel, který ho nazval (Aramis), a proto Aramis musí mít nezávisle EXECUTE na 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`;

Aramis nemá žádná oprávnění k t, f_a, v_pnebo f_p.

Aramis vyvolá řetězec

Problémy s Aramis:

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

Řetězec volání se rozbalí následujícím způsobem, přičemž každá šipka překračuje do nového těla:

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)

Následující tabulka vás provede příkazy při jejich provádění.

Step Statement Kde běží Oprávněný uživatel session_user()
1 CALL p_inv() Relace Aramis Aramis Aramis
2 CALL p_def() Text (p_invSQL SECURITY INVOKER) Aramis (zděděný z volajícího) Aramis
3 SELECT f_p() Text (p_defSQL SECURITY DEFINER) Porthos (vlastník procedury) Aramis
4 RETURN f_a(1) + f_a(2) + f_a(3) Text uživatelem definovaného uživatelem SQL f_p Porthos (vlastník funkce) Aramis
5 RETURN (SELECT b100 FROM v_p WHERE a = p) Text uživatelem definovaného uživatelem SQL f_a Athos (vlastník funkce) Aramis
6 SELECT a, b * 100 AS b100 FROM t Základní text zobrazení v_p Porthos (zobrazit vlastníka) Aramis

Při spuštění se autorizovaný uživatel zobrazí zpět vrstvu po vrstvě, dokud se ovládací prvek nevrátí do relace Aramis v kroku 1.