Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Aplikasi Databricks mendukung pengembangan aplikasi yang aman di Azure Databricks. Saat aplikasi mengakses data dan layanan dalam ruang kerja, aplikasi harus menggunakan mekanisme autentikasi dan otorisasi yang memberlakukan kontrol akses data dan menghormati izin pengguna. Model otorisasi Aplikasi Databricks didasarkan pada OAuth 2.0 dan menggabungkan izin yang ditetapkan ke aplikasi dengan pengguna yang mengaksesnya.
Untuk mendukung kerangka kerja ini, Databricks Apps menggunakan dua model identitas pelengkap:
- Otorisasi aplikasi memberi aplikasi identitasnya sendiri dengan serangkaian izin yang konsisten.
- Otorisasi pengguna memungkinkan aplikasi untuk menggunakan identitas dan izin pengguna yang berinteraksi dengannya.
Otorisasi aplikasi
Setiap aplikasi Azure Databricks memiliki perwakilan layanan khusus yang bertindak sebagai identitasnya saat mengakses sumber daya Azure Databricks. Principal layanan ini unik untuk instans aplikasi dan tidak dapat digunakan kembali antar aplikasi. Anda tidak dapat mengubah perwakilan layanan yang ditetapkan ke aplikasi atau menentukan perwakilan layanan yang ada selama pembuatan aplikasi. Azure Databricks menggunakan identitas ini untuk mengevaluasi izin aplikasi secara independen dari pengguna mana pun, yang memastikan bahwa aplikasi hanya dapat mengakses sumber daya yang secara eksplisit diberikan kepadanya, bahkan di luar konteks interaksi pengguna.
Pemisahan ini membantu menerapkan batas keamanan, yang memungkinkan audit aktivitas aplikasi dan mendukung skenario seperti pemrosesan latar belakang atau tugas otomatis.
Prinsipal layanan diwakili oleh ID yang unik. Salin dari tab Otorisasi aplikasi:
Saat Anda membuat aplikasi, Azure Databricks secara otomatis menyediakan perwakilan layanan khusus untuk aplikasi. Perwakilan layanan tetap sama di semua penyebaran aplikasi. Saat Anda menghapus aplikasi, Azure Databricks menghapus perwakilan layanan.
Gunakan principal layanan untuk tindakan yang dilakukan oleh aplikasi itu sendiri, tanpa memerlukan konteks pengguna individual. Kasus penggunaan umum meliputi:
- Menjalankan tugas latar belakang
- Membaca atau menulis konfigurasi atau metadata bersama
- Aktivitas pengelogan atau metrik penggunaan
- Memanggil layanan eksternal melalui titik akhir yang aman
Semua tindakan yang dimulai oleh aplikasi menggunakan izin perwakilan layanan. Berikan akses perwakilan layanan ke sumber daya tertentu menggunakan pengaturan izin standar. Namun, ini tidak mendukung kontrol akses tingkat pengguna. Semua pengguna yang berinteraksi dengan aplikasi memiliki izin yang sama yang ditentukan untuk principal layanan, yang mencegah aplikasi menerapkan kebijakan terperinci berdasarkan identitas pengguna individu.
Contoh berikut menunjukkan bagaimana aplikasi menggunakan perwakilan layanannya untuk mengkueri data di Unity Catalog:
Dalam hal ini, perwakilan layanan memerlukan akses eksplisit ke gudang SQL dan tabel Katalog Unity yang dikuerinya.
Model ini berfungsi dengan baik ketika Anda ingin semua pengguna aplikasi melihat data yang sama atau ketika aplikasi melakukan operasi bersama yang tidak terkait dengan kontrol akses khusus pengguna.
Mengambil kredensial otorisasi aplikasi
Untuk otorisasi aplikasi, Azure Databricks secara otomatis menyuntikkan kredensial perwakilan layanan ke lingkungan aplikasi. Variabel lingkungan berikut menyimpan nilai klien OAuth yang diperlukan:
| Variable | Description |
|---|---|
DATABRICKS_CLIENT_ID |
ID klien OAuth perwakilan layanan |
DATABRICKS_CLIENT_SECRET |
Rahasia klien OAuth perwakilan layanan |
Azure Databricks mengatur variabel lingkungan secara otomatis dalam runtime aplikasi. Aplikasi ini menggunakan variabel ini saat mengautentikasi sebagai dirinya sendiri.
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
Jika Anda menggunakan Azure Databricks SDK, Anda biasanya tidak perlu mengakses variabel lingkungan ini secara manual. SDK mengikuti autentikasi terpadu dan secara otomatis mendeteksi kredensial di lingkungan.
Contoh: Kueri dengan otorisasi aplikasi
Python
Contoh ini menggunakan objek Konfigurasi SDK, yang menarik kredensial perwakilan layanan dari variabel lingkungan dan melakukan otorisasi 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
Contoh ini menggunakan variabel lingkungan untuk mengautentikasi dengan perwakilan layanan menggunakan OAuth dan menjalankan kueri dengan Driver SQL Databricks untuk 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();
Otorisasi pengguna
Important
Otorisasi pengguna ada di Pratinjau Umum.
Otorisasi pengguna, terkadang disebut sebagai otorisasi atas nama pengguna, memungkinkan aplikasi Aplikasi Databricks bertindak dengan identitas pengguna aplikasi. Azure Databricks meneruskan token akses pengguna ke aplikasi, yang menggunakan token untuk mengakses sumber daya atas nama pengguna. Azure Databricks memberlakukan semua izin berdasarkan kebijakan Katalog Unity pengguna yang ada.
Untuk mengelola risiko keamanan aplikasi yang bertindak atas nama pengguna, Azure Databricks menggunakan cakupan untuk membatasi tindakan apa yang dapat dilakukan aplikasi melalui otorisasi pengguna.
Terapkan otorisasi pengguna saat aplikasi perlu menghormati izin pengguna individual. Kasus penggunaan umum meliputi:
- Mengkueri tabel atau volume
- Mengakses gudang atau komputasi SQL
- Menjalankan pekerjaan atau alur kerja yang terkait dengan tindakan pengguna
Semua tindakan menggunakan izin Katalog Unity yang ada dari pengguna:
Otorisasi pengguna memungkinkan kontrol akses halus dengan menerapkan fitur Katalog Unity seperti filter tingkat baris dan masker kolom ke aktivitas aplikasi. Pendekatan ini menjaga kontrol akses tetap konsisten dengan tata kelola ruang kerja dan menghindari memasukkan logika izin secara langsung ke dalam aplikasi.
Izin terperinci dengan otorisasi pengguna
Saat Anda menambahkan otorisasi pengguna ke aplikasi, aplikasi memberlakukan izin Unity Catalog pengguna yang sudah ada, termasuk:
- Filter tingkat baris untuk membatasi baris yang terlihat
- Masker kolom untuk menyunting atau mengubah data sensitif
Karena Azure Databricks mengevaluasi permintaan otorisasi pengguna dengan identitas pengguna, kebijakan ini berlaku secara otomatis saat aplikasi mengakses data. Misalnya, jika tabel menyertakan filter baris yang membatasi visibilitas menurut wilayah, aplikasi hanya mengembalikan baris yang diizinkan untuk dikueri pengguna. Tidak diperlukan logika pemfilteran tambahan di aplikasi.
Pendekatan ini menghindari duplikasi logika kontrol akses dalam kode aplikasi dan memastikan konsistensi dengan tata kelola tingkat ruang kerja. Saat admin memperbarui kebijakan Katalog Unity, aplikasi secara otomatis menghormati perubahan tersebut.
Kontrol berbasis cakupan dan eskalasi hak istimewa
Aplikasi yang menggunakan otorisasi pengguna harus menyatakan cakupan otorisasi tertentu untuk membatasi apa yang dapat dilakukan aplikasi atas nama pengguna. Cakupan membatasi akses ke API atau jenis sumber daya tertentu, seperti:
-
sqluntuk mengkueri gudang SQL -
dashboards.genieuntuk mengelola ruang Genie Anda -
files.filesuntuk mengelola file dan direktori Anda
Jika Anda tidak memilih cakupan apa pun, Azure Databricks menetapkan set default yang memungkinkan aplikasi untuk mengambil informasi identitas pengguna dasar:
iam.access-control:readiam.current-user:read
Default ini diperlukan untuk mendukung fungsionalitas otorisasi pengguna, tetapi tidak mengizinkan akses ke data atau sumber daya komputasi. Tambahkan cakupan tambahan saat Anda membuat atau mengedit aplikasi.
Ruang lingkup memberlakukan prinsip hak akses minimum. Pastikan untuk mengonfigurasi aplikasi untuk meminta hanya cakupan yang dibutuhkannya. Azure Databricks memblokir akses ke fungsionalitas apa pun di luar cakupan yang disetujui, bahkan jika pengguna memiliki izin. Misalnya, jika aplikasi hanya meminta cakupan sql, aplikasi tidak dapat mengakses model pada endpoint, bahkan jika pengguna dapat melakukannya di luar aplikasi.
Saat pengguna pertama kali mengakses aplikasi, Azure Databricks meminta mereka untuk secara eksplisit mengotorisasi aplikasi untuk bertindak dalam cakupan yang diminta. Admin dapat secara opsional memberikan persetujuan atas nama pengguna untuk menyelaraskan akses dengan kebijakan organisasi.
Menambahkan cakupan ke aplikasi
Important
Otorisasi pengguna ada di Pratinjau Umum. Admin ruang kerja Anda harus mengaktifkannya sebelum dapat menambahkan cakupan ke aplikasi Anda.
Setelah mengaktifkan otorisasi pengguna, Anda harus memulai ulang aplikasi yang ada sebelum dapat menambahkan cakupan ke aplikasi tersebut. Jika Anda menonaktifkan otorisasi pengguna, Anda harus memulai ulang aplikasi yang ada agar mereka berhenti menggunakan token akses pengguna saat ini untuk mengakses sumber daya.
Konfigurasikan otorisasi pengguna saat Anda membuat atau mengedit aplikasi di antarmuka pengguna Azure Databricks.
Di langkah Konfigurasi , klik +Tambahkan cakupan dan pilih cakupan yang menentukan API atau sumber daya Azure Databricks mana yang dapat diakses aplikasi atas nama pengguna. Azure Databricks memberlakukan cakupan ini pada runtime dan memerlukan persetujuan pengguna atau admin sebelum memberikan akses.
Untuk contoh lengkapnya, lihat demo otorisasi Aplikasi Databricks di GitHub. Contoh aplikasi menunjukkan cara menggunakan model otorisasi aplikasi dan pengguna, dan menyertakan instruksi penyiapan dan contoh kueri dengan otorisasi pengguna.
Mengambil kredensial otorisasi pengguna
Untuk otorisasi pengguna, Azure Databricks meneruskan identitas pengguna dan token akses ke aplikasi di header HTTP. Aplikasi harus mengekstrak header ini untuk bertindak atas nama pengguna.
Cara Anda mengambil header ini tergantung pada kerangka kerja yang Anda gunakan.
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 secara otomatis menyuntikkan objek permintaan ke fungsi aplikasi Anda jika Anda mendeklarasikannya sebagai parameter. Anda tidak perlu membuat atau mengambil permintaan secara manual.
Dash dan 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')
Ekspres
import express from 'express';
const userAccessToken = req.header('x-forwarded-access-token');
Contoh: Kueri dengan otorisasi pengguna
Dalam hal ini, aplikasi meneruskan token akses pengguna langsung ke konektor, dan Azure Databricks menerapkan izin pengguna ke kueri.
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);
Praktik terbaik untuk otorisasi pengguna
Saat Anda membuat aplikasi yang melakukan tindakan atas nama pengguna, ikuti praktik terbaik ini untuk memastikan akses yang aman dan dapat diaudit:
- Simpan kode aplikasi di folder yang hanya dapat diakses oleh pemilik aplikasi atau sekumpulan kecil pengguna tepercaya.
- Berikan
CAN MANAGEizin hanya kepada pengembang senior tepercaya yang bertanggung jawab atas pemeliharaan dan peninjauan aplikasi. BerikanCAN USEizin hanya kepada pengguna atau grup tertentu yang disetujui untuk menjalankan aplikasi. - Pastikan bahwa token tidak dicetak, dicatat, atau ditulis ke file. Ini berlaku untuk semua pernyataan pencatatan log, alat debugging, dan penanganan kesalahan. Misalnya, alih-alih
print(f"User token: {token}")menggunakanheaders = {"Authorization": f"Bearer {token}"}. - Konfigurasikan setiap aplikasi untuk meminta hanya cakupan otorisasi minimum yang diperlukan untuk fungsionalitasnya.
- Selama peninjauan kode, verifikasi bahwa cakupan dan pengaturan izin selaras dengan persyaratan keamanan dan tidak memberikan akses yang tidak perlu.
- Terapkan tinjauan serekan untuk semua kode aplikasi sebelum menyebarkan ke lingkungan produksi.
- Pastikan kode aplikasi Anda merekam log audit terstruktur untuk setiap tindakan yang dilakukan atas nama pengguna, termasuk identitas pengguna, jenis tindakan, sumber daya target, dan status.
Metode autentikasi
Untuk mendapatkan token untuk Aplikasi Databricks, pengguna dan perwakilan layanan mengautentikasi menggunakan alur OAuth 2.0 standar. Metode ini tergantung pada apakah pemanggil adalah pengguna atau beban kerja otomatis.
Untuk login ruang kerja (hanya pengguna):
- Akses menyeluruh (SSO): Pengguna mengautentikasi melalui penyedia identitas Anda saat akses menyeluruh (SSO) dikonfigurasi.
- Kata sandi satu kali (OTP): Pengguna menerima kata sandi sementara jika SSO tidak dikonfigurasi.
Untuk alur OAuth (aplikasi dan beban kerja):
- OAuth pengguna-ke-mesin (U2M): Pengguna mengautentikasi, dan token yang dihasilkan memungkinkan otorisasi pengguna sehingga aplikasi dapat bertindak atas nama pengguna.
- Mesin-ke-mesin (M2M) OAuth: Perwakilan layanan mengautentikasi menggunakan kredensial atau federasi klien. Token ini mendukung otorisasi aplikasi, di mana aplikasi bertindak sebagai dirinya sendiri alih-alih pengguna.
Untuk petunjuk memanggil aplikasi Databricks menggunakan autentikasi token, lihat Menyambungkan ke aplikasi API Databricks menggunakan autentikasi token.
Membandingkan dan menggabungkan model
Aplikasi Databricks dapat menggunakan otorisasi aplikasi dan pengguna secara independen atau bersama-sama. Model-model ini melayani tujuan yang berbeda dan dirancang untuk bekerja secara paralel.
| Model otorisasi | Kapan harus menggunakan | Contoh kasus penggunaan |
|---|---|---|
| Otorisasi aplikasi | Saat aplikasi melakukan operasi yang tidak bergantung pada identitas pengguna | Menulis log, mengakses konfigurasi bersama, memanggil layanan eksternal |
| Otorisasi pengguna | Saat aplikasi perlu mengakses sumber daya dalam konteks pengguna saat ini | Mengkueri data Katalog Unity, meluncurkan komputasi, memberlakukan izin tingkat baris |
| Both | Saat aplikasi melakukan operasi bersama dan khusus pengguna | Mencatat metrik dengan identitas aplikasi, mengkueri data yang difilter dengan identitas pengguna |