hardening-user-privileges について
hardening-user-privilegesは、CockroachDBのロール権限を監査し、過剰な権限を減らすセキュリティスキルです。データベース管理者向けに、専用ロールの作成、最小権限の適用、影響を抑えた段階的な検証を案内します。
主な機能
- 01ユーザー、ロール、権限の監査
- 02過剰なadminとPUBLIC権限の特定
- 03用途別ロールの作成
- 04ユーザーの再割り当てと広範な権限の撤回
- 05変更の検証とアプリケーションのテスト
- 06権限問題に備えたロールバック計画
活用シーン
- 01CockroachDBのセキュリティ監査の準備
- 02広範なadmin権限を限定的なロールに置換
- 03データベースオブジェクトのPUBLIC権限の削減
- 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つのユーザー/権限付与を取り消してテストします
- エラーを監視する: 変更後、アプリケーションログで権限拒否エラーを確認します
次のユーザーから管理者権限を取り消さないでください:
- 最後に残った管理者ユーザー(クラスターを管理できなくなります)
- スキーマ移行を管理する自動化アカウント(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];
参考資料
スキルの参考資料:
関連スキル:
- auditing-cloud-cluster-security — セキュリティ態勢の包括的な監査を実施します
- configuring-audit-logging — 権限に関わる操作の監査ログを設定します
CockroachDB 公式ドキュメント: