Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:
Databricks SQL
Databricks Runtime
Когда Azure Databricks запускает инструкцию SQL, она отслеживает двух отдельных пользователей:
- Пользователь сеанса: пользователь, подключенный к Azure Databricks, и выдал инструкцию. Пользователь сеанса исправлен в течение времени существования подключения SQL. Он не изменяется во время выполнения инструкции, даже если инструкция достигает представлений, определяемых пользователем SQL или хранимых процедур.
-
Авторизованный пользователь: пользователь, привилегии которого проверяются, когда в данный момент выполняется инструкция считывает или записывает объекты. Авторизованный пользователь может измениться в виде выполнения в текст представления, тело UDF SQL или
SQL SECURITY DEFINERтело процедуры.
Функция session_user возвращает пользователя сеанса.
Предупреждение
Current_user ипользовательские функции — это псевдонимы, которые также возвращают пользователя сеанса, а не авторизованного пользователя. В стандартном SQL CURRENT_USER возвращает авторизованного пользователя. В Azure Databricks это не так. Используйте session_user для явного обращения к пользователю сеанса.
Как развивается авторизованный пользователь
Каждое вызов представления, UDF SQL или хранимая процедура отправляет новую запись в стек вызовов. Авторизованный пользователь для инструкции определяется самой верхней записью стека, которая исправляет владельца:
| Object | Авторизованный пользователь внутри тела |
|---|---|
| View | Владелец представления |
| SQL UDF | Владелец функции |
CREATE PROCEDURE ... SQL SECURITY DEFINER |
Владелец процедуры (определяющий) |
CREATE PROCEDURE ... SQL SECURITY INVOKER |
Авторизованный пользователь вызывающей инструкции (наследуется) |
Представления, определяемые пользователем SQL и SQL SECURITY DEFINER процедуры, задайте авторизованному пользователю имя владельца для всех инструкций в тексте. Процедура SQL SECURITY INVOKER наследует авторизованного пользователя от вызывающего пользователя.
Когда текст завершает выполнение и контроль возвращается вызывающему объекту, авторизованный пользователь возвращается к тому, что было на сайте вызова.
Пользователь сеанса, напротив, никогда не изменяется во время одного подключения. Внутри тела процедуры по-прежнему SQL SECURITY DEFINER возвращает пользователя, session_user() который выпустил исходную инструкцию.
Привилегии, проверенные на каждом уровне
Azure Databricks проверяет привилегии авторизованного пользователя на каждом уровне выполнения:
- Пользователь сеанса должен содержать
EXECUTEпроцедуру или функцию верхнего уровня иSELECTв представлении верхнего уровня. Пользователь сеанса также должен иметьUSE CATALOGиUSE SCHEMAродительские контейнеры. -
SQL SECURITY INVOKERВ теле процедуры все инструкции используют привилегии пользователя сеанса, включая все вложенныеEXECUTEвызовы к другим подпрограммам. - В тексте
SQL SECURITY DEFINERпроцедуры, тексте представления или теле UDF SQL все инструкции используют привилегии владельца. Пользователю сеанса требуется только привилегия для вызова внешней подпрограммы, а не привилегий для объектов, на которые ссылается текст.
Example
В этом примере отображаются представления, определяемые пользователем SQL, и хранимые процедуры, принадлежащие разным пользователям. Каждый слой считывается из приведенного ниже слоя, поэтому авторизация проходит по полному стеку. В примере используются три пользователя (Athos, Porthos и Aramis) и трассировка того, что происходит, когда Aramis, который имеет доступ только к процедурам верхнего уровня, вызывает цепочку.
Настройка
Athos создает таблицу с двумя столбцами и предоставляет доступ на чтение Porthos:
-- 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 создает представление над таблицей Athos и предоставляет доступ на чтение Athos в представлении:
-- 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 создает UDF SQL, который считывает из представления 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 создает UDF SQL, который объединяет результаты из UDF Athos и SQL SECURITY DEFINER процедуру, которая предоставляет результат:
-- 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 создает процедуру, которая вызывает процедуру SQL SECURITY INVOKER Porthos:
-- Run as Athos.
> CREATE PROCEDURE p_inv()
LANGUAGE SQL
SQL SECURITY INVOKER
AS BEGIN
CALL p_def();
END;
Наконец, Атхос и Портхос каждый грант Aramis, что он должен вызвать цепочку. Так как p_inv это SQL SECURITY INVOKER процедура, его тело работает как пользователь, который назвал его (Aramis), и поэтому Aramis должны независимо иметь на EXECUTEp_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`;
У Арамиса нет прав на t, f_av_pили f_p.
Aramis вызывает цепочку
Проблемы с Арамисом:
-- Run as Aramis.
> CALL p_inv();
Цепочка вызовов разворачивается следующим образом, каждая стрелка пересекает новый текст:
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)
В следующей таблице рассматриваются инструкции по мере их выполнения.
| Step | Заявление | Где это работает | Авторизованный пользователь | session_user() |
|---|---|---|---|---|
| 1 | CALL p_inv() |
Сеанс Арамиса | Арамис | Арамис |
| 2 | CALL p_def() |
p_inv Текст (SQL SECURITY INVOKER) |
Арамис (унаследованный от вызывающего абонента) | Арамис |
| 3 | SELECT f_p() |
p_def Текст (SQL SECURITY DEFINER) |
Porthos (владелец процедуры) | Арамис |
| 4 | RETURN f_a(1) + f_a(2) + f_a(3) |
Текст UDF SQL f_p |
Porthos (владелец функции) | Арамис |
| 5 | RETURN (SELECT b100 FROM v_p WHERE a = p) |
Текст UDF SQL f_a |
Athos (владелец функции) | Арамис |
| 6 | SELECT a, b * 100 AS b100 FROM t |
Текст представления v_p |
Porthos (владелец представления) | Арамис |
При отмене выполнения авторизованный пользователь всплывает на уровне на уровне до тех пор, пока управление не вернется к сеансу Aramis на шаге 1.