Geautoriseerde gebruiker en sessiegebruiker

Van toepassing op:gemarkeerd als ja Databricks SQL gemarkeerd als ja Databricks Runtime

Wanneer Azure Databricks een SQL-instructie uitvoert, worden twee afzonderlijke gebruikers bijgehouden:

  • Sessiegebruiker: de gebruiker die is verbonden met Azure Databricks en de verklaring heeft uitgegeven. De sessiegebruiker is vast voor de levensduur van de SQL-verbinding. Dit verandert niet terwijl een instructie wordt uitgevoerd, zelfs niet wanneer de instructie weergaven, SQL UDF's of opgeslagen procedures bereikt.
  • Geautoriseerde gebruiker : de gebruiker waarvan de bevoegdheden worden gecontroleerd wanneer de momenteel uitgevoerde instructie objecten leest of schrijft. De geautoriseerde gebruiker kan wijzigen wanneer de uitvoering doorkruist naar een hoofdtekst van een weergave, een SQL UDF-hoofdtekst of een SQL SECURITY DEFINER proceduretekst.

De functie session_user retourneert de sessiegebruiker.

Warning

De current_user - en gebruikersfuncties zijn aliassen die ook de sessiegebruiker retourneren, niet de geautoriseerde gebruiker. In standaard-SQL CURRENT_USER wordt de geautoriseerde gebruiker geretourneerd. In Azure Databricks dit niet het geval is. Gebruik session_user om expliciet naar de sessiegebruiker te verwijzen.

Hoe de geautoriseerde gebruiker zich ontwikkelt

Elke aanroep van een weergave, SQL UDF of opgeslagen procedure pusht een nieuwe vermelding op de aanroepstack. De geautoriseerde gebruiker voor een instructie wordt bepaald door de bovenste stackvermelding waarmee een eigenaar wordt opgelost:

Object Geautoriseerde gebruiker in de hoofdtekst
View De eigenaar van de weergave
SQL UDF De eigenaar van de functie
CREATE PROCEDURE ... SQL SECURITY DEFINER De eigenaar van de procedure (definitie)
CREATE PROCEDURE ... SQL SECURITY INVOKER De geautoriseerde gebruiker van de aanroepinstructie (overgenomen)

Weergaven, SQL UDF's en SQL SECURITY DEFINER procedures stellen de geautoriseerde gebruiker in op hun eigenaar voor alle instructies in de hoofdtekst. Een SQL SECURITY INVOKER procedure neemt de geautoriseerde gebruiker over van de aanroeper.

Wanneer de uitvoering van een hoofdtekst is voltooid en het besturingselement terugkeert naar de beller, wordt de geautoriseerde gebruiker teruggezet naar wat het was op de oproepsite.

De sessiegebruiker verandert daarentegen nooit tijdens één verbinding. Binnen een SQL SECURITY DEFINER procedurebody session_user() retourneert nog steeds de gebruiker die de oorspronkelijke instructie heeft uitgegeven.

Bevoegdheden gecontroleerd op elke laag

Azure Databricks controleert de bevoegdheden voor de geautoriseerde gebruiker op elke uitvoeringslaag:

  • De sessiegebruiker moet de procedure of functie op het hoogste niveau en SELECT in de weergave op het hoogste niveau hebbenEXECUTE. De sessiegebruiker moet ook over de bovenliggende containers beschikken USE CATALOGUSE SCHEMA .
  • In een SQL SECURITY INVOKER proceduretekst gebruiken alle instructies de bevoegdheden van de sessiegebruiker, inclusief geneste EXECUTE aanroepen naar andere routines.
  • In een hoofdtekst van een SQL SECURITY DEFINER procedure, een hoofdtekst van een weergave of een SQL UDF-hoofdtekst gebruiken alle instructies de bevoegdheden van de eigenaar. De sessiegebruiker heeft alleen de bevoegdheid nodig om de buitenste routine aan te roepen, niet bevoegdheden voor de objecten die de hoofdtekst verwijst.

Example

In dit voorbeeld worden weergaven, SQL UDF's en opgeslagen procedures gekoppeld die eigendom zijn van verschillende gebruikers. Elke laag leest uit de onderstaande laag, zodat autorisatie de volledige stack doorkruist. In het voorbeeld worden drie gebruikers (Opgegeven, Porthos en Aramis) gebruikt en wordt getraceert wat er gebeurt wanneer Aramis, die alleen toegang heeft tot de procedures op het hoogste niveau, de keten aanroept.

Configuratie

Oplopend maakt een tabel met twee kolommen en verleent Porthos leestoegang:

-- 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 creëert een weergave over de tabel van Oplopend en geeft Cate leestoegang op de weergave:

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

Oplopend maakt u een SQL UDF die leest uit de weergave van Porthos en porthos EXECUTE verleent:

-- 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 maakt een SQL UDF die resultaten van de UDF vanen samenvoegt en een SQL SECURITY DEFINER procedure waarmee het resultaat wordt weergegeven:

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

Oplopend maakt een SQL SECURITY INVOKER procedure die Porthos's procedure aanroept:

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

Ten slotte verlenen Opgegeven en Porthos elk Aramis wat hij nodig heeft om de keten aan te roepen. Omdat p_inv dit een SQL SECURITY INVOKER procedure is, wordt de hoofdtekst uitgevoerd als de gebruiker die het noemde (Aramis), en dus moet Aramis onafhankelijk beschikken EXECUTE over 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 heeft geen bevoegdheden voor t, f_aof v_pf_p.

Aramis roept de keten aan

Problemen met Aramis:

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

De oproepketen ontvouwt zich als volgt, elke pijl die in een nieuwe hoofdtekst oversteekt:

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)

In de volgende tabel worden de instructies doorlopen terwijl ze worden uitgevoerd.

Step Statement Waar deze wordt uitgevoerd Geautoriseerde gebruiker session_user()
1 CALL p_inv() Aramis's sessie Aramis Aramis
2 CALL p_def() Hoofdtekst van p_inv (SQL SECURITY INVOKER) Aramis (overgenomen van beller) Aramis
3 SELECT f_p() Hoofdtekst van p_def (SQL SECURITY DEFINER) Porthos (procedure-eigenaar) Aramis
4 RETURN f_a(1) + f_a(2) + f_a(3) Hoofdtekst van SQL UDF f_p Porthos (functie-eigenaar) Aramis
5 RETURN (SELECT b100 FROM v_p WHERE a = p) Hoofdtekst van SQL UDF f_a Tenant (functie-eigenaar) Aramis
6 SELECT a, b * 100 AS b100 FROM t Hoofdtekst van weergave v_p Porthos (eigenaar weergeven) Aramis

Wanneer de uitvoering wordt afwikkeld, wordt de geautoriseerde gebruiker laag per laag weergegeven totdat de controle terugkeert naar de sessie van Aramis in stap 1.