Sdílet prostřednictvím


Konfigurace autorizace v aplikaci Databricks

Databricks Apps podporuje zabezpečený vývoj aplikací v Azure Databricks. Protože aplikace přistupují k datům a službám v rámci pracovního prostoru, musí používat mechanismy ověřování a autorizace, které vynucují řízení přístupu k datům a respektují uživatelská oprávnění. Autorizační model Databricks Apps je založený na OAuth 2.0 a kombinuje oprávnění přiřazená aplikaci s oprávněními uživatelů, kteří k němu přistupují.

Pro podporu této architektury databricks Apps používají dva doplňkové modely identit:

  • Autorizace aplikace dává aplikaci vlastní identitu s konzistentní sadou oprávnění.
  • Autorizace uživatele umožňuje aplikaci používat identitu a oprávnění uživatele, který s ním pracuje.

Autorizace aplikace

Každá aplikace Azure Databricks má vyhrazenou servisní identitu, která funguje jako její identita při přístupu k prostředkům Azure Databricks. Tento instanční objekt je jedinečný pro instanci aplikace a nejde ho znovu použít napříč aplikacemi. Nemůžete změnit službu principal přiřazenou k aplikaci ani zadat existující službu principal při vytváření aplikace. Azure Databricks tuto identitu používá k vyhodnocení oprávnění aplikace nezávisle na jakémkoli uživateli, což zajišťuje, že aplikace bude mít přístup pouze k prostředkům, které mu byly explicitně uděleny, a to i mimo kontext interakce uživatele.

Toto oddělení pomáhá vynucovat hranice zabezpečení, což umožňuje auditování aktivit aplikací a podporuje scénáře, jako je zpracování na pozadí nebo automatizované úlohy.

Instanční objekt služby je reprezentován jedinečným ID. Zkopírujte ho z karty Autorizace aplikace:

Zobrazení principálu služby v aplikaci Databricks

Když vytvoříte aplikaci, Azure Databricks pro aplikaci automaticky zřizuje vyhrazený služební principál. Zástupce služby zůstává stejný ve všech nasazeních aplikace. Když aplikaci odstraníte, Azure Databricks odstraní servisní princípál.

Principál služby použijte pro akce, které aplikace provádí samostatně, aniž by vyžadovala kontext uživatele. Mezi běžné případy použití patří:

  • Spouštění úloh na pozadí
  • Čtení nebo zápis sdílené konfigurace nebo metadat
  • Protokolování aktivit nebo metrik využití
  • Volání externích služeb prostřednictvím zabezpečených koncových bodů

Všechny akce iniciované aplikací používají oprávnění instančního objektu. Udělte servisnímu účtu přístup ke konkrétním prostředkům pomocí standardních přiřazení oprávnění. Nepodporuje ale řízení přístupu na úrovni uživatele. Všichni uživatelé, kteří pracují s aplikací, sdílejí stejná oprávnění definovaná pro instanční objekt, což aplikaci brání vynucování jemně odstupňovaných zásad na základě individuální identity uživatele.

Následující příklad ukazuje, jak aplikace používá svou službu principal k dotazování na data v katalogu Unity.

Zobrazení, jak se klient služby ověřuje v aplikaci

V tomto případě potřebuje principál služby explicitní přístup ke skladu SQL i k tabulce Unity Catalog, na které se dotazuje.

Tento model funguje dobře, když chcete, aby všichni uživatelé aplikace viděli stejná data nebo když aplikace provádí sdílené operace, které nejsou svázané s uživatelskými ovládacími prvky přístupu.

Načtení přihlašovacích údajů pro autorizaci aplikace

Pro autorizaci aplikace Azure Databricks automaticky vloží přihlašovací údaje služebního principálu do prostředí aplikace. Následující proměnné prostředí obsahují požadované hodnoty klienta OAuth:

Variable Description
DATABRICKS_CLIENT_ID ID OAuth klienta služebního objektu
DATABRICKS_CLIENT_SECRET Tajný klíč klienta OAuth principálu služby

Azure Databricks nastaví proměnné prostředí automaticky v modulu runtime aplikace. Aplikace tyto proměnné používá k tomu, aby se ověřila sama.

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

Pokud používáte sady AZURE Databricks SDK, obvykle k těmto proměnným prostředí nemusíte přistupovat ručně. Sady SDK se řídí jednotným ověřováním a automaticky detekují přihlašovací údaje v prostředí.

Příklad: Dotazování s autorizací aplikace

Python

Tento příklad používá objekt nastavení SDK, který načítá přihlašovací údaje pro servisního účtu z proměnných prostředí a provádí autorizaci pomocí 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

Tento příklad používá proměnné prostředí k ověření pomocí hlavní služby pomocí OAuth a spuštění dotazu s ovladačem SQL Databricks pro 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();

Autorizace uživatele

Important

Autorizace uživatele je ve verzi Public Preview.

Autorizace uživatele, která se někdy označuje jako autorizaci jménem uživatele, umožňuje aplikaci Databricks Apps jednat s identitou uživatele aplikace. Azure Databricks předá přístupový token uživatele do aplikace, která token používá pro přístup k prostředkům jménem uživatele. Azure Databricks vynucuje všechna oprávnění na základě stávajících zásad katalogu Unity uživatele.

Ke správě bezpečnostních rizik aplikací, které jménem uživatele fungují, azure Databricks používá obory k omezení akcí, které může aplikace provádět prostřednictvím autorizace uživatele.

Použití autorizace uživatele v případě, že aplikace potřebuje respektovat jednotlivá uživatelská oprávnění. Mezi obvyklé případy použití patří:

  • Dotazování tabulek nebo svazků
  • Přístup ke skladům SQL nebo výpočetním prostředkům
  • Spouštění úloh nebo pracovních postupů svázaných s akcemi uživatelů

Všechny akce používají stávající oprávnění katalogu Unity uživatele:

Zobrazení způsobu ověřování uživatele v aplikaci

Autorizace uživatelů umožňuje jemně odstupňované řízení přístupu použitím funkcí katalogu Unity, jako jsou filtry na úrovni řádků a masky sloupců na aktivitu aplikace. Tento přístup udržuje řízení přístupu konzistentní s zásadami správného řízení pracovního prostoru a zabraňuje pevně zakódování logiky oprávnění do aplikace.

Jemně odstupňovaná oprávnění s autorizací uživatele

Když do aplikace přidáte autorizaci uživatele, vynutí stávající oprávnění katalogu Unity uživatele, včetně:

  • Filtry na úrovni řádků pro omezení viditelných řádků
  • Masky sloupců pro redakci nebo transformaci citlivých dat

Vzhledem k tomu, že Azure Databricks vyhodnocuje žádosti o autorizaci uživatelů s identitou uživatele, použijí se tyto zásady automaticky, když aplikace přistupuje k datům. Pokud například tabulka obsahuje filtr řádků, který omezuje viditelnost podle oblastí, aplikace vrátí jenom řádky, na které má uživatel povolený dotaz. V aplikaci není potřeba žádná další logika filtrování.

Tento přístup zabraňuje duplikování logiky řízení přístupu v kódu aplikace a zajišťuje konzistenci zásad správného řízení na úrovni pracovního prostoru. Když správci aktualizují zásady katalogu Unity, aplikace tyto změny automaticky respektuje.

Eskalace zabezpečení a oprávnění na základě oboru

Aplikace, které používají autorizaci uživatelů, musí deklarovat konkrétní obory autorizace, aby omezily, co aplikace může jménem uživatele dělat. Obory omezují přístup ke konkrétním rozhraním API nebo typům prostředků, například:

  • sql pro dotazování SQL datových skladů
  • dashboards.genie pro správu prostoru Genie
  • files.files pro správu souborů a adresářů

Pokud nevyberete žádné obory, Azure Databricks přiřadí výchozí sadu, která aplikaci umožní načíst základní informace o identitě uživatele:

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

Tato výchozí nastavení jsou nutná k podpoře funkcí autorizace uživatelů, ale neumožňují přístup k datům nebo výpočetním prostředkům. Při vytváření nebo úpravě aplikace přidejte další obory.

Obory vynucují princip nejnižší úrovně oprávnění. Nezapomeňte nakonfigurovat aplikaci tak, aby požadovala pouze obory, které potřebuje. Azure Databricks blokuje přístup ke všem funkcím mimo schválené obory, i když má uživatel oprávnění. Pokud například aplikace požaduje jenom sql obor, nemůže získat přístup k modelům obsluhujících koncové body, i když by uživatel mohl mimo aplikaci.

Když uživatel poprvé přistupuje k aplikaci, Azure Databricks ho vyzve k explicitní autorizaci aplikace tak, aby fungovala v rámci požadovaných oborů. Správci můžou volitelně udělit souhlas jménem uživatelů, aby zajistili soulad přístupu se zásadami organizace.

Přidání oborů do aplikace

Important

Autorizace uživatele je ve verzi Public Preview. Správce pracovního prostoru ho musí povolit, abyste mohli do aplikace přidat obory.

Po povolení autorizace uživatele je nutné restartovat existující aplikace, abyste do nich mohli přidat obory. Pokud zakážete autorizaci uživatelů, musíte restartovat existující aplikace, aby přestaly používat přístupový token aktuálního uživatele pro přístup k prostředkům.

Při vytváření nebo úpravě aplikace v uživatelském rozhraní Azure Databricks nakonfigurujte autorizaci uživatelů.

V kroku Konfigurace klikněte na +Přidat obor a vyberte obory, které definují, ke kterým rozhraním API nebo prostředkům Azure Databricks má aplikace přístup jménem uživatele. Azure Databricks vynucuje tyto obory za běhu a před udělením přístupu vyžaduje souhlas uživatele nebo správce.

Přidání oborů autorizace uživatelů do aplikace Databricks

Úplný příklad najdete v ukázce autorizace Databricks Apps na GitHubu. Ukázková aplikace ukazuje, jak používat modely autorizace aplikací i uživatelů a obsahuje pokyny k nastavení a ukázkové dotazy s autorizací uživatelů.

Načtení přihlašovacích údajů pro autorizaci uživatele

Pro autorizaci uživatelů Azure Databricks předá identitu a přístupový token uživatele do aplikace v hlavičce HTTP. Aby aplikace fungovala jménem uživatele, musí tyto hlavičky extrahovat.

Způsob načtení těchto hlaviček závisí na používaném rozhraní.

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 automaticky vloží objekt požadavku do funkce vaší aplikace, pokud ho deklarujete jako parametr. Není potřeba požadavek ručně vytvářet ani získávat.

Dash a 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')

Expresní

import express from 'express';

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

Příklad: Dotaz s autorizací uživatele

V takovém případě aplikace předá přístupový token uživatele přímo do konektoru a Azure Databricks na dotaz použije oprávnění uživatele.

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

Osvědčené postupy pro autorizaci uživatelů

Při vytváření aplikací, které provádějí akce jménem uživatelů, postupujte podle těchto osvědčených postupů, abyste zajistili zabezpečený a auditovatelný přístup:

  • Uložte kód aplikace do složek, které jsou přístupné jenom vlastníkovi aplikace nebo malé skupině důvěryhodných uživatelů.
  • Udělte CAN MANAGE oprávnění jenom důvěryhodným starším vývojářům, kteří zodpovídají za údržbu a kontrolu aplikací. Udělte CAN USE oprávnění jenom konkrétním uživatelům nebo skupinám, kteří jsou schváleni ke spuštění aplikace.
  • Ujistěte se, že se tokeny nevytisknou, nezaznamenají nebo nezapisují do souborů. Toto platí pro všechny logovací příkazy, ladicí nástroje a zpracování chyb. Například místo print(f"User token: {token}") použití headers = {"Authorization": f"Bearer {token}"}.
  • Nakonfigurujte každou aplikaci tak, aby požadovala pouze minimální požadované obory autorizace potřebné pro její funkčnost.
  • Během kontroly kódu ověřte, že nastavení oboru a oprávnění odpovídají požadavkům na zabezpečení a neudělují nepotřebný přístup.
  • Před nasazením do produkčních prostředí vynucujte recenzi typu peer pro veškerý kód aplikace.
  • Ujistěte se, že kód aplikace zaznamenává strukturované protokoly auditu pro každou akci prováděnou jménem uživatelů, včetně identity uživatele, typu akce, cílového prostředku a stavu.

Metody ověřování

K získání tokenů pro Databricks Apps se uživatelé i služební identity ověřují pomocí standardních toků OAuth 2.0. Metoda závisí na tom, jestli je volající uživatel nebo automatizovaná úloha.

Pro přihlášení k pracovnímu prostoru (pouze uživatelé):

  • Jednotné přihlašování (SSO): Uživatelé se ověřují prostřednictvím zprostředkovatele identity při konfiguraci jednotného přihlašování (SSO).
  • Jednorázové heslo : Uživatelé obdrží dočasné heslo, pokud není nakonfigurované jednotné přihlašování.

Procesy OAuth (aplikace a pracovní zátěže):

  • OAuth uživatele na počítač (U2M): Uživatelé se ověřují a výsledné tokeny umožňují autorizaci uživatelů, aby aplikace mohla jednat jménem uživatele.
  • OAuth pro stroj-k-stroji (M2M): Služební principálové se ověřují pomocí přihlašovacích údajů klienta nebo federace. Tyto tokeny podporují autorizaci aplikace, kde aplikace funguje jako sama sebe místo uživatele.

Pokyny k volání aplikace Databricks pomocí ověřování tokenů najdete v tématu Připojení k aplikaci API Databricks pomocí ověřování tokenů.

Porovnání a kombinování modelů

Aplikace Databricks můžou nezávisle nebo společně používat autorizaci aplikací a uživatelů. Tyto modely slouží k různým účelům a jsou navržené tak, aby fungovaly paralelně.

Model autorizace Kdy používat Příklady případů použití
Autorizace aplikace Když aplikace provádí operace, které nezávisí na identitě uživatele Zápis protokolů, přístup ke sdílené konfiguraci, volání externích služeb
Autorizace uživatele Když aplikace potřebuje přístup k prostředkům v kontextu aktuálního uživatele Dotazování na data katalogu Unity, spouštění výpočetních prostředků, vynucování oprávnění na úrovni řádků
Oboje Když aplikace provádí sdílené operace i operace specifické pro uživatele Protokolování metrik pomocí identity aplikace, dotazování filtrovaných dat pomocí identity uživatele