Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
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:
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:
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.:
-
sqlzum Abfragen von SQL-Lagerhäusern -
dashboards.geniezur Verwaltung Ihres Genie Space -
files.fileszum 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:readiam.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.
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 MANAGEBerechtigungen nur vertrauenswürdigen Leitenden Entwicklern, die für die App-Wartung und -Überprüfung verantwortlich sind. Erteilen SieCAN USEBerechtigungen 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 Sieheaders = {"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 |