【Databricks Apps】OBO認証でセキュアなデータアクセスを実現する
Databricks AppsのOBO(On-Behalf-Of)認証を使って、ユーザーごとのデータアクセス権限を自動管理する方法を解説。従来のPAT方式の課題を解決し、セキュアで運用しやすいデータアプリを構築できます。
1 はじめに
Databricks Appsでカスタムアプリケーションを開発する際、重要な考慮事項の一つが認証とアクセス制御です。特に、複数のユーザーが利用するアプリケーションでは、各ユーザーのデータアクセス権限を適切に管理する必要があります。
本記事では、Databricks Appsが提供する「On-Behalf-Of ユーザー認証」機能を使用して、セキュアなデータアクセスを実現する方法を解説します。
2 なぜユーザー認証が必要なのか
複数ユーザーのアプリケーション利用における課題
組織内で共有されるデータアプリケーションを開発する場合、以下のような要件があります。
・個別のアクセス権限: 各ユーザーが自身の権限の範囲内でのみデータにアクセスできる
・監査とコンプライアンス: 誰がいつどのデータにアクセスしたかを追跡できる
・セキュリティ: 他のユーザーのデータに不正にアクセスできない
これらの要件を満たすためには、アプリケーションがユーザーを識別し、そのユーザーの権限でDatabricksリソースにアクセスする仕組みが必要です。
従来のアプローチの限界
1. Personal Access Token (PAT) を使用した場合
多くの開発者は、ローカル開発環境でPATを使用してDatabricks APIにアクセスしています。しかし、本番環境でこの方法を採用すると以下のような問題点があります。
・運用の複雑さ: 各ユーザー分のPATを発行・管理・定期的にローテーションする必要がある
・セキュリティリスク: PATの漏洩リスクと、適切な管理の困難さ
・権限管理の問題: PATを共有すると、全員が同じ権限でアクセスすることになる
2. 単一のサービスアカウントを使用した場合
アプリケーション用の単一のサービスアカウントを使用すると以下のような問題点があります。
・権限の分離ができない: すべてのユーザーが同じ権限でデータにアクセス
・監査の困難さ: 実際の利用者を特定できない
・セキュリティの低下: 過剰な権限を持つ可能性がある
3 なぜOBO認証が優れているのか
OBO(On-Behalf-Of)認証は、これらの課題を解決する最適な方式です。
1. 自動的な権限管理
・Databricksが各ユーザーの既存の権限を自動的に適用
・Unity Catalogで設定された行レベル・列レベルのアクセス制御も自動的に反映
・アプリケーション側で複雑な権限チェックを実装する必要がない
2. シンプルな実装
・Databricksがユーザーのアクセストークンを自動的にアプリに転送
・開発者はヘッダーからトークンを取得して使用するだけ
・トークンの発行や管理が不要
3. 高いセキュリティ
・各ユーザーが自身の権限の範囲内でのみアクセス可能
・トークンは一時的で、Databricksが自動的に管理
・監査ログで実際のユーザーを追跡可能
4. 運用の簡素化
・PATの発行・ローテーション作業が不要
・ユーザーの追加・削除がDatabricksの標準的なユーザー管理で完結
・アプリケーション側の設定変更が不要
4 DatabricksにおけるOBO認証の導入手順
STEP 0. OBO認証の有効化
OBO認証は現在Public Previewのため、以下の手順で有効化する必要があります。
1: Admin権限でDatabricksワークスペースにログイン
2: 右上のユーザーアイコン > Previews をクリック
3: 以下のトグルを[On]にする

STEP 1. アプリ設定でOBO スコープを付与
1: Compute > Apps からアプリの設定画面を開く(もしくは新規作成でもOK)
2: 右上の[edit] > 右下の[Next] をクリック
3: User authorization > [+ Add scope] をクリック

4: アプリケーションで必要なスコープを選択
・Databricks SQL: SQL WarehouseやUnity Catalogへのアクセス用
・Genie spaces: Genie APIへのアクセス用
・Files and directories: DBFSやVolumesへのファイルアクセス用
※ワークスペースで使っている機能によっては、上記以外のscopeが出る可能性があります。
5: 各スコープに対して適切な権限レベルを設定(Read/Write/Manage)
STEP 2. コード実装(ユーザートークンの取得と使用)
Streamlitアプリケーションでユーザートークンを取得する実装例です。
def auth_header() -> dict[str, str]:
import streamlit as st
user_token = None
# Databricks Apps → ユーザートークンがヘッダーに来る
if hasattr(st, "context") and st.context.headers is not None:
h = st.context.headers
# # Streamlit の headers は全キー小文字なのでまず小文字で取得
user_token = h.get("x-forwarded-access-token") or h.get("X-Forwarded-Access-Token")
# ローカル .env 用フォールバック
user_token = user_token or os.getenv("DATABRICKS_TOKEN", "")
if not user_token:
raise RuntimeError("Databricks access token not found")
return {"Authorization": f"Bearer {user_token}"}
認証後は、アプリをデプロイし直してください。
5 おわりに
Databricks AppsのOBO認証を活用することで、セキュアで運用しやすいデータアプリケーションを構築できます。各ユーザーの既存の権限をそのまま活用でき、複雑な権限管理やトークン管理から解放されます。 特に、従来のPAT方式と比較して、運用負荷が大幅に削減され、セキュリティも向上します。組織内で共有されるデータアプリケーションを開発する際は、ぜひOBO認証の採用を検討してください。
本記事で紹介した手順に従えば、簡単にOBO認証を実装でき、ユーザーごとの権限を適切に管理しながら、価値の高いデータアプリケーションを提供できるようになります。

