Skip to content

GaussDB 权限管理

权限类型

GaussDB 支持多种类型的权限,主要包括:

1. 对象权限

对象权限控制用户对数据库对象(如表、视图、函数等)的操作权限,包括:

  • SELECT:查询权限
  • INSERT:插入权限
  • UPDATE:更新权限
  • DELETE:删除权限
  • REFERENCES:引用权限(用于外键)
  • TRIGGER:触发器权限
  • EXECUTE:执行权限(用于函数和存储过程)
  • USAGE:使用权限(用于序列、类型等)

2. 语句权限

语句权限控制用户可以执行的 SQL 语句类型,包括:

  • CREATE:创建对象权限
  • ALTER:修改对象权限
  • DROP:删除对象权限
  • TRUNCATE:截断表权限
  • COMMENT:添加注释权限
  • GRANT:授予权限权限
  • REVOKE:回收权限权限

3. 数据库权限

数据库权限控制用户对数据库的访问和操作权限,包括:

  • CONNECT:连接数据库权限
  • CREATE:在数据库中创建对象权限
  • TEMPORARY:创建临时表权限

4. 模式权限

模式权限控制用户对模式的访问和操作权限,包括:

  • USAGE:使用模式权限
  • CREATE:在模式中创建对象权限

角色管理

1. 角色类型

GaussDB 支持两种类型的角色:

  • 登录角色:可以用于登录数据库的角色,相当于传统意义上的用户
  • 非登录角色:用于权限管理的角色,不能直接登录数据库

2. 创建角色

sql
-- 创建登录角色
CREATE ROLE role_name WITH LOGIN PASSWORD 'password';

-- 创建非登录角色
CREATE ROLE role_name;

-- 创建具有特定属性的角色
CREATE ROLE role_name WITH
    LOGIN
    PASSWORD 'password'
    CREATEDB
    CREATEROLE
    INHERIT
    REPLICATION
    CONNECTION LIMIT 10;

3. 修改角色

sql
-- 修改角色密码
ALTER ROLE role_name WITH PASSWORD 'new_password';

-- 修改角色属性
ALTER ROLE role_name WITH CREATEDB NOINHERIT;

-- 重命名角色
ALTER ROLE old_role_name RENAME TO new_role_name;

4. 删除角色

sql
-- 删除角色
DROP ROLE role_name;

-- 强制删除角色(级联删除依赖对象)
DROP ROLE IF EXISTS role_name CASCADE;

权限授予与回收

1. 授予权限

sql
-- 授予对象权限
GRANT SELECT, INSERT, UPDATE ON table_name TO role_name;

-- 授予所有对象权限
GRANT ALL PRIVILEGES ON table_name TO role_name;

-- 授予模式权限
GRANT USAGE, CREATE ON SCHEMA schema_name TO role_name;

-- 授予数据库权限
GRANT CONNECT, CREATE, TEMPORARY ON DATABASE db_name TO role_name;

-- 授予角色给用户
GRANT role_name TO user_name;

2. 回收权限

sql
-- 回收对象权限
REVOKE INSERT, UPDATE ON table_name FROM role_name;

-- 回收所有对象权限
REVOKE ALL PRIVILEGES ON table_name FROM role_name;

-- 回收角色
REVOKE role_name FROM user_name;

3. 权限传递

sql
-- 授予权限并允许传递
GRANT SELECT ON table_name TO role_name WITH GRANT OPTION;

-- 回收带有传递选项的权限
REVOKE SELECT ON table_name FROM role_name CASCADE;

权限管理最佳实践

1. 最小权限原则

  • 只授予用户完成工作所需的最小权限
  • 避免授予不必要的高级权限(如 SYSADMIN、CREATEDB 等)
  • 定期审查和回收不再需要的权限

2. 角色分层设计

  • 设计分层的角色体系:
    • 功能角色:基于工作职责定义,如开发人员、测试人员、管理员等
    • 数据角色:基于数据访问需求定义,如只读角色、读写角色等
    • 管理层角色:基于管理职责定义,如数据库管理员、安全管理员等

3. 定期权限审查

  • 定期审查用户和角色的权限配置
  • 检查是否存在权限泄露或过度授权情况
  • 记录权限变更历史,便于审计和追溯

4. 使用默认权限

sql
-- 设置表的默认权限
ALTER DEFAULT PRIVILEGES FOR ROLE role_name
    IN SCHEMA schema_name
    GRANT SELECT ON TABLES TO read_role;

-- 设置序列的默认权限
ALTER DEFAULT PRIVILEGES FOR ROLE role_name
    IN SCHEMA schema_name
    GRANT USAGE ON SEQUENCES TO write_role;

5. 权限继承控制

  • 使用 INHERIT 属性控制角色权限是否自动继承
  • 对于敏感权限,建议使用 NOINHERIT,需要显式激活角色
sql
-- 创建非继承角色
CREATE ROLE sensitive_role WITH NOINHERIT;

-- 激活角色
SET ROLE sensitive_role;

系统预定义角色

GaussDB 提供了一些预定义的系统角色,用于简化权限管理:

1. SYSADMIN

  • 系统管理员角色,拥有最高权限
  • 可以执行所有数据库操作
  • 相当于 PostgreSQL 中的超级用户

2. MONADMIN

  • 监控管理员角色
  • 可以查看各种系统视图和监控信息
  • 不能修改数据库对象

3. AUDITADMIN

  • 审计管理员角色
  • 可以配置和管理审计功能
  • 可以查看审计日志

4. CREATEDB

  • 可以创建数据库的角色
  • 不能修改其他数据库

5. CREATEROLE

  • 可以创建角色的角色
  • 不能修改其他角色的权限

权限管理命令

1. 查看角色

sql
-- 查看所有角色
\du

-- 查看角色详细信息
\du+ role_name

-- 查看角色权限
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'role_name';

2. 查看权限

sql
-- 查看表权限
\z table_name

-- 查看表权限详细信息
SELECT * FROM information_schema.table_privileges WHERE table_name = 'table_name';

-- 查看数据库权限
SELECT * FROM pg_database WHERE datname = 'db_name';

3. 查看当前角色

sql
-- 查看当前会话角色
SELECT current_role;

-- 查看当前用户
SELECT current_user;

-- 查看有效的角色列表
SELECT * FROM session_roles;

权限管理案例

案例 1:创建开发人员角色

sql
-- 创建开发人员角色
CREATE ROLE developer NOLOGIN;

-- 授予开发人员所需的权限
GRANT CONNECT ON DATABASE mydb TO developer;
GRANT USAGE, CREATE ON SCHEMA public TO developer;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO developer;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO developer;

-- 设置默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO developer;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT USAGE ON SEQUENCES TO developer;

-- 创建开发人员用户并授予角色
CREATE ROLE dev_user WITH LOGIN PASSWORD 'password';
GRANT developer TO dev_user;

案例 2:创建只读角色

sql
-- 创建只读角色
CREATE ROLE read_only NOLOGIN;

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

-- 设置默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO read_only;

-- 创建只读用户并授予角色
CREATE ROLE readonly_user WITH LOGIN PASSWORD 'password';
GRANT read_only TO readonly_user;

案例 3:创建管理员角色

sql
-- 创建管理员角色
CREATE ROLE db_admin NOLOGIN;

-- 授予管理员权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO db_admin;
GRANT ALL PRIVILEGES ON SCHEMA public TO db_admin;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO db_admin;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO db_admin;

-- 设置默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT ALL PRIVILEGES ON TABLES TO db_admin;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT ALL PRIVILEGES ON SEQUENCES TO db_admin;

-- 创建管理员用户并授予角色
CREATE ROLE admin_user WITH LOGIN PASSWORD 'password';
GRANT db_admin TO admin_user;

权限审计

1. 启用审计日志

sql
-- 启用审计日志
ALTER SYSTEM SET audit_enabled = on;

-- 配置审计级别
ALTER SYSTEM SET audit_level = 3;

-- 配置审计日志格式
ALTER SYSTEM SET audit_format = 'csv';

2. 审计权限变更

GaussDB 审计日志会记录所有权限变更操作,包括:

  • 角色创建、修改和删除
  • 权限授予和回收
  • 用户登录和注销

3. 查看审计日志

bash
-- 查看审计日志
cat /path/to/audit/directory/audit.csv

-- 使用 gs_logtool 分析审计日志
gs_logtool -p /path/to/audit/directory -l audit.csv

权限管理常见问题

1. 权限冲突

当用户被授予多个角色,且这些角色对同一对象拥有不同权限时,可能会发生权限冲突。GaussDB 会采用权限叠加原则,即用户拥有所有授予角色的权限的总和。

2. 权限继承

默认情况下,角色的权限会自动继承给用户。如果需要更严格的控制,可以使用 NOINHERIT 属性创建角色,用户需要显式激活角色才能使用其权限。

3. 权限回收

回收权限时需要注意:

  • 回收带有 WITH GRANT OPTION 的权限时,需要使用 CASCADE 选项
  • 回收角色时,会同时回收该角色授予的所有权限
  • 回收权限不会影响已经开始的事务

常见问题(FAQ)

Q1: 如何查看 GaussDB 中某个用户的所有权限?

A1: 可以通过以下方式查看用户的所有权限:

sql
-- 查看用户直接拥有的权限
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'user_name';

-- 查看用户通过角色继承的权限
SELECT * FROM information_schema.role_table_grants WHERE grantee IN (
    SELECT role_name FROM information_schema.applicable_roles WHERE grantee = 'user_name'
);

-- 查看用户的有效权限
SELECT * FROM session_roles;

Q2: 如何在 GaussDB 中实现行级权限控制?

A2: GaussDB 可以通过以下方式实现行级权限控制:

  1. 视图:创建视图过滤数据,只显示用户有权访问的行
  2. 行级安全策略(RLS):使用 CREATE POLICY 命令定义行级安全策略
  3. 存储过程:通过存储过程控制数据访问,用户只能通过存储过程访问数据

例如,使用行级安全策略:

sql
-- 启用行级安全
ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;

-- 创建行级安全策略
CREATE POLICY policy_name ON table_name
    FOR SELECT
    USING (column_name = current_user);

Q3: 如何撤销 GaussDB 中所有用户的某个权限?

A3: 可以使用以下命令撤销所有用户的某个权限:

sql
-- 撤销所有用户对表的插入权限
REVOKE INSERT ON table_name FROM PUBLIC;

-- 撤销所有用户的创建数据库权限
REVOKE CREATEDB FROM PUBLIC;

Q4: 如何在 GaussDB 中创建一个只能访问特定表的用户?

A4: 可以按照以下步骤创建只能访问特定表的用户:

  1. 创建用户
  2. 授予用户连接数据库的权限
  3. 授予用户使用模式的权限
  4. 只授予用户访问特定表的权限
sql
-- 创建用户
CREATE ROLE restricted_user WITH LOGIN PASSWORD 'password';

-- 授予连接数据库权限
GRANT CONNECT ON DATABASE mydb TO restricted_user;

-- 授予使用模式权限
GRANT USAGE ON SCHEMA public TO restricted_user;

-- 只授予访问特定表的权限
GRANT SELECT, INSERT, UPDATE, DELETE ON public.specific_table TO restricted_user;

Q5: 如何备份和恢复 GaussDB 的权限配置?

A5: 可以使用以下方式备份和恢复 GaussDB 的权限配置:

  1. 备份权限配置

    • 使用 pg_dump 命令备份数据库的角色和权限
    • 使用 pg_dumpall --roles-only 命令备份所有角色
  2. 恢复权限配置

    • 使用 psql 命令恢复备份的角色和权限
    • 使用 pg_restore 命令恢复数据库备份
bash
-- 备份所有角色
pg_dumpall --roles-only -f roles_backup.sql

-- 恢复角色
psql -f roles_backup.sql