Freigeben über


Konfigurieren der Autorisierung in einer Databricks-App

Databricks Apps unterstützt die sichere Anwendungsentwicklung in Azure Databricks. Wenn Apps innerhalb eines Arbeitsbereichs auf Daten und Dienste zugreifen, müssen sie Authentifizierungs- und Autorisierungsmechanismen verwenden, die Datenzugriffskontrollen erzwingen und Benutzerberechtigungen respektieren. Das Databricks Apps-Autorisierungsmodell basiert auf OAuth 2.0 und kombiniert die Berechtigungen, die der App zugewiesen sind, mit denen des Benutzers, der darauf zugreift.

Um dieses Framework zu unterstützen, verwendet Databricks Apps zwei ergänzende Identitätsmodelle:

  • Die App-Autorisierung gibt der App eine eigene Identität mit einem konsistenten Satz von Berechtigungen.
  • Die Benutzerautorisierung ermöglicht der App die Verwendung der Identität und berechtigungen des Benutzers, der damit interagiert.

App-Autorisierung

Jede Azure Databricks-App verfügt über einen speziellen Dienstprinzipal, der als seine Identität fungiert, wenn sie auf Azure Databricks-Ressourcen zugreift. Dieser Dienstprinzipal ist für die App-Instanz eindeutig und kann nicht in allen Apps wiederverwendet werden. Sie können den Dienstprinzipal, der einer App zugewiesen ist, nicht ändern oder während der App-Erstellung einen vorhandenen Dienstprinzipal angeben. Azure Databricks verwendet diese Identität, um die Berechtigungen der App unabhängig von jedem Benutzer auszuwerten, wodurch sichergestellt wird, dass die App nur auf die ihr explizit zugewiesenen Ressourcen zugreifen kann, selbst außerhalb des Kontexts einer Benutzerinteraktion.

Diese Trennung hilft beim Erzwingen von Sicherheitsgrenzen, wodurch die Überwachung von App-Aktivitäten ermöglicht und Szenarien wie Hintergrundverarbeitung oder automatisierte Aufgaben unterstützt werden.

Der Dienstprinzipal wird durch eine eindeutige ID repräsentiert. Kopieren Sie dies aus der Registerkarte "Autorisierung" der App.

Ansicht des Dienstprinzipals in einer Databricks-App

Wenn Sie eine App erstellen, stellt Azure Databricks automatisch einen dedizierten Dienstprinzipal für die App fest. Der Dienstprinzipal bleibt für alle Bereitstellungen der App gleich. Wenn Sie die App löschen, löscht Azure Databricks den Dienstprinzipal.

Verwenden Sie den Dienstprinzipal für Aktionen, die die App eigenständig ausführt, ohne dass der Kontext eines einzelnen Benutzers erforderlich ist. Gängige Anwendungsfälle:

  • Ausführen von Hintergrundaufgaben
  • Lesen oder Schreiben freigegebener Konfigurationen oder Metadaten
  • Protokollierung von Aktivitäts- oder Nutzungsmetriken
  • Aufrufen externer Dienste über sichere Endpunkte

Alle aktionen, die von der App initiiert werden, verwenden die Berechtigungen des Dienstprinzipals. Gewähren Sie dem Dienstprinzipal Zugriff auf bestimmte Ressourcen mithilfe von Standardberechtigungszuweisungen. Die Zugriffssteuerung auf Benutzerebene wird jedoch nicht unterstützt. Alle Benutzer, die mit der App interagieren, teilen die gleichen Berechtigungen, die für den Dienstprinzipal definiert sind, was verhindert, dass die App abgestimmte Richtlinien basierend auf der individuellen Benutzeridentität durchsetzt.

Das folgende Beispiel zeigt, wie eine App ihren Dienstprinzipal verwendet, um Daten im Unity-Katalog abzufragen:

Sicht, wie ein Dienstprinzipal in einer App authentifiziert

In diesem Fall benötigt der Dienstprinzipal expliziten Zugriff sowohl auf das SQL-Datenlager als auch auf die Unity-Katalogtabelle, die er abfragt.

Dieses Modell eignet sich gut, wenn alle Benutzer der App dieselben Daten sehen sollen oder wenn die App freigegebene Vorgänge ausführt, die nicht an benutzerspezifische Zugriffssteuerungen gebunden sind.

Abrufen von App-Autorisierungsdaten

Für die Autorisierung von Apps injiziert Azure Databricks automatisch Dienstprinzipal-Anmeldeinformationen in die Umgebung der App. Die folgenden Umgebungsvariablen enthalten die erforderlichen OAuth-Clientwerte:

Variable BESCHREIBUNG
DATABRICKS_CLIENT_ID Dienstprinzipal OAuth-Client-ID
DATABRICKS_CLIENT_SECRET Dienstprinzipal OAuth geheimer Clientschlüssel

Azure Databricks legt die Umgebungsvariablen automatisch in der App-Laufzeit fest. Die App verwendet diese Variablen, wenn sie sich als selbst authentifiziert.

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;

Hinweis

Wenn Sie die Azure Databricks-SDKs verwenden, müssen Sie in der Regel nicht manuell auf diese Umgebungsvariablen zugreifen. Die SDKs folgen der einheitlichen Authentifizierung und erkennen automatisch Anmeldeinformationen in der Umgebung.

Beispiel: Abfrage mit App-Autorisierung

Python

In diesem Beispiel wird das SDK Config-Objekt verwendet, das Dienstkonto-Anmeldeinformationen aus Umgebungsvariablen abruft und eine OAuth-Authentifizierung durchführt.

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

In diesem Beispiel werden Umgebungsvariablen verwendet, um sich mit einem Dienstprinzipal mithilfe von OAuth zu authentifizieren und eine Abfrage mit dem Databricks SQL-Treiber für Node.jsauszuführen.

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

Benutzerautorisierung

Von Bedeutung

Die Benutzerautorisierung befindet sich in der öffentlichen Vorschau.

Benutzerautorisierung, manchmal auch als „On-Behalf-Of-Benutzer-Autorisierung“ bezeichnet, ermöglicht es einer Databricks Apps App, mit der Identität des App-Benutzers zu agieren. Azure Databricks leitet das Zugriffstoken des Benutzers an die App weiter, das das Token für den Zugriff auf Ressourcen im Namen des Benutzers verwendet. Azure Databricks erzwingt alle Berechtigungen basierend auf den vorhandenen Unity-Katalogrichtlinien des Benutzers.

Um die Sicherheitsrisiken von Apps zu verwalten, die im Auftrag eines Benutzers handeln, verwendet Azure Databricks Bereiche, um einzuschränken, welche Aktionen eine App über die Benutzerautorisierung ausführen kann.

Wenden Sie die Benutzerautorisierung an, wenn die App einzelne Benutzerberechtigungen respektieren muss. Typische Anwendungsfälle sind:

  • Abfragen von Tabellen oder Volumes
  • Zugriff auf SQL-Warehouses oder Rechenressourcen
  • Ausführen von Aufträgen oder Workflows, die an Benutzeraktionen gebunden sind

Alle Aktionen verwenden die vorhandenen Unity-Katalogberechtigungen des Benutzers:

Anzeigen der Authentifizierung eines Benutzers in einer App

Die Benutzerautorisierung ermöglicht eine differenzierte Zugriffssteuerung, indem Unity-Katalogfeatures wie Filter auf Zeilenebene und Spaltenmasken auf App-Aktivitäten angewendet werden. Dieser Ansatz sorgt dafür, dass die Zugriffssteuerung mit der Governance des Arbeitsbereichs übereinstimmt und vermeidet es, Berechtigungslogik fest in die App einzuprogrammieren.

Abgestimmte Berechtigungen mit Benutzerautorisierung

Wenn Sie einer App eine Benutzerautorisierung hinzufügen, erzwingt sie die vorhandenen Unity-Katalogberechtigungen des Benutzers, einschließlich:

  • Filter auf Zeilenebene zum Einschränken sichtbarer Zeilen
  • Spaltenmasken zum Redigieren oder Transformieren vertraulicher Daten

Da Azure Databricks Benutzerautorisierungsanforderungen mit der Identität des Benutzers auswertet, gelten diese Richtlinien automatisch, wenn die App auf Daten zugreift. Wenn eine Tabelle beispielsweise einen Zeilenfilter enthält, der die Sichtbarkeit nach Region begrenzt, gibt die App nur die Zeilen zurück, die der Benutzer abfragen darf. In der App ist keine zusätzliche Filterlogik erforderlich.

Bei diesem Ansatz wird vermieden, die Zugriffssteuerungslogik im Anwendungscode zu duplizieren und die Konsistenz mit der Governance auf Arbeitsbereichsebene zu gewährleisten. Wenn Administratoren Unity-Katalogrichtlinien aktualisieren, berücksichtigt die App diese Änderungen automatisch.

Bereichsbasierte Sicherheits- und Berechtigungseskalation

Apps, die die Benutzerautorisierung verwenden, müssen bestimmte Autorisierungsbereiche deklarieren, um zu begrenzen, was die App im Namen des Benutzers tun kann. Bereiche beschränken den Zugriff auf bestimmte APIs oder Ressourcentypen, z. B.:

  • sql zum Abfragen von SQL-Lagerhäusern
  • dashboards.genie zur Verwaltung Ihres Genie Space
  • files.files zum Verwalten Von Dateien und Verzeichnissen

Wenn Sie keine Bereiche auswählen, weist Azure Databricks einen Standardsatz zu, mit dem die App grundlegende Benutzeridentitätsinformationen abrufen kann:

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

Diese Standardwerte sind erforderlich, um die Benutzerautorisierungsfunktionen zu unterstützen, aber sie erlauben keinen Zugriff auf Daten oder Computeressourcen. Fügen Sie zusätzliche Bereiche hinzu, wenn Sie die App erstellen oder bearbeiten.

Bereiche erzwingen das Prinzip der geringsten Berechtigung. Konfigurieren Sie die App so, dass nur die benötigten Bereiche angefordert werden. Azure Databricks blockiert den Zugriff auf alle Funktionen außerhalb der genehmigten Bereiche, auch wenn der Benutzer über die Berechtigung verfügt. Wenn die App beispielsweise nur den sql Bereich anfordert, kann sie nicht auf das Modell zugreifen, das Endpunkte bedient, auch wenn der Benutzer außerhalb der App zugreifen kann.

Wenn ein Benutzer zum ersten Mal auf eine App zugreift, fordert Azure Databricks sie auf, die App explizit zu autorisieren, innerhalb der angeforderten Bereiche zu handeln. Administratoren können optional die Zustimmung im Namen der Benutzer erteilen, um den Zugriff auf Organisationsrichtlinien auszurichten.

Reservierungsumfang zu einer Anwendung hinzufügen

Von Bedeutung

Die Benutzerautorisierung befindet sich in der öffentlichen Vorschau. Ihr Arbeitsbereichsadministrator muss sie aktivieren, bevor Sie Ihrer App Bereiche hinzufügen können.

Nach dem Aktivieren der Benutzerautorisierung müssen Sie vorhandene Apps neu starten, bevor Sie diesen Bereiche hinzufügen können. Wenn Sie die Benutzerautorisierung deaktivieren, müssen Sie vorhandene Apps neu starten, damit sie das Zugriffstoken des aktuellen Benutzers für den Zugriff auf Ressourcen beenden können.

Konfigurieren Sie die Benutzerautorisierung, wenn Sie eine App in der Azure Databricks-Benutzeroberfläche erstellen oder bearbeiten.

Klicken Sie im Schritt "Konfigurieren" auf "+Bereich hinzufügen ", und wählen Sie die Bereiche aus, die definieren, auf welche Azure Databricks-APIs oder -Ressourcen die App im Namen des Benutzers zugreifen kann. Zur Laufzeit erzwingt Azure Databricks diese Umfänge und erfordert die Zustimmung des Benutzers oder Administrators, bevor der Zugriff gewährt wird.

Hinzufügen von Benutzerautorisierungsbereichen zu einer Databricks-App

Ein vollständiges Beispiel finden Sie in der Databricks Apps-Autorisierungsdemo auf GitHub. Die Beispiel-App zeigt, wie Sie sowohl App- als auch Benutzerautorisierungsmodelle verwenden und Setupanweisungen und Beispielabfragen mit Benutzerautorisierung enthalten.

Anmeldeinformationen des Benutzers abrufen

Bei der Benutzerautorisierung leitet Azure Databricks die Identität und das Zugriffstoken des Benutzers in HTTP-Headern an die App weiter. Die App muss diese Kopfzeilen extrahieren, um im Namen des Benutzers zu handeln.

Wie Sie diese Header abrufen, hängt vom verwendeten Framework ab.

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 fügt das Anforderungsobjekt automatisch in die Funktion Ihrer App ein, wenn Sie es als Parameter deklarieren. Sie müssen die Anforderung nicht manuell erstellen oder abrufen.

Gedankenstrich und Flask

from flask import request

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

Glänzend

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

Express

import express from 'express';

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

Beispiel: Abfrage mit Benutzerautorisierung

In diesem Fall übergibt die App das Zugriffstoken des Benutzers direkt an den Connector, und Azure Databricks wendet die Berechtigungen des Benutzers auf die Abfrage an.

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

Bewährte Methoden für die Benutzerautorisierung

Wenn Sie Apps erstellen, die Aktionen im Auftrag von Benutzern ausführen, befolgen Sie die folgenden bewährten Methoden, um einen sicheren und auditierbaren Zugriff sicherzustellen:

  • Speichern Sie App-Code in Ordnern, auf die nur der App-Besitzer oder eine kleine Gruppe vertrauenswürdiger Benutzer zugreifen können.
  • Erteilen Sie CAN MANAGE Berechtigungen nur vertrauenswürdigen Leitenden Entwicklern, die für die App-Wartung und -Überprüfung verantwortlich sind. Erteilen Sie CAN USE Berechtigungen nur bestimmten Benutzern oder Gruppen, die zum Ausführen der App genehmigt wurden.
  • Stellen Sie sicher, dass Token nicht gedruckt, protokolliert oder in Dateien geschrieben werden. Dies gilt für alle Protokollierungsanweisungen, Debuggingtools und Fehlerhandler. Beispiel: Statt print(f"User token: {token}") verwenden Sie headers = {"Authorization": f"Bearer {token}"}.
  • Konfigurieren Sie jede App so, dass nur die mindestens erforderlichen Autorisierungsbereiche angefordert werden, die für ihre Funktionalität erforderlich sind.
  • Überprüfen Sie während der Codeüberprüfung, ob Bereichs- und Berechtigungseinstellungen den Sicherheitsanforderungen entsprechen und keinen unnötigen Zugriff gewähren.
  • Erzwingen Sie die Peer-Überprüfung für den gesamten App-Code, bevor er in Produktionsumgebungen bereitgestellt wird.
  • Stellen Sie sicher, dass ihr App-Code strukturierte Überwachungsprotokolle für jede Aktion erfasst, die im Auftrag von Benutzern ausgeführt wird, einschließlich der Benutzeridentität, des Aktionstyps, der Zielressource und des Status.

Authentifizierungsmethoden

Um Token für Databricks-Apps abzurufen, authentifizieren sich Sowohl Benutzer als auch Dienstprinzipale mithilfe von OAuth 2.0-Standardflüssen. Die Methode hängt davon ab, ob der Aufrufer ein Benutzer oder eine automatisierte Workload ist.

Für arbeitsbereichsanmeldung (nur Benutzer):

  • Einmaliges Anmelden (Single Sign-On, SSO): Benutzer authentifizieren sich über Ihren Identitätsanbieter, wenn einmaliges Anmelden (Single Sign-On, SSO) konfiguriert ist.
  • Einmaliges Kennwort (OTP): Benutzer erhalten ein temporäres Kennwort, wenn SSO nicht konfiguriert ist.

Für OAuth-Flüsse (Apps und Workloads):

  • Benutzer-zu-Computer (U2M) OAuth: Benutzer authentifizieren sich, und die resultierenden Token ermöglichen die Benutzerautorisierung, damit die App im Namen des Benutzers handeln kann.
  • Machine-to-Machine (M2M) OAuth: Dienstprinzipale authentifizieren sich mithilfe von Clientanmeldeinformationen oder Partnerverbund. Diese Token untermauern die App-Autorisierung, wobei die App anstelle eines Benutzers als sich selbst fungiert.

Anweisungen zum Aufrufen einer Databricks-App mithilfe der Tokenauthentifizierung finden Sie unter Herstellen einer Verbindung mit einer API Databricks-App mithilfe der Tokenauthentifizierung.

Vergleichen und Kombinieren von Modellen

Databricks-Apps können die App- und Benutzerautorisierung unabhängig oder gemeinsam verwenden. Diese Modelle dienen unterschiedlichen Zwecken und sind für die parallele Arbeit konzipiert.

Autorisierungsmodell Wann verwenden Beispielhafte Anwendungsfälle
App-Autorisierung Wenn die App Vorgänge ausführt, die nicht von der Identität des Benutzers abhängen Schreiben von Protokollen, Zugreifen auf freigegebene Konfiguration, Aufrufen externer Dienste
Benutzerautorisierung Wenn die App im Kontext des aktuellen Benutzers auf Ressourcen zugreifen muss Abfragen von Unity-Katalogdaten, Starten von Compute, Erzwingen von Berechtigungen auf Zeilenebene
Beide Wenn die App freigegebene und benutzerspezifische Vorgänge ausführt Protokollieren von Metriken mit App-Identität, Abfragen gefilterter Daten mit Benutzeridentität