チュートリアル: RBACを使用して AI エージェントのアクセスをスコープ指定する
役割ベースのアクセス制御 (RBAC)を使用して、AIエージェントが特定のタスクに必要なデータとリソースにアクセスできる範囲を制限します。役割にスコープされたOAuthトークンをエージェントに提供します。そのトークンで行われたリクエストは、認証ユーザーまたはDatabricks Service Principalの広範な権限ではなく、ロールの権限を使用します。
シナリオ
AI サポートエージェントにはチケットのサマリーとステータスが必要ですが、個人識別情報 (PII) を含む顧客の連絡先情報は必要ありません。その認証用 Databricks Service Principal は、より広範なアクセス権を持っており、両方のデータセットを読み取ることができます。
この例では、support.tickets スキーマには、顧客のPIIを含まないチケットの概要とステータスが含まれています。顧客の連絡先詳細は support.customers.contact_details に個別に保存されます。
role-support-agent を作成し、support.tickets への読み取りアクセス権を付与し、Databricks Service Principal にその権限を想定する権限を付与します。そのロールにスコープされたトークンがあれば、エージェントはサポートチケットを読み取ることはできますが、顧客の連絡先情報にはアクセスできません。
ロールは親グループからデータ権限を継承でき、カタログまたはスキーマの付与はその下にあるすべてのテーブルに適用できます。この例では、これらの付与によってロールに顧客連絡先テーブルへのアクセス権が与えられないことを確認してください。権限の継承を参照してください。共有権限を変更すると他のユーザーやロールに影響するため、他のユーザーのアクセス権を削除する代わりにテストワークスペースを使用してください。
このチュートリアルは、提供した OAuth アクセストークンを受け入れるカスタムの自己ホスト型、またはサードパーティのエージェントを対象としています。Databricks Apps にデプロイされたエージェントの場合、組み込みのアプリまたはユーザー認証を使用します。エージェントの認証を参照してください。
前提条件
- RBAC が有効な Unity Catalog 有効化ワークスペース。RBAC を有効にするを参照してください。
- ロールを作成し、Assume権限を付与し、それをワークスペースに割り当てるためのアカウント管理者またはワークスペース管理者権限。「グループを管理できるユーザー」を参照してください。
supportカタログの所有権またはMANAGE。- ワークスペース管理者権限、またはこの例で使用するSQLウェアハウスに対する「管理可能」権限。
- 既存のテーブル
support.tickets.open_casesとsupport.customers.contact_details。必要に応じて、架空のテストデータを使用し、独自の名前に置き換えてください。 - Databricks SQLアクセス、SQL warehouseに対する使用権限、および両方のテーブルに対するクエリー権限を持つ、ワークスペースに割り当てられたDatabricks Service Principal。マシン間(M2M)認証のための
sqlスコープを許可するOAuthシークレットが必要です。ステップ1: OAuthシークレットを作成するを参照してください。 curlトークンをリクエストしてテストできる信頼できる環境。system.access.auditにアクセスできる監査リーダーが、ロール下のエージェントの活動を検証します。監査属性の検証を参照してください。
ステップ1:ロールを作成する
このチュートリアルでは、ロールとして機能する空のアカウントグループを作成します。
- Account console
- Workspace admin settings
- アカウント管理者として、アカウントコンソールにログインします。
- サイドバーで、[ ユーザー管理 ] をクリックします。
- [ グループ ] タブで、[ グループの追加 ] をクリックします。
role-support-agentを入力します。メンバーを追加しないでください。- 確認 をクリックします。
- Databricks SQLアクセス を使用して、グループをワークスペースに割り当てます。ワークスペースにグループを割り当てるを参照してください。
- ワークスペース管理者として、テストワークスペースにログインします。
- 上部のバーにあるユーザー名をクリックし、 [設定] を選択します。
- [ IDとアクセス ] タブをクリックします。
- [ グループ ] の横にある [ 管理 ] をクリックします。
- [ グループを追加 ]をクリックし、[ 新規追加 ]をクリックします。
role-support-agentを入力し、 Databricks SQL access を選択します。- [ 追加 ] をクリックします。メンバーを追加しないでください。
これは、グループをワークスペースに割り当て、そのグループに対する管理権限を付与するものです。
Databricks SQLアクセス権は、ダッシュボード、クエリー、SQL WarehouseなどのDatabricks SQL機能へのアクセス権を付与します。この例ではSQLクエリーを使用します。エージェントがノートブック、ジョブ、モデル、パイプラインなどのコアワークスペース機能も必要とする場合は、ワークスペースアクセス権を付与します。「アクセス権限」を参照してください。データ権限とwarehouse権限はステップ2で設定します。
この例では、Databricks service principalをメンバーとして追加する代わりに、Assumeアクセス許可を個別に付与します。メンバーシップにより、グループのアクセス許可がDatabricks Service Principal自体のIDにも追加されます。
ステップ 2: ロールにサポートチケットへのアクセス権を付与する
カタログ所有者またはsupportでMANAGEを持つユーザーとして、次をラン:
GRANT USE CATALOG ON CATALOG support TO `role-support-agent`;
GRANT USE SCHEMA, SELECT ON SCHEMA support.tickets TO `role-support-agent`;
ワークスペース管理者またはwarehouseに対して「管理可能」を持つユーザーは、そのロールにwarehouseへのアクセス権を付与します:
- ワークスペースのサイドバーで、[ SQL ウェアハウス ] をクリックします。
- Warehouseの横にある
ケバブメニューをクリックし、 [権限] をクリックします。
role-support-agentを 使用可能 で追加します。
スキーマレベルの SELECT 付与は、support.tickets 内の現在および将来のすべてのテーブルとビューに適用されます。support.customers や他のスキーマへのアクセスは許可されません。ロールを単一のテーブルに制限するには、代わりにそのテーブルで SELECT を付与します。Unity Catalog での権限の管理を参照してください。
ステップ 3:ロールを引き受ける権限を付与する
いずれかの方法を使用して、Databricks Service PrincipalにAssume権限を付与します。
- Account console
- Workspace admin settings
- アカウント管理者としてアカウントコンソールを開き、[ ユーザー管理 ] をクリックします。
- グループ tabで、
role-support-agentをクリックします。 - アクセス許可 tabをクリックし、 アクセス許可を付与 をクリックします。
- Databricks Service Principalを検索して選択し、 Assume を選択して Save をクリックします。
- このロールに対する「管理」権限を持つワークスペース管理者として、テストワークスペースで 「設定」 > 「アイデンティティとアクセス」 を開きます。
- [ グループ ] の横にある [ 管理 ] をクリックして、
role-support-agentを選択します。 - [アクセス権の付与] をクリックします。
- Databricks Service Principalを検索して選択し、 Assume を選択して Save をクリックします。
ステップ4: ロールスコープのトークンを要求する
信頼できるトークン要求環境で、これらの環境変数を設定します。
DATABRICKS_HOST:https://を含み、末尾にスラッシュがないワークスペースURL。CLIENT_IDおよびCLIENT_SECRET:Databricks Service PrincipalのアプリケーションIDとOAuthシークレット。ROLE_GROUP_ID:role-support-agentの数値ID。アカウント管理者は、アカウントコンソールのグループのURLの末尾でそれを見つけることができます。アカウント管理者、ワークスペース管理者、およびグループマネージャーは、アカウントグループAPIを使用してグループのidを取得することもできます。DATABRICKS_SQL_WAREHOUSE_ID:ステップ2で許可された warehouse の ID です。warehouse の HTTP パス 内で/sql/1.0/warehouses/の後に続きます。Databricks コンピュート リソースの接続の詳細を取得するを参照してください。
assume_group パラメーターと sql OAuth スコープを使用して、ワークスペースレベルのトークンをリクエストします。スコープにより、トークンは SQL APIs に制限されます。ロールのデータ権限によって、クエリー可能なテーブルが決まります。スコープ付き OAuth シークレットを参照してください。
トークンを要求するには、以下をラン:
curl --request POST \
--url "$DATABRICKS_HOST/oidc/v1/token" \
--user "$CLIENT_ID:$CLIENT_SECRET" \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=sql' \
--data-urlencode "assume_group=$ROLE_GROUP_ID"
DATABRICKS_TOKENにレスポンスのaccess_tokenの値を設定します。expires_inの値を使用して、交換の要求時期を決定します。アカウントレベルのトークン要求は assume_group をサポートしていません。ロールを引き受けるを参照してください。
ステップ5:トークンのアクセス権を確認する
トークンをエージェントに提供する前に、これらのチェックを信頼された環境でランしてください。
まず、Databricks Service Principal自身のIDのトークンを使用してベースラインを取得します。ステップ4のリクエストをassume_groupパラメーターなしで繰り返し、DATABRICKS_TOKENをそのトークンに一時的に設定します。このステップの両方のクエリーをランし、成功することを確認します。次に、DATABRICKS_TOKENをロールスコープトークンに戻し、チェックを繰り返します。
サポートチケットの読み取り
ロールスコープのトークンを使用してこのリクエストをランします:
curl --request POST \
--url "$DATABRICKS_HOST/api/2.0/sql/statements" \
--header "Authorization: Bearer $DATABRICKS_TOKEN" \
--header 'Content-Type: application/json' \
--data "{
\"warehouse_id\": \"$DATABRICKS_SQL_WAREHOUSE_ID\",
\"statement\": \"SELECT * FROM support.tickets.open_cases LIMIT 10\",
\"wait_timeout\": \"50s\"
}"
ロールがsupport.ticketsを読み取ることができるため、クエリーは成功します。応答のstatus.stateがSUCCEEDEDであることを確認してください。PENDINGまたはRUNNINGの場合、返されたstatement_idを使用して、同じトークンで結果を取得します:
curl --request GET \
--url "$DATABRICKS_HOST/api/2.0/sql/statements/<statement-id>" \
--header "Authorization: Bearer $DATABRICKS_TOKEN"
文のステータスと結果の処理については、Statement Execution API: ラン SQL on warehouseを参照してください。
顧客のPIIへのアクセスが拒否されていることを確認します
同じロールスコープトークンとwarehouseを使用して、以下を実行します。
curl --request POST \
--url "$DATABRICKS_HOST/api/2.0/sql/statements" \
--header "Authorization: Bearer $DATABRICKS_TOKEN" \
--header 'Content-Type: application/json' \
--data "{
\"warehouse_id\": \"$DATABRICKS_SQL_WAREHOUSE_ID\",
\"statement\": \"SELECT 1 FROM support.customers.contact_details LIMIT 1\",
\"wait_timeout\": \"50s\"
}"
ステートメントがまだ実行中の場合は、前のセクションで説明したように結果を取得します。クエリーはstatus.errorのアクセス権限エラーで失敗しますが、Databricks Service Principal自身のトークンでは成功します。HTTP成功レスポンスだけでは、クエリーが成功したとはいえません。テーブルがない、トークンの有効期限が切れている、またはWarehouseのエラーが発生している場合、そのロールのデータ権限が正しく構成されているとは判断できません。
監査の帰属を確認する
監査属性の検証で説明されているアクセス権を持つ監査リーダーを使用します。system.access.auditでテストクエリーイベントを検査します。identity_metadata.run_asは認可ロールを特定し、run_as_display_nameにはrole-support-agentが含まれ、run_byはリクエストを開始したDatabricks Service Principalを特定します。監査データは1日を通して更新されるため、最近のイベントはすぐには表示されない場合があります。ID メタデータのリファレンスを参照してください。
ステップ6: エージェントを設定する
エージェントのDatabricksクライアントにワークスペースURLと検証済みロールスコープトークンを設定します。そのトークンのみをエージェントに提供し、Databricks Service PrincipalのOAuthシークレットやスコープ指定されていないトークンは提供しないでください。ロールスコープトークンは、そのトークンで行われるリクエストを制限します。他のセッションでのDatabricks Service Principalの権限は削除されません。
Databricks SDK for Pythonを使用するエージェントの場合は、エージェントの環境でDATABRICKS_HOSTとDATABRICKS_TOKENを設定し、クライアントを初期化します。
from databricks.sdk import WorkspaceClient
w = WorkspaceClient()
SDKは、統合認証を使用して環境からトークンを読み取ります。アクセストークンを提供しても、新しいトークンを要求するために必要な資格情報がSDKに与えられるわけではありません。長時間実行されるエージェントの場合は、トークンの有効期限が切れる前に、信頼できるコンポーネントが役割スコープのトークンを要求して提供できるように準備してください。
オプション:開発者のIDを使用する
ユーザー対マシン (U2M) 認証を使用したローカルテストの場合、ステップ3と同様に、参加する開発者にrole-support-agentの「Assume」権限を付与します。開発者は「Databricks CLIのインストールまたはアップデート」の説明に従って Databricks CLI をインストールし、自身のサインインと個別のプロファイルを使用して認証します。
databricks auth login --host <workspace-url> --profile support-agent
開発者はブラウザで 「Authorize as..(として認可)」 の下のrole-support-agentを選択して 「Continue(続行)」 をクリックし、そのプロファイルのトークンを取得します。
databricks auth token --profile support-agent
開発者は、返されたaccess_tokenをステップ5のロールスコープクエリーチェックのDATABRICKS_TOKENとして使用します。これらのリクエストの監査イベントでは、開発者はrun_byとして識別されます。Databricks CLIによって返されるトークンは期限切れになります。開発者は必要に応じて新しいトークンを取得します。API (OAuthアクセストークン)を参照してください。
クリーンアップ
一時的なテストの場合、完了したらエージェントのトークン構成を削除し、テスト用に作成された「Assume(引き受け)」権限の付与を取り消してください。ロールを削除する前に、それが資産を所有しているか、または他のワークロードによって使用されていないかを確認してください。
次のステップ
-
- ロールベースのアクセス制御 (RBAC) の制限
- 役割として動作しているときにサポートされていない機能、または動作が異なる機能を確認します。
-
- RBACロールの切り替え
- サポートされている他のメソッドを使用してロールを引き受けます。