Skip to content

RBAC Policy Guide Community

DB GatekeeperのRole-Based Access Control(RBAC)ポリシーの設定ガイドです。


1. ロール一覧と権限マトリクス

Section titled “1. ロール一覧と権限マトリクス”

DB Gatekeeperには4つの組み込みロールがあります。

ロール説明
read_only読み取り専用。SELECT以外の全操作を拒否
junior_dev一般開発者。SELECT/INSERTは自動承認、更新系は人間承認が必要
senior_devシニア開発者。全操作を自動承認
admin管理者。全操作を自動承認

権限マトリクス(デフォルト)

Section titled “権限マトリクス(デフォルト)”
ロールSELECTINSERTUPDATEDELETEDDL
read_onlyAutoApproveDenyDenyDenyDeny
junior_devAutoApproveAutoApproveRequireHumanRequireHumanRequireHuman
senior_devAutoApproveAutoApproveAutoApproveAutoApproveRequireHuman
adminAutoApproveAutoApproveAutoApproveAutoApproveAutoApprove
Decision動作
AutoApproveAI審査をスキップし、クエリを即時通過させる
RequireHumanAIリスク評価を実行し、スコアに応じて自動承認または人間承認待ちにする
Denyクエリを即座に拒否する

ロール別AIスコア自動承認閾値(デフォルト)

Section titled “ロール別AIスコア自動承認閾値(デフォルト)”

RequireHuman 判定の場合、AIリスクスコア(0-100)がこの閾値未満であれば自動承認されます。

ロール閾値説明
read_only0更新系は全拒否のためこの値は使用されない
junior_dev10非常に厳しい(ほぼ全て人間承認)
senior_dev50緩めの閾値
admin100全て自動承認

未登録ユーザーは junior_dev ロールとして扱われます。


最もシンプルな設定方法です。ユーザーにロールを割り当てます。

ロール名:ユーザー1,ユーザー2;ロール名:ユーザー3,ユーザー4

セミコロン(;)でロールを区切り、コロン(:)でロール名とユーザーリストを区切ります。ユーザーリスト内はカンマ(,)で区切ります。

Terminal window
# 基本的な設定
export GATEKEEPER_ROLES="read_only:report_user;junior_dev:dev1,dev2;senior_dev:lead1;admin:dba_admin"

この設定により:

  • report_userread_only(SELECTのみ許可)
  • dev1, dev2junior_dev(更新系は人間承認必須)
  • lead1senior_dev(全操作自動承認)
  • dba_adminadmin(全操作自動承認)
  • 上記以外のユーザー → junior_dev(デフォルト)

3. JSONポリシーファイルの書き方

Section titled “3. JSONポリシーファイルの書き方”

より詳細な制御が必要な場合、JSONポリシーファイルを使用します。

{
"default_role": "junior_dev",
"users": {
"report_user": "read_only",
"dev1": "junior_dev",
"lead1": "senior_dev",
"dba_admin": "admin"
},
"roles": {
"read_only": {
"allowed_actions": ["SELECT"],
"denied_actions": ["INSERT", "UPDATE", "DELETE", "DDL"],
"auto_approve_threshold": 0
},
"junior_dev": {
"allowed_actions": ["SELECT", "INSERT"],
"denied_actions": [],
"require_approval_actions": ["UPDATE", "DELETE", "DDL"],
"auto_approve_threshold": 10,
"max_jit_ttl_seconds": 3600
},
"senior_dev": {
"allowed_actions": ["SELECT", "INSERT", "UPDATE", "DELETE", "DDL"],
"denied_actions": [],
"auto_approve_threshold": 50
},
"admin": {
"allowed_actions": ["SELECT", "INSERT", "UPDATE", "DELETE", "DDL"],
"denied_actions": [],
"auto_approve_threshold": 100
}
},
"rules": []
}
フィールド説明
default_rolestring未登録ユーザーのデフォルトロール
usersobjectユーザー名 → ロール名のマッピング
rolesobjectロール名 → ロール設定のマッピング
rulesarrayカスタムルール(後述)
フィールド説明
allowed_actionsstring[]自動承認するアクション(AutoApprove)
denied_actionsstring[]即座に拒否するアクション(Deny)
require_approval_actionsstring[]人間承認が必要なアクション(RequireHuman)
auto_approve_thresholdintAIスコアの自動承認閾値(0-100)
max_jit_ttl_secondsintJITアクセスの最大TTL(秒、オプション)

ポリシーエンジンは以下の順序でアクションを評価します:

  1. denied_actions に含まれる → Deny
  2. require_approval_actions に含まれる → RequireHuman
  3. allowed_actions に含まれる → AutoApprove
  4. いずれにも含まれない → Deny(安全側にフォールバック)
Terminal window
export GATEKEEPER_POLICY_FILE=/etc/gatekeeper/policy.json
./gatekeeper

カスタムルールを使うと、特定の条件にマッチするクエリに対してロール設定よりも優先される判定を適用できます。

{
"rules": [
{
"description": "ルールの説明",
"match": {
"action": "DELETE",
"query_contains": ["production_data"],
"query_not_contains": ["WHERE"],
"users": ["dev1"],
"roles": ["junior_dev"]
},
"decision": "deny"
}
]
}

全ての条件はAND(全て一致する場合にマッチ)で評価されます。条件が未指定の場合、その条件は無視されます。

フィールド説明
actionstringアクション種別(SELECT, INSERT, UPDATE, DELETE, DDL
query_containsstring[]クエリに含まれるべき文字列(いずれか1つが含まれればマッチ、大文字小文字を区別しない)
query_not_containsstring[]クエリに含まれてはいけない文字列(全て含まれている場合はマッチしない)
usersstring[]対象ユーザー名(いずれか1つにマッチすればOK)
rolesstring[]対象ロール名(いずれか1つにマッチすればOK)
説明
"deny"即座に拒否
"require_human"人間承認が必要
"auto_approve"自動承認
  1. カスタムルールrules 配列の先頭から順に評価、最初にマッチしたものが適用)
  2. ロール設定rolesallowed_actions / denied_actions / require_approval_actions
  3. ハードコードされたデフォルト(組み込みロールの権限マトリクス)
{
"default_role": "junior_dev",
"users": {
"dev1": "junior_dev",
"lead1": "senior_dev",
"dba_admin": "admin"
},
"roles": {
"junior_dev": {
"allowed_actions": ["SELECT", "INSERT"],
"require_approval_actions": ["UPDATE", "DELETE", "DDL"],
"auto_approve_threshold": 10
},
"senior_dev": {
"allowed_actions": ["SELECT", "INSERT", "UPDATE", "DELETE", "DDL"],
"auto_approve_threshold": 50
},
"admin": {
"allowed_actions": ["SELECT", "INSERT", "UPDATE", "DELETE", "DDL"],
"auto_approve_threshold": 100
}
},
"rules": [
{
"description": "WHERE句なしのDELETEは全ロールで拒否",
"match": {
"action": "DELETE",
"query_not_contains": ["WHERE"]
},
"decision": "deny"
},
{
"description": "本番テーブルへのDDLはadminでも人間承認必須",
"match": {
"action": "DDL",
"query_contains": ["production_", "prod_"]
},
"decision": "require_human"
},
{
"description": "TRUNCATEは全ユーザーで拒否",
"match": {
"query_contains": ["TRUNCATE"]
},
"decision": "deny"
},
{
"description": "senior_devのログテーブルへのDELETEは自動承認",
"match": {
"action": "DELETE",
"query_contains": ["access_logs", "audit_logs"],
"roles": ["senior_dev"]
},
"decision": "auto_approve"
}
]
}

DB Gatekeeperは、稼働中にポリシーをAPI経由でホットリロードできます。

Terminal window
# 認証なしの場合
curl http://localhost:8080/policies
# 認証ありの場合
curl -H "Authorization: Bearer ${ADMIN_API_KEY}" \
http://localhost:8080/policies

レスポンス例:

{
"roles": {
"junior_dev": {
"allowed_actions": ["SELECT", "INSERT"],
"require_approval_actions": ["UPDATE", "DELETE", "DDL"],
"auto_approve_threshold": 10
}
},
"users": {
"dev1": "junior_dev",
"lead1": "senior_dev"
},
"default_role": "junior_dev",
"rules": []
}

ポリシーを更新(ホットリロード)

Section titled “ポリシーを更新(ホットリロード)”
Terminal window
curl -X PUT \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${ADMIN_API_KEY}" \
-d @policy.json \
http://localhost:8080/policies

成功レスポンス:

{"status": "policy updated"}

注意: PUT /policies はポリシーをメモリ上で即時反映しますが、永続化はされません。永続的な変更には GATEKEEPER_POLICY_FILE のファイルを更新してください。


  • デフォルトロールは junior_dev(または read_only)に設定する
  • 必要最小限のユーザーにのみ senior_dev / admin を付与する
  • admin ロールは本当に必要な管理者のみに限定する
  • WHERE句なしのDELETE/UPDATEは常に拒否するルールを追加する
  • 本番データテーブルへのDDL操作には人間承認を必須にする
  • TRUNCATE操作は原則として全ユーザーに対して拒否する
  • junior_dev の閾値は低く(10以下)設定し、ほぼ全て人間承認にする
  • senior_dev の閾値は中程度(30-50)に設定し、明らかに安全なクエリのみ自動承認にする
  • 運用開始時は閾値を低く設定し、AIの判定精度を確認しながら徐々に上げる
Terminal window
# 開発環境: 緩めの設定
export GATEKEEPER_ROLES="admin:dev1,dev2,dev3"
export GATEKEEPER_APPROVAL_TIMEOUT=10
# 本番環境: 厳格な設定
export GATEKEEPER_POLICY_FILE=/etc/gatekeeper/production-policy.json
export GATEKEEPER_APPROVAL_TIMEOUT=300
export ADMIN_API_KEY=strong-random-token
  • ADMIN_API_KEY を必ず設定し、管理APIへのアクセスを制限する
  • GATEKEEPER_SLACK_WEBHOOK_URL を設定し、承認リクエストをSlackで通知する
  • ダッシュボード(http://localhost:8080)で承認待ちクエリを定期的に確認する
  • 監査ログ(GET /audit)を定期的にレビューする