Авторизованный пользователь и пользователь сеанса

Область применения:Отмечено «Да» 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.