Databricks シークレットスコープと Azure Key Vault を一覧・権限管理する実践ガイド(CLI/REST/ノートブック手順)

Azure Databricks の運用現場では、ワークスペースに乱立するシークレットスコープと Azure Key Vault の対応関係をすばやく把握し、権限を安全に見直せることが重要です。本記事では、ノートブック・REST API・CLI を使って「スコープ一覧」と「紐付く Key Vault」を正確に棚卸しする具体手順と、Creator 限定の権限をワークスペース全体へ拡張する実務的な方法・ベストプラクティスをまとめます。

目次

対象読者・前提

  • Azure Databricks ワークスペースの管理者、Platform/SRE、データエンジニア。
  • シークレットスコープ(Databricks‑backed / Azure Key Vault‑backed)の基本を理解していること。
  • Databricks CLI または REST API の利用経験があること(PAT/認証設定は済み)。

シークレットスコープの基礎整理(混在環境の要点)

同一ワークスペース内で Databricks‑backed と Azure Key Vault‑backed のスコープが混在しているケースはよくあります。棚卸しや監査を効率化するため、まず両者の見分け方・管理の要点を把握しましょう。

項目Databricks‑backed スコープAzure Key Vault‑backed スコープ
格納場所Databricks の管理ストア外部の Azure Key Vault(AKV)
一覧取得dbutils / REST / CLI で可スコープの一覧は可。
ただしシークレットのキー名一覧は取得制限がある(AKV 側が権限源泉)
値参照dbutils.secrets.get で可(値はログ/出力に出さない)dbutils.secrets.get で AKV から取得(AKV 側のアクセス許可が必須)
スコープ⇔Key Vault 紐付けなしスコープ作成時に固定(Vault URL / Resource ID がメタデータに残る)
ACL(READ/WRITE/MANAGE)Databricks 側 ACL が有効Databricks 側 ACL + AKV 側アクセス制御の二段構え
代表的な落とし穴Creator ロックの解除漏れAKV 側の RBAC/アクセスポリシー・ファイアウォールで実行時に失敗

ワークスペース内の「シークレットスコープ一覧」と「紐付く Key Vault」を確認する方法

概要(手段比較)

利用手段コマンド / API主な出力・利点
Databricks ノートブック(dbutils)dbutils.secrets.listScopes()既存スコープ名の一覧を即時取得。GUI 不要。
dbutils.secrets.list("SCOPE_NAME")指定スコープに格納されたキー名の一覧(Databricks‑backed で有効)。
キー名に Vault 名・URL など命名ルールを含めると後工程が楽。
Secrets REST APIGET /api/2.0/secrets/scopes/listスクリプト・監査ジョブから JSON で自動取得。多くの環境で backend_type と Key Vault 情報(DNS 名 / Resource ID)を取得できるため、スコープ⇔Vault の対応表を作りやすい。
Databricks CLIdatabricks secrets list-scopesスコープ名・バックエンド種別に加え、Key Vault の DNS 名(Vault 名入りの URL)/ Resource ID を確認可能。ワンライナーで棚卸しできる。

最速:ノートブックからスコープ名を一覧

GUI を開かず、ワークスペース内のスコープ名をすぐに確認できます。

# Python(Databricks ノートブック)
scopes = dbutils.secrets.listScopes()
for s in scopes:
    print(s.name)

Databricks‑backed のスコープに限り、キー名の一覧も確認できます(値は表示されません)。

# Python(Databricks ノートブック)
for s in dbutils.secrets.list("SCOPE_NAME"):
    print(s.key)

注意: Azure Key Vault‑backed スコープでは、セキュリティ上の理由からキー名の一覧が取得できない、もしくは空になる場合があります。Key Vault 紐付けの把握は次の REST / CLI を使うのが確実です。

確実:REST API で「スコープ⇔Key Vault」を JSON 取得

監査・自動化向けに最も柔軟です。PAT(個人アクセストークン)を環境変数に設定し、以下の例を実行します。

# 事前に環境変数を設定(例:Linux/macOS)
# export DATABRICKS_HOST="https://<your-workspace-host>"
# export DATABRICKS_TOKEN="<your-personal-access-token>"

# スコープ一覧を取得
curl -s -X GET \
  -H "Authorization: Bearer ${DATABRICKS_TOKEN}" \
  "${DATABRICKS_HOST}/api/2.0/secrets/scopes/list" \
| jq '.scopes[] | {name, backend_type, keyvault: (.keyvault_metadata // .backend_azure_keyvault)}'

よく使う整形例:

# scope, backend_type, key_vault_url(DNS 名), resource_id を CSV で出力
curl -s -X GET \
  -H "Authorization: Bearer ${DATABRICKS_TOKEN}" \
  "${DATABRICKS_HOST}/api/2.0/secrets/scopes/list" \
| jq -r '
  .scopes[]
  | [
      .name,
      .backend_type,
      (.keyvault_metadata.dns_name // .backend_azure_keyvault.dns_name // "N/A"),
      (.keyvault_metadata.resource_id // .backend_azure_keyvault.resource_id // "N/A")
    ]
  | @csv'

環境やバージョンによって Key Vault 情報のフィールド名(例:keyvault_metadata / backend_azure_keyvault)が異なることがあるため、上記のようにフォールバックで両方を参照しておくと堅牢です。

運用定番:Databricks CLI で一発棚卸し

CI/CD エージェントや運用端末に最適です。認証は databricks auth login(新 CLI)または databricks configure --profile(従来 CLI)で済ませておきます。

# JSON 出力にして JQ で整形
databricks secrets list-scopes --output JSON \
| jq -r '
  .scopes[]
  | [
      .name,
      .backend_type,
      (.keyvault_metadata.dns_name // .backend_azure_keyvault.dns_name // "N/A"),
      (.keyvault_metadata.resource_id // .backend_azure_keyvault.resource_id // "N/A")
    ]
  | @tsv' \
| awk 'BEGIN{print "SCOPE\tBACKEND\tKEY_VAULT_DNS\tRESOURCE_ID"} {print}'

結果例:

SCOPE    BACKEND            KEY_VAULT_DNS                         RESOURCE_ID
kv-prod  AZURE_KEYVAULT     https://prod-kv.vault.azure.net/      /subscriptions/.../vaults/prod-kv
app-dbx  DATABRICKS         N/A                                   N/A

スコープ一覧+ACL も同時取得(棚卸しテンプレート)

監査観点では「誰が何にアクセスできるか」も同時に欲しいはずです。以下は CLI を使ったシンプルな棚卸しテンプレートです。

# スコープごとの ACL を列挙(READ/WRITE/MANAGE)
# 注意:API 呼び出し数が多くなるため、夜間バッチなどで実行推奨
echo -e "SCOPE\tBACKEND\tKEY_VAULT_DNS\tPRINCIPAL\tPERMISSION" > scopes_acls.tsv

databricks secrets list-scopes --output JSON 
| jq -r '.scopes[] | @base64' 
| while read -r row; do
_jq() { echo ${row} | base64 --decode | jq -r ${1}; }
scope=$(_jq '.name')
backend=$(_jq '.backend_type')
kvdns=$(_jq '.keyvault_metadata.dns_name // .backend_azure_keyvault.dns_name // "N/A"')

databricks secrets list-acls --scope "${scope}" --output JSON 
| jq -r '.items[] | [.principal, .permission] | @tsv' 
| while IFS=$'\t' read -r principal permission; do
echo -e "${scope}\t${backend}\t${kvdns}\t${principal}\t${permission}" >> scopes_acls.tsv
done
done 

生成された scopes_acls.tsv を CMDB やデータカタログに取り込むと、権限監査が自動化できます。

スコープ作成時「作成者のみ」だった権限をワークスペース全体へ変更する

背景

スコープは作成直後、Creator(作成者)に権限が限定されることが多く、他ユーザーが参照できずジョブが失敗する原因になりがちです。安全に開放するには、必要最小権限の原則を守りつつ、対象グループまたは全ユーザー(All‑Users)への ACL を設定します。

Databricks CLI で一括変更

「ワークスペース全体に READ を許可」する最小例です(必要に応じて WRITE / MANAGE)。

# 全スコープに対して users(All‑Users)へ READ を付与
databricks secrets list-scopes --output JSON \
| jq -r '.scopes[].name' \
| while read -r scope; do
    echo "Grant READ to users on ${scope}"
    databricks secrets put-acl --scope "${scope}" --principal "users" --permission READ
  done

ピンポイントで特定スコープのみ変更する場合:

databricks secrets put-acl --scope "SCOPE_NAME" --principal "users" --permission READ
# 変更の確認
databricks secrets list-acls --scope "SCOPE_NAME"

権限の意味(実務的な解釈)

権限できること注意点
READノートブック/ジョブで dbutils.secrets.get を使い値を取得ログ・エラー出力に値を露出させない(必ずマスク)
WRITEDatabricks‑backed スコープにシークレットを登録・更新AKV‑backed では AKV 側の更新が必要。WRITE を付けても Databricks からは登録できない
MANAGEスコープの ACL 管理(付与/剥奪)誤付与で広範囲に影響。最小人数に限定

ワークスペース UI で変更

  1. Data → Security → Secret Scopes を開く。
  2. 対象スコープの Permissions を選択。
  3. Add principal から users(全ユーザー)または特定グループを追加し、READ / WRITE / MANAGE を選択。
  4. 保存して反映。

ベストプラクティス:全ユーザーではなく、data-scientists や etl-jobs などの SCIM 連携グループへ付与する方が安全です。ジョブ専用には サービスプリンシパルを用意し、その ID へ必要最小権限で付与します。

実務で役立つスクリプト集

監査 CSV を作る Bash ワンライナー

# scopes_inventory.csv を作る
echo "scope,backend,key_vault_dns,resource_id,principal,permission" > scopes_inventory.csv
databricks secrets list-scopes --output JSON \
| jq -r '.scopes[] | @base64' \
| while read -r row; do
  _jq() { echo ${row} | base64 --decode | jq -r ${1}; }
  scope=$(_jq '.name')
  backend=$(_jq '.backend_type')
  kvdns=$(_jq '.keyvault_metadata.dns_name // .backend_azure_keyvault.dns_name // ""')
  rsrc=$(_jq '.keyvault_metadata.resource_id // .backend_azure_keyvault.resource_id // ""')

databricks secrets list-acls --scope "${scope}" --output JSON 
| jq -r --arg s "${scope}" --arg b "${backend}" --arg d "${kvdns}" --arg r "${rsrc}" 
'.items[] | [$s,$b,$d,$r,.principal,.permission] | @csv'
done >> scopes_inventory.csv 

ノートブック(Python)で REST API を叩き DataFrame 化

ワークスペース内で軽く可視化したい時の例です(PAT はシークレットから参照する想定)。

# Python(Databricks ノートブック)
import os, json, requests
from pyspark.sql import SparkSession

host = os.environ.get("DATABRICKS_HOST")  # 例: https://.azuredatabricks.net
token = dbutils.secrets.get("infra-secrets", "pat_token")  # PAT は Databricks‑backed に格納して参照

headers = {"Authorization": f"Bearer {token}"}
resp = requests.get(f"{host}/api/2.0/secrets/scopes/list", headers=headers, timeout=30)
scopes = resp.json().get("scopes", [])

rows = []
for s in scopes:
name = s.get("name")
backend = s.get("backend_type")
kv = s.get("keyvault_metadata") or s.get("backend_azure_keyvault") or {}
rows.append((name, backend, kv.get("dns_name"), kv.get("resource_id")))

spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(rows, ["scope", "backend", "key_vault_dns", "resource_id"])
display(df.orderBy("scope")) 

安全運用のチェックリスト

  • 命名規約:スコープ名・キー名に環境/用途(例:kv-prod/payments-api-key)を含め、混在時の誤用を予防。
  • Creator ロック解除:作成直後に必要なグループへ READ を付与。広げる前にジョブ影響を棚卸し。
  • Key Vault 依存関係:AKV‑backed は Databricks 側の ACL だけでは動かない。AKV 側の RBAC/アクセスポリシー/ファイアウォールも点検。
  • ログ衛生:シークレット値を print やエラーログに出さない(マスク・プレースホルダで代替)。
  • CMDB 連携:CLI/REST の JSON を定期収集し、差分検知・棚卸しを自動化。
  • 変更履歴:ACL 変更は監査ログに残る。変更申請とチケット紐付けを徹底。

動作確認の基本シナリオ(失敗時の典型エラー)

シナリオ確認手順よくあるエラー対処
Databricks‑backed の参照dbutils.secrets.get("SCOPE","KEY")SECRET_SCOPE_READ_PERMISSION_DENIEDスコープの READ を付与
AKV‑backed の参照同上AKV 側 403 / NotFound、タイムアウトAKV の RBAC/アクセスポリシー、ファイアウォール、プライベートエンドポイントを確認
CLI/REST で一覧list-scopes401/403(認証失敗)PAT/ログイン・スコープ権限を再設定

よくある質問(FAQ)

Q. 既存スコープの Key Vault を後から変更できますか?
A. できません。スコープ作成時に固定です。Vault を変える場合は新スコープを作成し、参照先を切り替えてから旧スコープを廃止します。

Q. スコープの削除は安全ですか?
A. 参照ジョブが残っていると失敗や本番障害につながります。利用調査(検索・リポジトリ横断 grep・ダッシュボード依存関係)を行い、メンテナンス窓で実施してください。

Q. 値を丸見えにせずに接続検証したい
A. テスト接続は値を直接出さず、try/except で成功/失敗のみロギングする実装を推奨します(例:HTTP 200 が返れば成功)。

Q. どの権限から付けるべき?
A. 原則は READ のみ。WRITE/MANAGE は管理者または IaC パイプラインのテクニカルユーザーに限定します。

運用設計テンプレート(サンプル・ポリシー)

  • 命名規則:<env>-<system>-<purpose>(例:prod-bi-snowflake-creds)
  • ACL 標準:グループ etl-jobs へ READ、platform-admins へ MANAGE、サービスプリンシパルへ必要最小。
  • AKV 方針:ファイアウォールは必要サブネットのみ許可。Managed Identity/Access Connector を優先。
  • 監査:月次で list-scopes + list-acls を収集、差分レポートを配布。

まとめ(実務での使い分け)

  • 即時確認:ノートブックの dbutils.secrets.listScopes()。
  • 正確な対応表:REST API または CLI で backend_type と Key Vault 情報を取得。
  • 権限の是正:CLI で put-acl を活用。広げすぎず、グループ単位で最小付与。
  • 自動化:CSV/JSON を CMDB に取り込み、差分検知・棚卸しをジョブ化。

付録:コマンド早見表

目的コマンド / API備考
スコープ名の一覧dbutils.secrets.listScopes()ノートブック上で即時
スコープ内キー名の一覧dbutils.secrets.list("SCOPE_NAME")Databricks‑backed のみ有効
スコープ一覧(JSON)GET /api/2.0/secrets/scopes/listbackend_type と Key Vault 情報を取得可能
CLI で一覧databricks secrets list-scopes --output JSONJQ と併用で棚卸しが高速
ACL の付与databricks secrets put-acl --scope SCOPE --principal users --permission READWRITE / MANAGE も指定可
ACL の確認databricks secrets list-acls --scope SCOPE監査ログ取得の前段

付録:トラブル時の診断コマンド

# 認証状態(新 CLI)
databricks auth env
databricks auth profiles

# 単一スコープの詳細と ACL

databricks secrets list-scopes --output JSON | jq '.scopes[] | select(.name=="SCOPE_NAME")'
databricks secrets list-acls --scope "SCOPE_NAME" --output JSON

# Key Vault 到達性(VNET/Firewall/Private Endpoint の切り分けに)

# curl または tcpping 相当でネットワーク診断(企業プロキシ環境に注意)

結語

シークレットの混在運用は「現状可視化」「権限の標準化」「自動化」の三段で安定します。まずは CLI/REST でスコープ⇔Key Vault の対応表を作り、Creator ロックを正しく外してグループ単位の最小権限へ是正。最後に定期ジョブで差分監査を回すことで、セキュリティと開発速度の両立を図れます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次