关于 hardening-user-privileges
hardening-user-privileges 是用于审计并收紧 CockroachDB 角色权限的安全技能。它指导数据库管理员创建用途专属角色、落实最小权限,并分阶段验证变更以减少对应用的影响。
主要功能
- 01审计用户、角色和授权
- 02识别过度的 admin 与 PUBLIC 权限
- 03创建用途专属角色
- 04重新分配用户并撤销宽泛授权
- 05验证变更并测试应用
- 06规划权限问题的回滚
适用场景
- 01为 CockroachDB 安全审计做准备
- 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 权限或特定授权,撤销这些授权后,应用将因权限错误而失败。
缓解措施:
- 撤销前先审计: 记录哪些用户/应用依赖哪些授权
- 先创建替代角色: 撤销管理员权限前,先分配用途专属角色
- 在预发布环境中测试: 先在预发布环境中撤销授权,并测试所有应用流程
- 逐步撤销: 每次撤销一个用户或一项授权,并进行测试
- 监控错误: 更改后查看应用日志,留意权限被拒绝的错误
不要撤销以下对象的管理员权限:
- 最后一个管理员用户(否则你将无法管理集群)
- 管理架构迁移的自动化账户(除非已创建
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 官方文档: