Databricks アプリで承認を構成する
Databricks Apps は、Databricks での安全なアプリケーション開発をサポートします。アプリは、ワークスペース内のデータとサービスにアクセスするときに、データ アクセス制御を適用し、ユーザーのアクセス許可を尊重する認証および承認メカニズムを使用する必要があります。Databricks Apps の認証モデルは OAuth 2.0 に基づいており、アプリに割り当てられた権限と、アプリにアクセスするユーザーの権限が組み合わされます。
このフレームワークをサポートするために、Databricks Apps では 2 つの補完的な ID モデルを使用します。
これらのモデルにより、開発者は、アプリがアクセスできるものと使用するアクセス許可をきめ細かく制御できます。たとえば、アプリでは、ログの書き込みや共有構成の読み取りにアプリの承認を使用できます。その後、ユーザー承認を活用して、ユーザーのアクセス許可でデータをクエリし、Unity Catalog は行レベルまたは列レベルのフィルタリングなどのポリシーを通じてそれを適用します。
アプリの認証
各Databricks アプリには、Databricksリソースにアクセスするときに ID として機能する専用の サービスプリンシパル があります。このサービスプリンシパルはアプリインスタンスに固有であり、アプリ間で再利用することはできません。 Databricks は、この ID を使用して、ユーザーから独立してアプリのアクセス許可を評価し、ユーザーが操作のコンテキスト外であっても、明示的に付与されたリソースにのみアプリがアクセスできるようにします。
この分離により、セキュリティ境界が適用され、アプリのアクティビティの監査が可能になり、バックグラウンド処理や自動タスクなどのシナリオがサポートされます。
サービスプリンシパルは、一意の ID で表されます。 アプリの [認証] タブからコピーできます。
アプリを作成すると、 Databricks によって専用のサービスプリンシパルが自動的に作成され、アプリに割り当てられます。 サービスプリンシパルは、アプリが個々のユーザーのコンテキストを必要とせずに単独で実行するアクションに使用します。 一般的な使用例は次のとおりです。
- バックグラウンドタスクの実行
- 共有構成またはメタデータの読み取りまたは書き込み
- アクティビティまたは使用状況のメトリクスのロギング
- セキュアなエンドポイントを介した外部サービスの呼び出し
アプリによって開始されるすべてのアクションは、サービスプリンシパルの権限を使用します。 サービスプリンシパルに特定のリソースへのアクセス権を付与するには、標準のアクセス許可の割り当てを使用します。 ただし、ユーザーレベルのアクセス制御はサポートされていません。アプリを操作するすべてのユーザーは、サービスプリンシパルに対して定義された同じアクセス許可を共有するため、アプリは個々のユーザー ID に基づいてきめ細かなポリシーを適用できません。
次の例は、アプリがサービスプリンシパルを使用して Unity Catalog内のデータをクエリする方法を示しています。
この場合、サービスプリンシパルは、 SQLウェアハウスとクエリを実行する Unity Catalog テーブルの両方に明示的にアクセスする必要があります。
このモデルは、アプリのすべてのユーザーに同じデータを表示する場合や、アプリがユーザー固有のアクセス制御に関連付けられていない共有操作を実行する場合に適しています。
ユーザー認証
プレビュー
ユーザー認証は パブリック プレビュー段階です。
ユーザー認証 ( ユーザー代理認証 と呼ばれることもあります) を使用すると、Databricks Apps アプリはアプリ ユーザーの ID で動作できます。Databricks はユーザーのアクセス トークンをアプリに転送し、アプリはトークンを使用してユーザーに代わってリソースにアクセスします。Databricks は、ユーザーの既存の Unity Catalog ポリシーに基づいてすべてのアクセス許可を適用します。
ユーザーに代わって動作するアプリのセキュリティリスクを管理するために、Databricks はスコープを使用して、ユーザーが承認を通じて実行できるアクションを制限します。
アプリが個々のユーザー権限を尊重する必要がある場合は、ユーザー認証を適用します。一般的な使用例は次のとおりです。
- テーブルまたはボリュームのクエリ
- SQLウェアハウスまたはコンピュートへのアクセス
- ユーザーアクションに関連付けられたジョブまたはワークフローの実行
すべてのアクションでは、ユーザーの既存の Unity Catalog のアクセス許可が使用されます。
ユーザー認証では、行レベルのフィルターや列マスクなどの Unity Catalog の機能をアプリのアクティビティに適用することで、きめ細かなアクセス制御が可能になります。このアプローチにより、アクセス制御とワークスペースのガバナンスとの一貫性が保たれ、アクセス許可ロジックがアプリにハードコーディングされるのを回避できます。
認証モデルを選択する
Databricks アプリは、アプリとユーザーの承認を個別に使用することも、一緒に使用することもできます。これらのモデルは異なる目的を果たし、並行して動作するように設計されています。
アプリの承認 は、アプリがユーザーの ID に依存しない操作を実行する場合に使用します。これには、ログの書き込み、共有構成へのアクセス、外部サービスの呼び出しが含まれます。
ユーザーが管理する Unity Catalogデータのクエリや、ユーザーに代わってコンピュートを起動するなど、アプリがユーザーのコンテキストでリソースにアクセスする必要がある場合は、 ユーザー承認 を使用します。
多くのアプリは両方のモデルを組み合わせています。たとえば、アプリでは、サービスプリンシパルを使用して使用状況メトリクスをログテーブルに書き込んだり、ユーザー認証を活用して、行レベルのアクセス制御に基づいてユーザー固有の結果を返す SQL クエリを実行したりすることができます。
アプリに承認を実装する
Databricks アプリでアプリまたはユーザーの承認を使用するには、Databricks サービスに要求を行うときに適切な ID を構成し、正しい資格情報を渡します。
アプリ認証資格情報を取得する
アプリの承認の場合、 Databricks はサービスのプリンシパル資格情報をアプリの環境に自動的に挿入します。 次の環境変数は、必要な OAuth クライアント値を保持します。
変数 | 説明 |
---|---|
| サービスプリンシパルのOAuth クライアント ID |
| サービスプリンシパルのOAuthクライアントシークレット |
Databricks は、アプリ ランタイムで環境変数を自動的に設定します。アプリは、それ自体として認証するときにこれらの変数を使用します。
import os
client_id = os.getenv('DATABRICKS_CLIENT_ID')
client_secret = os.getenv('DATABRICKS_CLIENT_SECRET')
例: アプリの承認を使用したクエリ
この例では、 SDK Config オブジェクトを使用して、環境変数からサービスプリンシパル の資格情報 を取得し、 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()
ユーザー認証資格情報の取得
ユーザー認証の場合、Databricks はユーザーの ID とアクセス トークンを HTTP ヘッダーでアプリに転送します。アプリは、ユーザーに代わって動作するために、これらのヘッダーを抽出する必要があります。
これらのヘッダーを取得する方法は、使用するフレームワークによって異なります。
- Streamlit
- Gradio
- Dash and Flask
- Shiny
import streamlit as st
user_access_token = st.context.headers.get('X-Forwarded-Access-Token')
from fastapi import Request
import gradio as gr
request: Request = gr.Request().get("request")
user_access_token = dict(request.headers).get('X-Forwarded-Access-Token')
from flask import request
headers = request.headers
user_token = headers.get('X-Forwarded-Access-Token')
user_token = session.http_conn.headers.get('X-Forwarded-Access-Token', None)
例: ユーザー認証を使用したクエリ
この場合、アプリはユーザーのアクセス トークンを直接コネクタに渡し、Databricks はユーザーのアクセス許可をクエリに適用します。
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()
ユーザー認証によるきめ細かな権限
アプリにユーザー認証を追加すると、次のようなユーザーの既存の Unity Catalog のアクセス許可が適用されます。
- 表示される行を制限する行レベルのフィルター
- 機密データを編集または変換するための列マスク
Databricks はユーザーの ID を使用してユーザー承認要求を評価するため、アプリがデータにアクセスすると、これらのポリシーが自動的に適用されます。たとえば、テーブルに地域ごとに表示を制限する行フィルターが含まれている場合、アプリはユーザーがクエリを許可された行のみを返します。アプリには追加のフィルタリングロジックは必要ありません。
このアプローチにより、アプリケーション コード内のアクセス制御ロジックの重複が回避され、ワークスペース レベルのガバナンスとの一貫性が確保されます。管理者が Unity Catalog ポリシーを更新すると、アプリは自動的にそれらの変更を尊重します。これにより、古い権限ロジックや不整合な権限ロジックによるデータ漏洩のリスクが軽減されます。
スコープベースのセキュリティと特権昇格
ユーザー認証を使用するアプリは、ユーザーに代わってアプリが実行できる操作を制御するために、特定の認証スコープを宣言する必要があります。スコープは、次のような特定の API またはリソースの種類へのアクセスを制限します。
sql
クエリ用 SQLウェアハウスserving.serving-endpoints
モデルサービング用vectorsearch.vector-search-endpoints
ベクトル検索用
スコープを選択しない場合、 Databricks は、アプリが基本的なユーザー ID 情報を取得できるようにするデフォルト セットを割り当てます。
iam.access-control:read
iam.current-user:read
これらのデフォルトは、ユーザー認証機能をサポートするために必要ですが、データやコンピュート リソースへのアクセスは許可されません。 アプリを作成または編集するときに、スコープを追加できます。
スコープは、最小特権の原則を強制します。必要なスコープのみを要求するようにアプリを構成してください。Databricks は、ユーザーがアクセス許可を持っている場合でも、承認されたスコープ外の機能へのアクセスをブロックします。たとえば、アプリが sql
スコープのみをリクエストした場合、ユーザーがアプリの外部にいても、モデルサービングエンドポイントにはアクセスできません。
ユーザーが初めてアプリにアクセスすると、Databricks は、要求されたスコープ内でアプリが動作することを明示的に承認するように求めます。管理者は、必要に応じて、ユーザーに代わってアクセスを組織のポリシーに合わせるための同意を付与できます。
アプリでのユーザー認証の構成
プレビュー
ユーザー認証は パブリック プレビュー段階です。アプリにスコープを追加する前に、ワークスペース管理者が有効にする必要があります。
Databricks UI でアプリを作成または編集するときに、ユーザー認証を構成できます。
構成 ステップで、 + スコープの追加 をクリックし、アプリがユーザーに代わってアクセスできるDatabricks APIまたはリソースを定義するスコープを選択します。Databricks では、実行時にこれらのスコープが適用され、アクセスを許可する前にユーザーまたは管理者の同意が必要です。
完全な例については、 GitHub の Databricks Apps 承認デモを参照してください。サンプル アプリでは、アプリとユーザーの両方の承認モデルの使用方法を示し、ユーザー承認を使用したセットアップ手順とクエリの例が含まれています。