Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:
Databricks SQL
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 DEFINERproceduretekst.
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
SELECTin de weergave op het hoogste niveau hebbenEXECUTE. De sessiegebruiker moet ook over de bovenliggende containers beschikkenUSE CATALOGUSE SCHEMA. - In een
SQL SECURITY INVOKERproceduretekst gebruiken alle instructies de bevoegdheden van de sessiegebruiker, inclusief genesteEXECUTEaanroepen naar andere routines. - In een hoofdtekst van een
SQL SECURITY DEFINERprocedure, 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.