Поделиться через


Настройка авторизации в приложении Databricks

Databricks Apps поддерживает безопасную разработку приложений в Azure Databricks. Так как приложения получают доступ к данным и службам в рабочей области, они должны использовать механизмы проверки подлинности и авторизации, которые обеспечивают управление доступом к данным и уважают разрешения пользователей. Модель авторизации Databricks Apps основана на OAuth 2.0 и объединяет разрешения, назначенные приложению, с разрешениями пользователей, которые к нему обращаются.

Для поддержки этой платформы Databricks Apps использует две дополнительные модели удостоверений:

Авторизация приложения

Каждое приложение Azure Databricks имеет выделенный служебный принципал, который выступает в качестве удостоверения при доступе к ресурсам Azure Databricks. Этот служебный принципал является уникальным для экземпляра приложения и не может повторно использоваться для других приложений. Вы не можете изменить субъект-службу, назначенный приложению, или указать существующий субъект-службу во время создания приложения. Azure Databricks использует это удостоверение для оценки разрешений приложения независимо от любого пользователя, что гарантирует, что приложение может получать доступ только к ресурсам, явно предоставленным ему, даже вне контекста взаимодействия с пользователем.

Это разделение помогает применять границы безопасности, которые обеспечивают аудит действий приложения и поддерживают такие сценарии, как фоновая обработка или автоматизированные задачи.

Субъект-служба представлен уникальным идентификатором. Скопируйте его содержимое из вкладки Авторизация в приложении.

Просмотр субъекта-службы в приложении Databricks

При создании приложения Azure Databricks автоматически подготавливает выделенный служебный принципал для приложения. Служебный принципал остается неизменным во всех развертываниях приложения. При удалении приложения Azure Databricks удаляет субъект-службу.

Используйте учетную запись службы для действий, которые приложение выполняет самостоятельно, не требуя пользовательского контекста. Распространенные варианты использования:

  • Выполнение фоновых задач
  • Чтение или запись общей конфигурации или метаданных
  • Ведение журнала или метрики использования
  • Вызов внешних служб через безопасные конечные точки

Все действия, инициированные приложением, используют разрешения субъекта-службы. Предоставьте служебному принципалу доступ к конкретным ресурсам путем стандартного назначения разрешений. Однако он не поддерживает управление доступом на уровне пользователя. Все пользователи, взаимодействующие с приложением, имеют одинаковые разрешения, определенные для представителя службы, что не позволяет приложению применять более детальные политики на основе отдельной идентификации пользователя.

В следующем примере показано, как приложение использует служебный принципал для запроса данных в Unity Catalog.

Узнайте, как субъект-служба проходит аутентификацию в приложении

В этом случае субъект-служба нуждается в явном доступе как к хранилищу SQL, так и к таблице каталога Unity.

Эта модель хорошо работает, если все пользователи приложения будут видеть одни и те же данные или когда приложение выполняет общие операции, не привязанные к элементам управления доступом для определенных пользователей.

Получение учетных данных авторизации приложения

Для авторизации приложений Azure Databricks автоматически внедряет учетные данные основной службы в среду приложения. Следующие переменные среды содержат необходимые значения клиента OAuth:

Variable Description
DATABRICKS_CLIENT_ID Идентификатор клиента OAuth для сервис-принципала
DATABRICKS_CLIENT_SECRET Секрет клиента OAuth субъекта-службы

Azure Databricks автоматически задает переменные среды в среде выполнения приложения. Приложение использует эти переменные, когда аутентифицируется от своего имени.

Python

import os

client_id = os.getenv('DATABRICKS_CLIENT_ID')
client_secret = os.getenv('DATABRICKS_CLIENT_SECRET')

JavaScript

const clientId = process.env.DATABRICKS_CLIENT_ID;
const clientSecret = process.env.DATABRICKS_CLIENT_SECRET;

Note

Если вы используете пакеты SDK Azure Databricks, обычно вам не нужно вручную обращаться к этим переменным среды. Пакеты SDK следуют единой проверке подлинности и автоматически обнаруживают учетные данные в среде.

Пример. Запрос с авторизацией приложения

Python

В этом примере используется объект конфигурации пакета SDK, который извлекает учетные данные субъекта-службы из переменных среды и выполняет авторизацию OAuth.

from databricks import sql
from databricks.sdk.core import Config

cfg = Config()

conn = sql.connect(
    server_hostname=cfg.host,
    http_path="<your-warehouse-http-path>",
    credentials_provider=lambda: cfg.authenticate,
)

query = "SELECT * FROM main.sandbox.sales_customers LIMIT 1000"

with conn.cursor() as cursor:
    cursor.execute(query)
    df = cursor.fetchall_arrow().to_pandas()
    print(df.head())

conn.close()
JavaScript

В этом примере используются переменные среды для аутентификации с помощью учётной записи службы через OAuth и выполнения запроса с использованием SQL-драйвера Databricks для Node.js.

import { DBSQLClient } from '@databricks/sql';

const client = new DBSQLClient();

const connection = await client.connect({
  authType: 'databricks-oauth',
  host: process.env.DATABRICKS_SERVER_HOSTNAME,
  path: process.env.DATABRICKS_HTTP_PATH,
  oauthClientId: process.env.DATABRICKS_CLIENT_ID,
  oauthClientSecret: process.env.DATABRICKS_CLIENT_SECRET,
});

const query = 'SELECT * FROM main.sandbox.sales_customers LIMIT 1000';
const cursor = await connection.cursor(query);

const rows = [];
for await (const row of cursor) {
  rows.push(row);
}

console.log(rows.slice(0, 5)); // Like df.head()

await connection.close();

Авторизация пользователей

Important

Авторизация пользователя доступна в общедоступной предварительной версии.

Авторизация пользователей, иногда называемая авторизацией от имени пользователя, позволяет приложению Databricks Apps действовать с удостоверением пользователя приложения. Azure Databricks перенаправит маркер доступа пользователя в приложение, которое использует маркер для доступа к ресурсам от имени пользователя. Azure Databricks применяет все разрешения на основе существующих политик каталога Unity пользователя.

Для управления рисками безопасности приложений, действующих от имени пользователя, Azure Databricks использует области, чтобы ограничить действия, которые может выполнять приложение с помощью авторизации пользователя.

Примените авторизацию пользователей, если приложению необходимо соблюдать отдельные разрешения пользователей. Типичные варианты использования:

  • Выполнение запросов к таблицам или томам
  • Доступ к хранилищам SQL или вычислительным ресурсам
  • Выполнение заданий или рабочих процессов, привязанных к действиям пользователя

Все действия используют существующие разрешения каталога Unity пользователя:

Просмотр проверки подлинности пользователя в приложении

Авторизация пользователей обеспечивает точное управление доступом, применяя функции каталога Unity, такие как фильтры на уровне строк и маски столбцов к действиям приложения. Этот подход обеспечивает согласованность управления доступом с управлением рабочими областями и позволяет избежать жесткой логики разрешений в приложении.

Точные разрешения с авторизацией пользователя

При добавлении авторизации пользователя в приложение он применяет существующие разрешения каталога Unity пользователя, в том числе:

  • Фильтры на уровне строк для ограничения видимых строк
  • Маски столбцов для изменения или преобразования конфиденциальных данных

Так как Azure Databricks оценивает запросы авторизации пользователей с удостоверением пользователя, эти политики применяются автоматически, когда приложение обращается к данным. Например, если таблица содержит фильтр строк, ограничивающий видимость по регионам, приложение возвращает только строки, которые пользователь может запрашивать. В приложении не требуется дополнительная логика фильтрации.

Этот подход позволяет избежать дублирования логики управления доступом в коде приложения и обеспечения согласованности с управлением на уровне рабочей области. Когда администраторы обновляют политики каталога Unity, приложение автоматически учитывает эти изменения.

Безопасность на основе области и повышение привилегий

Приложения, использующие авторизацию пользователя, должны объявлять определенные области авторизации, чтобы ограничить возможности приложения от имени пользователя. Области ограничивают доступ к определенным API или типам ресурсов, например:

  • sql для запросов к хранилищам SQL
  • dashboards.genie для управления пространством Genie
  • files.files для управления вашими файлами и каталогами

Если вы не выбираете области видимости, Azure Databricks назначает набор по умолчанию, позволяющий приложению получать основную информацию о личности пользователя.

  • iam.access-control:read
  • iam.current-user:read

Эти значения по умолчанию необходимы для поддержки функций авторизации пользователей, но они не разрешают доступ к данным или вычислительным ресурсам. Добавьте дополнительные области при создании или изменении приложения.

Области доступа применяют принцип наименьшей привилегии. Обязательно настройте приложение, чтобы запросить только области, необходимые ему. Azure Databricks блокирует доступ к любым функциям за пределами утвержденных областей, даже если у пользователя есть разрешение. Например, если приложение запрашивает только sql область, она не может получить доступ к конечным точкам модели обслуживания, даже если пользователь может за пределами приложения.

Когда пользователь сначала обращается к приложению, Azure Databricks предложит им явно авторизовать приложение для выполнения действий в запрошенных областях. Администраторы могут предоставить согласие от имени пользователей для согласования доступа с политиками организации.

Добавление областей в приложение

Important

Авторизация пользователя доступна в общедоступной предварительной версии. Администратор рабочей области должен включить его, прежде чем добавлять области в приложение.

После включения авторизации пользователя необходимо перезапустить существующие приложения, прежде чем добавлять к ним области. Если вы отключите авторизацию пользователя, необходимо перезапустить существующие приложения, чтобы они перестали использовать маркер доступа текущего пользователя для доступа к ресурсам.

Настройте авторизацию пользователей при создании или изменении приложения в пользовательском интерфейсе Azure Databricks.

На шаге «Настройка» нажмите +Добавить область и выберите области, определяющие, к каким api или ресурсам Azure Databricks приложение может получить доступ от имени пользователя. Azure Databricks применяет эти области во время выполнения и требует согласия пользователя или администратора перед предоставлением доступа.

Добавление областей авторизации пользователей в приложение Databricks

Полный пример см. в демонстрации авторизации Databricks Apps на GitHub. В примере приложения показано, как использовать модели авторизации приложений и пользователей, а также инструкции по настройке и примеры запросов с авторизацией пользователя.

Получение учетных данных авторизации пользователей

Для авторизации пользователей Azure Databricks перенаправляет идентификацию пользователя и маркер доступа к приложению в заголовках HTTP. Приложение должно извлечь эти заголовки, чтобы действовать от имени пользователя.

Получение этих заголовков зависит от используемого фреймворка.

Streamlit

import streamlit as st
user_access_token = st.context.headers.get('x-forwarded-access-token')

Gradio

import gradio as gr

def query_fn(message, history, request: gr.Request):
    access_token = request.headers.get("x-forwarded-access-token")
    ...

Gradio автоматически внедряет объект запроса в функцию приложения при объявлении его в качестве параметра. Вам не нужно создавать или запрашивать запрос вручную.

Dash и Flask

from flask import request

headers = request.headers
user_token = headers.get('x-forwarded-access-token')

Shiny

user_token = session.http_conn.headers.get('x-forwarded-access-token')

Express

import express from 'express';

const userAccessToken = req.header('x-forwarded-access-token');

Пример. Запрос с авторизацией пользователя

В этом случае приложение передает маркер доступа пользователя непосредственно соединителю, а Azure Databricks применяет разрешения пользователя к запросу.

Python
from databricks import sql
from databricks.sdk.core import Config
from flask import request

cfg = Config()
user_token = request.headers.get("x-forwarded-access-token")

conn = sql.connect(
    server_hostname=cfg.host,
    http_path="<your-warehouse-http-path>",
    access_token=user_token
)

query = "SELECT * FROM main.sandbox.sales_customers LIMIT 1000"

with conn.cursor() as cursor:
    cursor.execute(query)
    df = cursor.fetchall_arrow().to_pandas()
    print(df.head())

conn.close()
JavaScript
import { DBSQLClient } from '@databricks/sql';
import express from 'express';

const app = express();

app.get('/', async (req, res) => {
  const userToken = req.header('x-forwarded-access-token');

  const client = new DBSQLClient();
  const connection = await client.connect({
    authType: 'access-token',
    host: process.env.DATABRICKS_SERVER_HOSTNAME,
    path: process.env.DATABRICKS_HTTP_PATH,
    token: userToken,
  });

  const query = 'SELECT * FROM main.sandbox.sales_customers LIMIT 1000';
  const cursor = await connection.cursor(query);

  const rows = [];
  for await (const row of cursor) {
    rows.push(row);
  }

  console.log(rows.slice(0, 5));
  await connection.close();

  res.send('Query complete');
});

app.listen(3000);

Рекомендации по авторизации пользователей

При создании приложений, выполняющих действия от имени пользователей, следуйте приведенным ниже рекомендациям, чтобы обеспечить безопасный и проверяемый доступ:

  • Храните код приложения в папках, доступных только владельцу приложения или небольшому набору доверенных пользователей.
  • Предоставьте CAN MANAGE разрешения только доверенным старшим разработчикам, которые отвечают за обслуживание и проверку приложений. Предоставьте CAN USE разрешения только определенным пользователям или группам, утвержденным для запуска приложения.
  • Убедитесь, что токены не печатаются, записываются в журналы или записываются в файлы. Это относится ко всем операторам ведения журнала, средствам отладки и обработчикам ошибок. Например, вместо print(f"User token: {token}") используйте headers = {"Authorization": f"Bearer {token}"}.
  • Настройте каждое приложение, чтобы запросить только минимальные необходимые области авторизации, необходимые для ее функциональных возможностей.
  • Во время проверки кода убедитесь, что параметры области и разрешений соответствуют требованиям безопасности и не предоставляют ненужный доступ.
  • Принудительное применение одноранговой проверки для всех кодов приложений перед развертыванием в рабочих средах.
  • Убедитесь, что код приложения записывает структурированные журналы аудита для каждого действия, выполняемого от имени пользователей, включая удостоверение пользователя, тип действия, целевой ресурс и состояние.

Методы проверки подлинности

Чтобы получить токены для приложений Databricks, пользователи и служебные субъекты проходят аутентификацию с помощью стандартных потоков OAuth 2.0. Метод зависит от того, является ли вызывающий пользователь или автоматизированная рабочая нагрузка.

Для входа в рабочую область (только пользователи):

  • Единый вход (SSO): Пользователи проходят проверку подлинности через поставщика идентификации при настройке единого входа (SSO).
  • Одноразовый пароль (OTP): Пользователи получают временный пароль, если единый вход не настроен.

Для потоков OAuth (приложений и рабочих нагрузок):

  • OAuth для взаимодействия пользователя с устройством (U2M): Пользователи проходят аутентификацию, а полученные токены обеспечивают авторизацию, чтобы приложение могло действовать от имени пользователя.
  • OAuth на компьютере (M2M): Субъекты-службы проходят проверку подлинности с помощью учетных данных клиента или федерации. Эти токены лежат в основе авторизации приложения, где приложение действует как само по себе, а не как пользователь.

Инструкции по вызову приложения Databricks с использованием проверки подлинности токена, см. в разделе «Подключение к приложению API Databricks с использованием проверки подлинности токена».

Сравнение и объединение моделей

Приложения Databricks могут использовать авторизацию приложений и пользователей независимо или вместе. Эти модели служат различным целям и предназначены для параллельной работы.

Модель авторизации Когда следует использовать Примеры вариантов использования
Авторизация приложения Когда приложение выполняет операции, которые не зависят от удостоверения пользователя Запись журналов, доступ к общей конфигурации, вызов внешних служб
Авторизация пользователей Когда приложению необходимо получить доступ к ресурсам в контексте текущего пользователя Запрос данных каталога Unity, запуск вычислений, применение разрешений на уровне строк
Both Когда приложение выполняет как общие, так и пользовательские операции Запись метрик с помощью идентификатора приложения и запрос отфильтрованных данных с помощью идентификатора пользователя