PostgreSQL 常用权限管理
PostgreSQL权限管理以角色(Role)为核心,构建覆盖数据库连接、模式访问及表/视图/序列/函数等对象的精细化四级权限体系,通过GRANT/REVOKE精准分配操作权限(如SELECT、INSERT、EXECUTE),支持角色继承、默认权限配置(ALTER DEFAULT PRIVILEGES),并严格遵循最小权限原则、撤销public模式默认权限、定期审计等安全实践,兼顾灵活性与安全性,实现高效可控的数据库访问治理。
PostgreSQL采用基于角色的权限管理系统,通过精细化的权限控制保障数据库安全。
一、权限体系结构
PostgreSQL权限管理采用四级层次结构:
复制连接权限 → 数据库权限 → 模式权限 → 对象权限
二、角色管理
在PostgreSQL中,角色是权限的载体,可以是登录角色(用户)或组角色(权限集合):
-- 创建普通角色(无登录权限,用作组角色)
CREATE ROLE group_developer;
-- 创建登录角色(用户)并设置密码
CREATE ROLE app_user WITH LOGIN PASSWORD 'password';
-- 创建超级用户(拥有所有权限)
CREATE ROLE super_user WITH SUPERUSER;
-- 修改角色
ALTER ROLE app_user WITH PASSWORD 'new_password';
-- 删除角色
DROP ROLE app_user;
三、权限类型详解
1. 数据库级权限
- CONNECT:允许连接到数据库
- CREATE:允许在数据库中创建模式
- TEMPORARY/TEMP:允许创建临时表
- ALL PRIVILEGES:授予所有数据库权限
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT CREATE ON DATABASE mydb TO app_user;
GRANT ALL PRIVILEGES ON DATABASE mydb TO app_user;
2. 模式级权限
- USAGE:允许访问模式中的对象
- CREATE:允许在模式中创建新对象
GRANT USAGE ON SCHEMA public TO app_user;
GRANT CREATE ON SCHEMA public TO app_user;
3. 表/视图级权限
- SELECT:读取表数据
- INSERT:插入新数据
- UPDATE:更新数据(可指定列)
- DELETE:删除数据
- TRUNCATE:清空表数据
- REFERENCES:允许创建外键约束
- TRIGGER:允许创建触发器
GRANT SELECT, INSERT, UPDATE, DELETE ON table_name TO app_user;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO app_user;
4. 序列权限
- USAGE:使用序列
- SELECT:查询序列当前值
- UPDATE:推进序列
GRANT USAGE, SELECT ON SEQUENCE seq_name TO app_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO app_user;
5. 函数权限
- EXECUTE:执行函数
GRANT EXECUTE ON FUNCTION func_name TO app_user;
GRANT ALL PRIVILEGES ON ALL ROUTINES IN SCHEMA public TO app_user;
四、角色继承与权限传递
-- 将角色添加到组(继承组权限)
GRANT group_developer TO app_user;
-- 撤销角色继承
REVOKE group_developer FROM app_user;
-- 允许角色将权限授予其他角色
GRANT SELECT ON table_name TO app_user WITH GRANT OPTION;
五、默认权限设置
为新创建的对象自动设置权限:
-- 为psi_root创建的表设置默认权限
ALTER DEFAULT PRIVILEGES FOR ROLE psi_root
GRANT ALL ON TABLES TO pgrolereadwrite;
-- 为psi_root创建的序列设置默认权限
ALTER DEFAULT PRIVILEGES FOR ROLE psi_root
GRANT ALL ON SEQUENCES TO pgrolereadwrite;
-- 为psi_root创建的函数设置默认权限
ALTER DEFAULT PRIVILEGES FOR ROLE psi_root IN SCHEMA public
GRANT ALL PRIVILEGES ON ROUTINES TO pgrolereadwrite;
六、权限管理最佳实践
1. 撤销public schema默认权限(安全加固)
-- 撤销public schema的CREATE权限(PostgreSQL 14及之前版本尤为重要)
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
-- 撤销数据库的所有默认权限
REVOKE ALL ON DATABASE lab_db FROM public;
2. 实现读写分离的权限配置
-- 创建只读角色和读写角色
CREATE ROLE pgrolereadonly;
CREATE ROLE pgrolereadwrite;
-- 为读写角色授予权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO pgrolereadwrite;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO pgrolereadwrite;
-- 为只读角色授予权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO pgrolereadonly;
-- 创建用户并分配角色
CREATE USER readonly_user WITH LOGIN PASSWORD 'password';
GRANT pgrolereadonly TO readonly_user;
CREATE USER readwrite_user WITH LOGIN PASSWORD 'password';
GRANT pgrolereadwrite TO readwrite_user;
3. 最小权限原则应用(监控场景)
-- 创建专用schema存放监控函数
CREATE SCHEMA pghero;
-- 创建SECURITY DEFINER函数访问系统表
CREATE OR REPLACE FUNCTION pghero.pg_stat_activity()
RETURNS SETOF pg_stat_activity AS
$$
SELECT * FROM pg_catalog.pg_stat_activity;
$$ LANGUAGE sql VOLATILE SECURITY DEFINER;
-- 创建视图
CREATE VIEW pghero.pg_stat_activity AS
SELECT * FROM pghero.pg_stat_activity();
-- 授予监控所需最小权限
GRANT pg_read_all_settings TO monitor_user;
GRANT pg_read_all_stats TO monitor_user;
GRANT pg_monitor TO monitor_user;
七、权限查询与审计
-- 查看当前数据库中所有对象的权限
\dp
-- 查看特定角色的权限
SELECT * FROM pg_roles WHERE rolname = 'username';
-- 查看特定表的权限
SELECT grantee, privilege_type
FROM information_schema.role_table_grants
WHERE table_name = 'table_name';
-- 查看角色成员关系
\du
八、安全注意事项
- 避免使用超级用户进行日常操作:创建具有适当权限的专用角色
- 遵循最小权限原则:只授予完成任务所需的最小权限
- 定期审计权限:检查和清理不必要的权限
- 使用专用schema:不要将业务表放在public schema中
- 注意PostgreSQL版本差异:PostgreSQL 15+不再自动授予public schema的CREATE权限
通过合理配置PostgreSQL权限,可以有效保障数据库安全,同时满足不同业务场景的需求。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

