Udostępnij przez


Konfigurowanie autoryzacji w aplikacji usługi Databricks

Usługa Databricks Apps obsługuje bezpieczne tworzenie aplikacji w usłudze Azure Databricks. Gdy aplikacje uzyskują dostęp do danych i usług w obszarze roboczym, muszą korzystać z mechanizmów uwierzytelniania i autoryzacji, które wymuszają kontrolę dostępu do danych i przestrzegają uprawnień użytkowników. Model autoryzacji usługi Databricks Apps jest oparty na protokole OAuth 2.0 i łączy uprawnienia przypisane do aplikacji z uprawnieniami użytkowników, którzy uzyskują do niej dostęp.

Aby obsługiwać tę strukturę, usługa Databricks Apps używa dwóch uzupełniających modeli tożsamości:

  • Autoryzacja aplikacji zapewnia aplikacji własną tożsamość ze spójnym zestawem uprawnień.
  • Autoryzacja użytkownika umożliwia aplikacji korzystanie z tożsamości i uprawnień użytkownika wchodzącego w interakcję z nią.

Autoryzacja aplikacji

Każda aplikacja Azure Databricks ma przypisaną dedykowaną jednostkę usługi, która pełni rolę jej tożsamości przy uzyskiwaniu dostępu do zasobów Azure Databricks. Zasada usługi jest unikatowa dla instancji aplikacji i nie może być ponownie użyta w różnych aplikacjach. Nie można zmienić jednostki usługi przypisanej do aplikacji ani określić istniejącej jednostki usługi podczas tworzenia aplikacji. Usługa Azure Databricks używa tej tożsamości do oceny uprawnień aplikacji niezależnie od dowolnego użytkownika, co zapewnia, że aplikacja może uzyskiwać dostęp tylko do zasobów jawnie udzielanych do niej, nawet poza kontekstem interakcji użytkownika.

Ta separacja pomaga wymusić granice zabezpieczeń, które umożliwiają inspekcję działań aplikacji i obsługują scenariusze, takie jak przetwarzanie w tle lub automatyczne zadania.

Podmiot usługi jest reprezentowany przez unikatowy identyfikator. Skopiuj go z zakładki Upoważnienia aplikacji:

Wyświetlanie obiektu zabezpieczeń w aplikacji Databricks

Podczas tworzenia aplikacji usługa Azure Databricks automatycznie aprowizuje dedykowaną jednostkę usługi dla aplikacji. Jednostka usługi pozostaje taka sama we wszystkich wdrożeniach aplikacji. Po usunięciu aplikacji usługa Azure Databricks usunie jednostkę usługi.

Użyj jednostki usługi w przypadku akcji, które aplikacja wykonuje samodzielnie, bez konieczności używania kontekstu pojedynczego użytkownika. Typowe przypadki użycia to:

  • Uruchamianie zadań w tle
  • Odczytywanie lub zapisywanie udostępnionej konfiguracji lub metadanych
  • Rejestrowanie aktywności lub metryk użycia
  • Wywoływanie usług zewnętrznych za pośrednictwem bezpiecznych punktów końcowych

Wszystkie akcje inicjowane przez aplikację używają uprawnień jednostki usługi. Udziel jednostce usługi dostępu do określonych zasobów przy użyciu standardowych przypisań uprawnień. Nie obsługuje jednak kontroli dostępu na poziomie użytkownika. Wszyscy użytkownicy, którzy wchodzą w interakcję z aplikacją, mają te same uprawnienia zdefiniowane dla jednostki usługi, co uniemożliwia aplikacji wymuszanie precyzyjnych zasad na podstawie tożsamości poszczególnych użytkowników.

Poniższy przykład pokazuje, jak aplikacja używa swojego zaufanego serwisu do wykonywania zapytań o dane w katalogu Unity.

Wyświetlanie sposobu uwierzytelniania jednostki usługi w aplikacji

W takim przypadku główna usługa wymaga jawnego dostępu zarówno do magazynu SQL, jak i tabeli Unity Catalog, do których wykonuje zapytania.

Ten model działa dobrze, gdy chcesz, aby wszyscy użytkownicy aplikacji widzieli te same dane lub gdy aplikacja wykonuje operacje udostępnione, które nie są powiązane z kontrolą dostępu specyficzną dla użytkownika.

Pobieranie poświadczeń autoryzacji aplikacji

W przypadku autoryzacji aplikacji usługa Azure Databricks automatycznie wprowadza poświadczenia jednostki usługi do środowiska aplikacji. Następujące zmienne środowiskowe przechowują wymagane wartości klienta OAuth:

Variable Description
DATABRICKS_CLIENT_ID Identyfikator klienta OAuth dla głównej usługi
DATABRICKS_CLIENT_SECRET Klucz tajny klienta OAuth podmiotu usługi

Usługa Azure Databricks automatycznie ustawia zmienne środowiskowe w środowisku uruchomieniowym aplikacji. Aplikacja używa tych zmiennych podczas uwierzytelniania się jako siebie.

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

Jeśli używasz zestawów SDK usługi Azure Databricks, zazwyczaj nie musisz ręcznie uzyskiwać dostępu do tych zmiennych środowiskowych. Zestawy SDK wykorzystują ujednolicone uwierzytelnianie i automatycznie wykrywają poświadczenia w środowisku.

Przykład: wykonywanie zapytań przy użyciu autoryzacji aplikacji

Python

W tym przykładzie użyto obiektu Config SDK, który pobiera poświadczenia jednostki usługi ze zmiennych środowiskowych i wykonuje uwierzytelnianie 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

W tym przykładzie użyto zmiennych środowiskowych do uwierzytelniania za pomocą jednostki usługi przy użyciu protokołu OAuth i uruchomienia zapytania za pomocą sterownika SQL usługi Databricks dla 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();

Autoryzacja użytkownika

Important

Autoryzacja użytkownika jest dostępna w publicznej wersji zapoznawczej.

Autoryzacja użytkownika, czasami nazywana autoryzacją w imieniu użytkownika, umożliwia aplikacji Databricks Apps działanie przy użyciu tożsamości użytkownika aplikacji. Usługa Azure Databricks przekazuje token dostępu użytkownika do aplikacji, który używa tokenu w celu uzyskania dostępu do zasobów w imieniu użytkownika. Usługa Azure Databricks wymusza wszystkie uprawnienia na podstawie istniejących zasad Unity Catalog użytkownika.

Aby zarządzać zagrożeniami bezpieczeństwa aplikacji działających w imieniu użytkownika, usługa Azure Databricks używa zakresów, aby ograniczyć akcje, które aplikacja może wykonywać za pośrednictwem autoryzacji użytkownika.

Zastosuj autoryzację użytkownika, gdy aplikacja musi przestrzegać indywidualnych uprawnień użytkownika. Typowe przypadki użycia to:

  • Wykonywanie zapytań dotyczących tabel lub woluminów
  • Uzyskiwanie dostępu do magazynów SQL lub zasobów obliczeniowych
  • Uruchamianie zadań lub przepływów pracy powiązanych z akcjami użytkownika

Wszystkie akcje używają istniejących uprawnień użytkownika z Unity Catalog.

Wyświetlanie sposobu uwierzytelniania użytkownika w aplikacji

Autoryzacja użytkownika umożliwia precyzyjną kontrolę dostępu przez zastosowanie funkcji Unity Catalog, takich jak filtry na poziomie wiersza i maski kolumn, w odniesieniu do aktywności aplikacji. Takie podejście zapewnia spójność kontroli dostępu z ładem obszaru roboczego i pozwala uniknąć trwałego kodowania logiki uprawnień w aplikacji.

Szczegółowe uprawnienia z autoryzacją użytkownika

Po dodaniu autoryzacji użytkownika w aplikacji wymusza istniejące uprawnienia Unity Catalog użytkownika, w tym:

  • Filtry na poziomie wiersza w celu ograniczenia widocznych wierszy
  • Maski kolumn w celu zredagowania lub przekształcania poufnych danych

Ponieważ usługa Azure Databricks ocenia żądania autoryzacji użytkownika przy użyciu tożsamości użytkownika, te zasady są stosowane automatycznie, gdy aplikacja uzyskuje dostęp do danych. Jeśli na przykład tabela zawiera filtr wierszy, który ogranicza widoczność według regionu, aplikacja zwraca tylko wiersze, które użytkownik może wykonać zapytanie. W aplikacji nie jest wymagana żadna dodatkowa logika filtrowania.

Takie podejście pozwala uniknąć duplikowania logiki kontroli dostępu w kodzie aplikacji i zapewnia spójność z ładem na poziomie obszaru roboczego. Gdy administratorzy aktualizują zasady Katalogu Unity, aplikacja automatycznie uwzględnia te zmiany.

Zabezpieczenia oparte na zakresie i eskalacja uprawnień

Aplikacje korzystające z autoryzacji użytkownika muszą zadeklarować określone zakresy autoryzacji, aby ograniczyć możliwości aplikacji w imieniu użytkownika. Zakresy ograniczają dostęp do określonych interfejsów API lub typów zasobów, takich jak:

  • sql do wykonywania zapytań dotyczących magazynów SQL
  • dashboards.genie do zarządzania przestrzenią Genie
  • files.files do zarządzania plikami i katalogami

Jeśli nie wybierzesz żadnych zakresów, usługa Azure Databricks przypisuje zestaw domyślny, który umożliwia aplikacji pobieranie podstawowych informacji o tożsamości użytkownika:

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

Te wartości domyślne są wymagane do obsługi funkcji autoryzacji użytkownika, ale nie zezwalają na dostęp do danych ani zasobów obliczeniowych. Dodaj dodatkowe zakresy podczas tworzenia lub edytowania aplikacji.

Zakresy wymuszają zasadę najniższych uprawnień. Pamiętaj, aby skonfigurować aplikację tak, aby żądała tylko wymaganych zakresów. Usługa Azure Databricks blokuje dostęp do wszystkich funkcji poza zatwierdzonymi zakresami, nawet jeśli użytkownik ma uprawnienia. Jeśli na przykład aplikacja żąda tylko sql zakresu, nie może uzyskać dostępu do modelu obsługującego punkty końcowe, nawet jeśli użytkownik może poza aplikacją.

Gdy użytkownik po raz pierwszy uzyskuje dostęp do aplikacji, usługa Azure Databricks wyświetla monit o jawne autoryzowanie aplikacji do działania w żądanych zakresach. Administratorzy mogą opcjonalnie udzielać zgody w imieniu użytkowników w celu dostosowania dostępu do zasad organizacji.

Dodawanie zakresów do aplikacji

Important

Autoryzacja użytkownika jest dostępna w publicznej wersji zapoznawczej. Administrator obszaru roboczego musi go włączyć przed dodaniem zakresów do aplikacji.

Po włączeniu autoryzacji użytkownika przed dodaniem do nich zakresów należy ponownie uruchomić istniejące aplikacje. Jeśli wyłączysz autoryzację użytkownika, musisz ponownie uruchomić istniejące aplikacje, aby przestać używać tokenu dostępu bieżącego użytkownika w celu uzyskania dostępu do zasobów.

Konfigurowanie autoryzacji użytkownika podczas tworzenia lub edytowania aplikacji w interfejsie użytkownika usługi Azure Databricks.

W kroku Konfigurowanie kliknij pozycję +Dodaj zakres i wybierz zakresy definiujące, do których interfejsów API lub zasobów usługi Azure Databricks aplikacja może uzyskiwać dostęp w imieniu użytkownika. Usługa Azure Databricks wymusza te zakresy w czasie wykonywania i wymaga zgody użytkownika lub administratora przed udzieleniem dostępu.

Dodawanie zakresów autoryzacji użytkownika do aplikacji usługi Databricks

Pełny przykład można znaleźć w pokazie autoryzacji usługi Databricks Apps w witrynie GitHub. Przykładowa aplikacja pokazuje, jak używać modeli autoryzacji aplikacji i użytkowników oraz zawiera instrukcje konfiguracji i przykładowe zapytania z autoryzacją użytkownika.

Pobieranie poświadczeń autoryzacji użytkownika

W przypadku autoryzacji użytkownika usługa Azure Databricks przekazuje tożsamość użytkownika i token dostępu do aplikacji w nagłówkach HTTP. Aplikacja musi wyodrębnić te nagłówki, aby działały w imieniu użytkownika.

Sposób pobierania tych nagłówków zależy od używanej platformy.

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 automatycznie wprowadza obiekt żądania do funkcji aplikacji, jeśli deklarujesz go jako parametr. Nie musisz tworzyć ani pobierać żądania ręcznie.

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

Ekspresowy

import express from 'express';

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

Przykład: zapytanie z autoryzacją użytkownika

W takim przypadku aplikacja przekazuje token dostępu użytkownika bezpośrednio do łącznika, a usługa Azure Databricks stosuje uprawnienia użytkownika do zapytania.

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

Najlepsze rozwiązania dotyczące autoryzacji użytkowników

Podczas tworzenia aplikacji, które wykonują akcje w imieniu użytkowników, postępuj zgodnie z tymi najlepszymi rozwiązaniami, aby zapewnić bezpieczny i możliwy do inspekcji dostęp:

  • Umieść kod aplikacji w folderach dostępnych tylko dla właściciela aplikacji lub małego zestawu zaufanych użytkowników.
  • Udzielanie CAN MANAGE uprawnień tylko zaufanym starszym deweloperom, którzy są odpowiedzialni za konserwację i przegląd aplikacji. Przyznaj CAN USE uprawnienia tylko określonym użytkownikom lub grupom zatwierdzonym do uruchamiania aplikacji.
  • Upewnij się, że tokeny nie są drukowane, rejestrowane ani zapisywane w plikach. Dotyczy to wszystkich instrukcji rejestrowania, narzędzi debugowania i procedur obsługi błędów. Na przykład zamiast print(f"User token: {token}") użyj headers = {"Authorization": f"Bearer {token}"}.
  • Skonfiguruj każdą aplikację, aby żądać tylko minimalnych wymaganych zakresów autoryzacji wymaganych do jej funkcjonalności.
  • Podczas przeglądu kodu sprawdź, czy ustawienia zakresu i uprawnień są zgodne z wymaganiami dotyczącymi zabezpieczeń i nie udzielają niepotrzebnego dostępu.
  • Zadbaj o recenzję kodu przez rówieśników dla całego kodu aplikacji przed wdrożeniem do środowisk produkcyjnych.
  • Upewnij się, że kod aplikacji rejestruje ustrukturyzowane dzienniki inspekcji dla każdej akcji wykonywanej w imieniu użytkowników, w tym tożsamości użytkownika, typu akcji, zasobu docelowego i stanu.

Metody uwierzytelniania

Aby uzyskać tokeny dla usługi Databricks Apps, zarówno użytkownicy, jak i jednostki usługi uwierzytelniają się przy użyciu standardowych przepływów protokołu OAuth 2.0. Metoda zależy od tego, czy obiekt wywołujący jest użytkownikiem, czy zautomatyzowanym obciążeniem.

W przypadku logowania do obszaru roboczego (tylko użytkownicy):

  • Logowanie jednokrotne (SSO): Użytkownicy uwierzytelniają się za pośrednictwem dostawcy tożsamości po skonfigurowaniu logowania jednokrotnego.
  • Hasło jednorazowe (OTP): Użytkownicy otrzymują hasło tymczasowe, jeśli logowanie jednokrotne nie jest skonfigurowane.

W przypadku przepływów OAuth (aplikacje i obciążenia):

Aby uzyskać instrukcje dotyczące wywoływania aplikacji usługi Databricks przy użyciu uwierzytelniania tokenu, zobacz Nawiązywanie połączenia z aplikacją usługi API Databricks przy użyciu uwierzytelniania tokenu.

Porównywanie i łączenie modeli

Aplikacje usługi Databricks mogą używać autoryzacji aplikacji i użytkownika niezależnie lub razem. Te modele służą różnym celom i są przeznaczone do równoległej pracy.

Model autoryzacji Kiedy należy używać Przykładowe przypadki użycia
Autoryzacja aplikacji Gdy aplikacja wykonuje operacje, które nie zależą od tożsamości użytkownika Pisanie dzienników, uzyskiwanie dostępu do konfiguracji udostępnionej, wywoływanie usług zewnętrznych
Autoryzacja użytkownika Gdy aplikacja musi uzyskać dostęp do zasobów w kontekście bieżącego użytkownika Wykonywanie zapytań do danych Unity Catalog, uruchamianie procesów obliczeniowych i egzekwowanie uprawnień na poziomie wiersza
Both Gdy aplikacja wykonuje zarówno operacje współużytkowane, jak i specyficzne dla użytkownika Rejestrowanie metryk przy użyciu tożsamości aplikacji, wykonywanie zapytań dotyczących filtrowanych danych przy użyciu tożsamości użytkownika