mcpField
H
hardening-user-privileges

hardening-user-privileges

github.com/cockroachlabsセキュリティ23124 回インストール14 週間前に更新
リポジトリ

hardening-user-privileges について

hardening-user-privilegesは、CockroachDBのロール権限を監査し、過剰な権限を減らすセキュリティスキルです。データベース管理者向けに、専用ロールの作成、最小権限の適用、影響を抑えた段階的な検証を案内します。

主な機能

  1. 01ユーザー、ロール、権限の監査
  2. 02過剰なadminとPUBLIC権限の特定
  3. 03用途別ロールの作成
  4. 04ユーザーの再割り当てと広範な権限の撤回
  5. 05変更の検証とアプリケーションのテスト
  6. 06権限問題に備えたロールバック計画

活用シーン

  1. 01CockroachDBのセキュリティ監査の準備
  2. 02広範なadmin権限を限定的なロールに置換
  3. 03データベースオブジェクトのPUBLIC権限の削減
  4. 04クラスターへの最小権限アクセスの導入

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/cockroachlabs/cockroachdb-skills --skill hardening-user-privileges

インストール後、Claude Code で/hardening-user-privilegesを入力して読み込まれたか確認します。

同梱ファイルreferences/sql-queries.md

詳細

ユーザー権限の強化

過剰な権限を持つユーザーの特定、管理者権限の付与の削減、PUBLIC ロールの権限の制限、目的別ロールの作成、最小権限の原則の適用により、CockroachDB のロールベースアクセス制御(RBAC)を監査し、強化します。

このスキルを使用するタイミング

  • 管理者ロールを持つユーザーの数を減らす場合
  • PUBLIC ロールの過剰な権限(SELECT、INSERT、UPDATE、DELETE)を削除する場合
  • 広範な管理者権限の付与に代わる、目的別ロールを作成する場合
  • 過剰な権限に関するセキュリティ監査の指摘に対応する場合
  • 本番クラスターに RBAC のベストプラクティスを実装する場合
  • クラスターを最小権限のアクセスモデルに移行する場合

前提条件

  • SQL アクセス:管理者ロールが必要です(権限付与とロールメンバーシップの変更に必要)
  • ユーザーの一覧:各ユーザー/アプリケーションが必要とするアクセスレベルを把握していること
  • アプリケーションのテスト計画:権限の取り消しにより、それらに依存するアプリケーションが動作しなくなる可能性があります

アクセス権を確認します:

SELECT member FROM [SHOW GRANTS ON ROLE admin] WHERE member = current_user();

手順

1. 現在のユーザーとロールを監査する
-- List all users and their role memberships
SELECT
  username,
  options,
  member_of
FROM [SHOW USERS]
ORDER BY username;

-- Count admin role members
SELECT COUNT(*) AS admin_count
FROM [SHOW GRANTS ON ROLE admin];

-- List all admin users
SELECT member AS admin_user
FROM [SHOW GRANTS ON ROLE admin]
WHERE is_admin = true
ORDER BY member;

追加の監査クエリについては、SQL クエリのリファレンスを参照してください。

2. 過剰な権限を持つユーザーを特定する

管理者ロールの確認:

-- Admin users — each should have a documented reason for admin access
SELECT member AS admin_user
FROM [SHOW GRANTS ON ROLE admin]
WHERE is_admin = true
ORDER BY member;

各管理者ユーザーを評価します:

  • 管理者のままにする: 完全なアクセス権が本当に必要なクラスター運用担当者、DBA、自動化アカウント
  • 権限を下げる: 特定の権限のみが必要な開発者、アナリスト、アプリケーションのサービスアカウント

PUBLIC ロールの確認:

-- Check what PUBLIC can do (these apply to ALL users)
SELECT
  database_name,
  schema_name,
  object_name,
  object_type,
  privilege_type
FROM [SHOW GRANTS FOR public]
WHERE privilege_type NOT IN ('USAGE')
  AND schema_name = 'public'
ORDER BY database_name, object_name;

システム権限の確認:

-- Users with sensitive system privileges
SELECT grantee, privilege_type
FROM [SHOW SYSTEM GRANTS]
WHERE privilege_type IN (
  'MODIFYCLUSTERSETTING',
  'CANCELQUERY',
  'CANCELSESSION',
  'VIEWACTIVITY',
  'CREATEDB',
  'CREATELOGIN'
)
ORDER BY privilege_type, grantee;
3. 目的別ロールを作成する

広範な管理者権限の付与を、対象を絞ったロールに置き換えます。CockroachDB でデータベースレベルに付与できる権限は、CONNECT、CREATE、DROP、ZONECONFIG、BACKUP、RESTORE、ALL のみです。データアクセス権限(SELECT、INSERT、UPDATE、DELETE)はスキーマまたはテーブルレベルで付与します。GRANT ... ON ALL TABLES IN SCHEMA(既存のテーブルが対象)と ALTER DEFAULT PRIVILEGES(指定した付与者が今後作成するテーブルが対象)を組み合わせることで、新しいテーブルにも意図したアクセス権が継承されます。

-- Read-only role for analysts
CREATE ROLE analyst_reader;
GRANT CONNECT ON DATABASE <app_db> TO analyst_reader;
GRANT USAGE ON SCHEMA <app_db>.public TO analyst_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA <app_db>.public TO analyst_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA <app_db>.public GRANT SELECT ON TABLES TO analyst_reader;

-- Application service role (read + write, no DDL)
CREATE ROLE app_service;
GRANT CONNECT ON DATABASE <app_db> TO app_service;
GRANT USAGE ON SCHEMA <app_db>.public TO app_service;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA <app_db>.public TO app_service;
ALTER DEFAULT PRIVILEGES IN SCHEMA <app_db>.public
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_service;

-- Schema management role (DDL only)
CREATE ROLE schema_manager;
GRANT CREATE ON DATABASE <app_db> TO schema_manager;

-- Monitoring role (read-only system visibility)
CREATE ROLE monitoring;
GRANT SYSTEM VIEWACTIVITYREDACTED TO monitoring;

-- Operations role (triage + cancel, no data access)
CREATE ROLE ops_triage;
GRANT SYSTEM VIEWACTIVITYREDACTED, CANCELQUERY TO ops_triage;
4. ユーザーを目的別ロールに再割り当てする
-- Assign users to their appropriate roles
GRANT analyst_reader TO analyst_user;
GRANT app_service TO payment_service, order_service;
GRANT schema_manager TO migration_user;
GRANT monitoring TO monitoring_user;
GRANT ops_triage TO oncall_sre;
5. 過剰な権限付与を取り消す

不要になったユーザーから管理者権限を取り消します:

-- Revoke admin from specific users
REVOKE admin FROM analyst_user;
REVOKE admin FROM payment_service;
REVOKE admin FROM monitoring_user;

PUBLIC ロールのデータ権限付与を取り消します:

-- Revoke SELECT from PUBLIC on existing tables, plus the default-privilege grant
REVOKE SELECT ON ALL TABLES IN SCHEMA <app_db>.public FROM public;
ALTER DEFAULT PRIVILEGES IN SCHEMA <app_db>.public REVOKE SELECT ON TABLES FROM public;

-- Revoke all data privileges from PUBLIC on specific tables
REVOKE ALL ON TABLE <sensitive_table> FROM public;

不要なシステム権限を取り消します:

-- Revoke system privileges from users who don't need them
REVOKE SYSTEM MODIFYCLUSTERSETTING FROM <username>;
REVOKE SYSTEM CREATEDB FROM <username>;
6. 変更を検証する
-- Confirm admin count is reduced
SELECT COUNT(*) AS admin_count FROM [SHOW GRANTS ON ROLE admin];

-- Confirm PUBLIC privileges are minimal
SELECT database_name, privilege_type
FROM [SHOW GRANTS FOR public]
WHERE privilege_type NOT IN ('USAGE');

-- Verify specific user's effective privileges
SHOW GRANTS FOR <username>;

アプリケーションのテスト: 権限付与を取り消した後、すべてのアプリケーションが引き続き正常に動作することを確認します。以下をテストします:

  • 読み取り操作(SELECT)
  • 書き込み操作(INSERT、UPDATE、DELETE)
  • スキーマ操作(CREATE、ALTER、DROP)— スキーマ管理アカウントのみ
  • 接続と認証

安全上の考慮事項

権限付与を取り消すと、アプリケーションが動作しなくなる可能性があります。 管理者、PUBLIC、または特定の権限付与に依存するアプリケーションは、それらが取り消されると権限エラーで失敗します。

緩和策:

  1. 取り消す前に監査する: どのユーザー/アプリがどの権限付与に依存しているかを記録します
  2. 先に代替ロールを作成する: 管理者権限を取り消す前に、目的別ロールを割り当てます
  3. ステージング環境でテストする: まずステージング環境で権限を取り消し、すべてのアプリケーションフローをテストします
  4. 段階的に取り消す: 一度に1つのユーザー/権限付与を取り消してテストします
  5. エラーを監視する: 変更後、アプリケーションログで権限拒否エラーを確認します

次のユーザーから管理者権限を取り消さないでください:

  • 最後に残った管理者ユーザー(クラスターを管理できなくなります)
  • スキーマ移行を管理する自動化アカウント(schema_manager ロールを作成済みの場合を除く)
  • root ユーザー(組み込みユーザーであり、権限を取り消せません)

ロールバック

権限付与を取り消した後にアプリケーションが動作しなくなった場合:

-- Re-grant admin (emergency)
GRANT admin TO <username>;

-- Re-grant specific privileges
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA <app_db>.public TO <username>;

-- Re-grant PUBLIC privileges
GRANT SELECT ON ALL TABLES IN SCHEMA <app_db>.public TO public;

ベストプラクティス: 必要に応じて復元できるよう、取り消す前にすべての権限付与を記録しておきます:

-- Snapshot current grants before changes
SELECT * FROM [SHOW GRANTS FOR <username>];
SELECT * FROM [SHOW GRANTS FOR public];
SELECT * FROM [SHOW SYSTEM GRANTS];

参考資料

スキルの参考資料:

関連スキル:

CockroachDB 公式ドキュメント:

コメント