Bagikan melalui


Mengonfigurasi otorisasi di aplikasi Databricks

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. Prinsipal layanan ini unik untuk instans aplikasi dan tidak dapat digunakan kembali pada aplikasi lain. 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. Anda dapat menyalinnya dari tab Otorisasi aplikasi:

Melihat prinsipal layanan di aplikasi Databricks

Saat Anda membuat aplikasi, Azure Databricks secara otomatis membuat prinsipal layanan khusus dan menetapkannya ke aplikasi. 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. Anda dapat memberikan akses prinsipal layanan ke sumber daya tertentu menggunakan penetapan 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:

Melihat cara perwakilan layanan mengautentikasi di aplikasi

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:

Variabel Deskripsi
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.

Phyton

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;

Nota

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

Phyton

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

Penting

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:

Melihat cara pengguna mengautentikasi di aplikasi

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. Ini mengurangi risiko paparan data dari logika izin basi atau tidak sejalan.

Kontrol berbasis cakupan dan eskalasi hak istimewa

Aplikasi yang menggunakan otorisasi pengguna harus mendeklarasikan cakupan otorisasi tertentu untuk mengontrol apa yang dapat dilakukan aplikasi atas nama pengguna. Cakupan membatasi akses ke API atau jenis sumber daya tertentu, seperti:

  • sql untuk mengkueri gudang SQL
  • dashboards.genie untuk mengelola ruang Genie Anda
  • files.files untuk 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:read
  • iam.current-user:read

Default ini diperlukan untuk mendukung fungsionalitas otorisasi pengguna, tetapi tidak mengizinkan akses ke data atau sumber daya komputasi. Anda dapat menambahkan cakupan tambahan saat 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

Penting

Otorisasi pengguna ada di Pratinjau Umum. Admin ruang kerja Anda harus mengaktifkannya sebelum dapat menambahkan cakupan ke aplikasi Anda.

Anda dapat mengonfigurasi otorisasi pengguna saat 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.

Menambahkan cakupan otorisasi pengguna ke aplikasi Databricks

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

Berkilau

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.

Phyton
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,
    accessToken: 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 MANAGE izin hanya kepada pengembang senior tepercaya yang bertanggung jawab atas pemeliharaan dan peninjauan aplikasi. Berikan CAN USE izin 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}") menggunakan headers = {"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.

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 digunakan 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
Keduanya (gabungan) Saat aplikasi melakukan operasi bersama dan khusus pengguna Mencatat metrik dengan identitas aplikasi, mengkueri data yang difilter dengan identitas pengguna