Skip to content

GaussDB 用户与角色管理

用户管理

用户创建

创建普通用户

sql
-- 创建普通用户
CREATE USER user1 WITH LOGIN PASSWORD 'User1@123';

-- 创建带有效期的用户
CREATE USER user2 WITH LOGIN PASSWORD 'User2@123' VALID UNTIL '2025-12-31';

-- 创建带有资源限制的用户
CREATE USER user3 WITH LOGIN PASSWORD 'User3@123' CONNECTION LIMIT 10;

用户属性设置

sql
-- 设置用户密码
ALTER USER user1 IDENTIFIED BY 'NewPass@123';

-- 锁定用户
ALTER USER user1 ACCOUNT LOCK;

-- 解锁用户
ALTER USER user1 ACCOUNT UNLOCK;

-- 延长用户有效期
ALTER USER user2 VALID UNTIL '2026-12-31';

-- 修改用户连接限制
ALTER USER user3 CONNECTION LIMIT 20;

用户删除

sql
-- 删除用户(如果用户有对象,需要先删除对象或使用 CASCADE)
DROP USER IF EXISTS user1;

-- 级联删除用户及其所有对象
DROP USER IF EXISTS user2 CASCADE;

用户认证方式

密码认证

  • 默认的认证方式
  • 密码存储采用加密方式
  • 支持密码复杂度策略

SSL 证书认证

  • 基于 SSL 客户端证书进行认证
  • 提供更高的安全性
  • 适合高安全要求的场景
sql
-- 配置 SSL 认证
ALTER SYSTEM SET ssl = on;
ALTER SYSTEM SET ssl_cert_file = 'server.crt';
ALTER SYSTEM SET ssl_key_file = 'server.key';
ALTER SYSTEM SET ssl_ca_file = 'root.crt';

LDAP 认证

  • 与外部 LDAP 服务器集成
  • 集中管理用户认证
  • 适合企业级环境

角色管理

角色创建

创建基本角色

sql
-- 创建角色
CREATE ROLE dba_role;

-- 创建带有登录权限的角色(相当于用户)
CREATE ROLE admin_role WITH LOGIN PASSWORD 'Admin@123';

-- 创建带有继承权限的角色
CREATE ROLE dev_role INHERIT;

角色权限分配

sql
-- 向角色授予数据库权限
GRANT CONNECT ON DATABASE mydb TO dev_role;
GRANT USAGE ON SCHEMA public TO dev_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO dev_role;

-- 向角色授予系统权限
GRANT CREATEDB TO admin_role;
GRANT CREATEROLE TO admin_role;

角色成员管理

sql
-- 将用户添加为角色成员
GRANT dev_role TO user1, user2;

-- 将角色添加为另一个角色的成员(角色继承)
GRANT dev_role TO admin_role;

-- 移除角色成员
REVOKE dev_role FROM user2;

角色删除

sql
-- 删除角色
DROP ROLE IF EXISTS dev_role;

-- 级联删除角色
DROP ROLE IF EXISTS dba_role CASCADE;

权限管理

权限类型

对象权限

  • 表级权限:SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER
  • 序列权限:USAGE, SELECT, UPDATE
  • 数据库权限:CONNECT, CREATE, TEMPORARY
  • 模式权限:USAGE, CREATE

系统权限

  • SUPERUSER:超级用户权限
  • CREATEDB:创建数据库权限
  • CREATEROLE:创建角色权限
  • REPLICATION:复制权限
  • BYPASSRLS:绕过行级安全策略

权限授予与回收

授予权限

sql
-- 授予表权限
GRANT SELECT, INSERT ON table1 TO user1;

-- 授予所有表的权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO dev_role;

-- 授予未来创建的表的权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO dev_role;

回收权限

sql
-- 回收表权限
REVOKE INSERT ON table1 FROM user1;

-- 回收所有表的权限
REVOKE SELECT ON ALL TABLES IN SCHEMA public FROM dev_role;

-- 回收未来创建的表的权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT ON TABLES FROM dev_role;

权限继承

  • 角色成员可以继承角色的权限
  • 可以通过 SET ROLE 命令切换到角色权限
  • 适合实现基于角色的访问控制(RBAC)
sql
-- 切换到角色权限
SET ROLE dev_role;

-- 恢复到用户权限
RESET ROLE;

资源限制

连接限制

  • 限制用户或角色的最大连接数
  • 防止单个用户占用过多连接资源
  • 可以在用户或角色级别设置
sql
-- 设置用户连接限制
ALTER USER user1 CONNECTION LIMIT 5;

-- 设置角色连接限制
ALTER ROLE dev_role CONNECTION LIMIT 20;

资源池限制

  • 通过资源池(Resource Pool)管理资源使用
  • 可以限制 CPU、内存、IO 等资源
  • 适合复杂的资源管理场景
sql
-- 创建资源池
CREATE RESOURCE POOL my_pool WITH (ACTIVE_STATEMENTS=10, MEMORY_LIMIT='2GB');

-- 将用户关联到资源池
ALTER USER user1 RESOURCE POOL my_pool;

审计与监控

用户活动审计

  • 启用审计日志,记录用户的关键操作
  • 可以审计登录、权限变更、DDL 操作等
  • 便于安全审计和问题追溯
sql
-- 启用审计日志
ALTER SYSTEM SET audit_enabled = on;
ALTER SYSTEM SET audit_directory = '/var/log/gaussdb/audit';
ALTER SYSTEM SET audit_level = 'detailed';

用户会话监控

sql
-- 查看当前用户会话
SELECT * FROM pg_stat_activity;

-- 查看用户的连接数
SELECT usename, COUNT(*) FROM pg_stat_activity GROUP BY usename;

-- 终止用户会话
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'user1';

权限审计

sql
-- 查看用户的权限
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'user1';

-- 查看角色的成员关系
SELECT * FROM pg_auth_members WHERE roleid = (SELECT oid FROM pg_roles WHERE rolname = 'dev_role');

最佳实践

最小权限原则

  • 为用户和角色分配最小必需的权限
  • 避免过度授权
  • 定期审查和回收不必要的权限

基于角色的访问控制

  • 使用角色管理权限,简化权限分配
  • 按职能创建角色,如 DBA、开发、只读等
  • 角色可以继承,实现权限的层级管理

强密码策略

  • 配置密码复杂度要求
  • 设置密码有效期
  • 限制密码重试次数
  • 禁用弱密码
sql
-- 配置密码策略
ALTER SYSTEM SET password_policy = 'strong';
ALTER SYSTEM SET password_min_length = 12;
ALTER SYSTEM SET password_max_age = 90;
ALTER SYSTEM SET failed_login_attempts = 5;
ALTER SYSTEM SET password_lock_time = 30;

定期权限审查

  • 定期审查用户和角色的权限
  • 移除不再需要的权限
  • 验证权限分配是否符合业务需求
  • 记录权限变更历史

分离职责

  • 分离管理权限和业务权限
  • 避免单一用户拥有过多权限
  • 实现职责分离,提高安全性

常见问题(FAQ)

Q1: 用户和角色有什么区别?

A1: 在 GaussDB 中,用户和角色的概念是统一的,主要区别在于:

  1. 角色默认没有登录权限,而用户有登录权限
  2. 角色主要用于权限管理,用户主要用于登录认证
  3. 一个用户可以是多个角色的成员,继承多个角色的权限
  4. 可以通过 CREATE ROLE ... WITH LOGIN 创建带有登录权限的角色(相当于用户)

Q2: 如何查看用户拥有的所有权限?

A2: 可以使用以下方法查看用户的权限:

sql
-- 查看用户的系统权限
SELECT * FROM pg_roles WHERE rolname = 'user1';

-- 查看用户的对象权限
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'user1';
SELECT * FROM information_schema.role_sequence_grants WHERE grantee = 'user1';
SELECT * FROM information_schema.role_routine_grants WHERE grantee = 'user1';

-- 查看用户继承的角色权限
SELECT * FROM pg_auth_members WHERE member = (SELECT oid FROM pg_roles WHERE rolname = 'user1');

Q3: 如何实现权限的层级管理?

A3: 可以通过角色继承实现权限的层级管理:

  1. 创建基础角色,分配基本权限
  2. 创建高级角色,继承基础角色的权限,并添加额外权限
  3. 将用户添加为相应角色的成员
  4. 这样用户可以继承多个角色的权限,实现层级管理

Q4: 如何防止用户误删数据?

A4: 防止用户误删数据的方法:

  1. 为用户分配最小必需的权限,避免授予 DELETE 或 TRUNCATE 权限
  2. 使用行级安全策略(RLS)限制用户的数据访问范围
  3. 启用审计日志,记录所有删除操作
  4. 定期备份数据,确保可以恢复误删的数据
  5. 使用事务和保存点,允许用户回滚误操作

Q5: 如何管理大量用户和角色?

A5: 管理大量用户和角色的方法:

  1. 使用角色管理权限,简化权限分配
  2. 按职能或部门创建角色,如 dev_role、test_role 等
  3. 使用脚本自动化用户和角色的创建和管理
  4. 定期审查和清理不再使用的用户和角色
  5. 与外部身份管理系统集成,如 LDAP、Active Directory 等

Q6: 如何处理忘记密码的情况?

A6: 处理忘记密码的情况:

  1. 使用超级用户权限重置密码:ALTER USER username IDENTIFIED BY 'new_password';
  2. 如果没有超级用户权限,联系数据库管理员协助重置
  3. 启用密码重置功能,允许用户自行重置密码
  4. 定期提醒用户更换密码,并使用密码管理工具

Q7: 如何限制用户的资源使用?

A7: 限制用户资源使用的方法:

  1. 设置用户的连接限制:ALTER USER username CONNECTION LIMIT n;
  2. 使用资源池限制 CPU、内存等资源:CREATE RESOURCE POOL ...
  3. 配置数据库参数,如 max_connections、work_mem 等
  4. 使用资源管理工具监控和控制用户的资源使用

Q8: 如何实现只读用户?

A8: 创建只读用户的方法:

sql
-- 创建只读用户
CREATE USER readonly_user WITH LOGIN PASSWORD 'Readonly@123';

-- 授予只读权限
GRANT CONNECT ON DATABASE mydb TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;

-- 授予未来创建的表的只读权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly_user;

Q9: 如何审计用户的操作?

A9: 审计用户操作的方法:

  1. 启用审计日志:ALTER SYSTEM SET audit_enabled = on;
  2. 配置审计级别和审计目录
  3. 查看审计日志文件,分析用户操作
  4. 使用日志分析工具,如 ELK Stack、Splunk 等
  5. 设置审计告警,及时发现异常操作

Q10: 如何安全地迁移用户和权限?

A10: 安全迁移用户和权限的方法:

  1. 使用 pg_dumpall --globals-only 导出用户和权限
  2. 在目标数据库中恢复用户和权限
  3. 验证用户和权限的正确性
  4. 测试用户的连接和操作权限
  5. 监控迁移后的用户活动,确保一切正常