1. 遵循最小权限原则
这是PostgreSQL权限管理的核心准则,应仅授予用户完成其任务所需的最低权限(如仅需读取数据的用户,不授予INSERT、UPDATE、DELETE权限)。过度授权会增加数据库被误操作或恶意攻击的风险。
2. 区分角色与用户类型
PostgreSQL中“角色”是权限的基本单位,分为可登录角色(LOGIN属性,类似用户)和组角色(无LOGIN属性,用于权限集合)。合理划分角色(如创建readonly、readwrite等组角色)能简化权限管理,避免重复分配。
3. 严格控制数据库连接权限
通过pg_hba.conf文件(位于/etc/postgresql/<version>/main/)配置客户端连接规则:
listen_addresses(如仅允许本地localhost或特定IP段),避免暴露数据库到公网;md5(密码认证)或cert(SSL证书认证),禁用trust(无密码认证);hostssl all all 192.168.1.0/24 cert(仅允许192.168.1.0/24网段的SSL加密连接)。4. 细化权限到对象级别
权限应从数据库→模式→表→列→序列逐层细化:
GRANT CONNECT ON DATABASE dbname TO role;(允许连接数据库);GRANT USAGE ON SCHEMA public TO role;(允许访问模式中的对象);GRANT SELECT, INSERT ON TABLE tablename TO role;(允许读取和插入数据);GRANT SELECT (col1, col2) ON TABLE tablename TO role;(仅允许读取特定列);GRANT USAGE, SELECT ON SEQUENCE seqname TO role;(允许使用序列的值)。5. 定期审计权限分配
定期检查权限状态,确保无冗余或过度授权:
\du命令查看所有角色及其权限;SELECT * FROM information_schema.table_privileges WHERE grantee = 'rolename';查询特定角色的表级权限;REVOKE命令)。6. 使用SSL加密连接
为防止数据在传输过程中被窃取或篡改,需配置PostgreSQL使用SSL:
server.crt、server.key);postgresql.conf,设置ssl = on,并指定证书路径;7. 保护超级用户权限
默认超级用户postgres拥有最高权限,需严格管理:
postgres用户操作数据库,仅为必要任务(如备份、恢复)使用;postgres用户的远程访问(如在pg_hba.conf中仅允许本地连接)。8. 启用日志与监控
开启PostgreSQL日志记录,便于追踪权限相关的异常活动:
postgresql.conf,设置log_statement = 'all'(记录所有SQL语句)、log_connections = true(记录连接事件)、log_disconnections = true(记录断开事件);