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. 01为 CockroachDB 安全审计做准备
  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. 逐步撤销: 每次撤销一个用户或一项授权,并进行测试
  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 官方文档:

评论

支持 Markdown