PostgreSQL通过**角色(Roles)**实现权限管理,角色可视为用户的容器,支持权限继承。在Debian系统中,需先切换至postgres用户(PostgreSQL默认超级用户)再操作:
CREATE ROLE创建角色(可指定登录权限、密码等),CREATE USER是CREATE ROLE WITH LOGIN的别名(专门用于创建可登录用户)。CREATE ROLE readonly_role WITH LOGIN PASSWORD 'SecurePass123' NOSUPERUSER NOCREATEDB;
CREATE USER app_user WITH PASSWORD 'AppPass456' NOSUPERUSER NOCREATEDB;
DROP ROLE删除角色及其所有权限(需确保无对象依赖)。DROP ROLE IF EXISTS readonly_role;
权限需按数据库对象层级(数据库、模式、表、序列等)分配,遵循最小权限原则:
GRANT CONNECT ON DATABASE mydb TO app_user; -- 允许连接数据库
GRANT ALL PRIVILEGES ON DATABASE mydb TO admin_user; -- 授予数据库所有权限
GRANT USAGE ON SCHEMA public TO readonly_role; -- 允许使用public模式
GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO readonly_role; -- 只读权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user; -- 读写权限
GRANT SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA public TO app_user; -- 允许读取和更新序列
通过ALTER DEFAULT PRIVILEGES设置未来创建对象的默认权限,避免重复配置:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_role; -- 未来创建的表默认授予readonly_role只读权限
ALTER USER修改用户密码(需定期更换)。ALTER USER app_user WITH PASSWORD 'NewSecurePass789';
REVOKE撤销已授予的权限。REVOKE INSERT ON ALL TABLES IN SCHEMA public FROM app_user; -- 撤销app_user的插入权限
GRANT readonly_role TO app_user; -- app_user继承readonly_role的权限
\du命令(psql终端)。\du
information_schema.table_privileges视图。SELECT table_catalog, table_schema, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'app_user';
通过修改PostgreSQL配置文件postgresql.conf开启日志记录,监控连接、查询等活动:
# 编辑配置文件(版本号需替换为实际安装版本,如14)
sudo nano /etc/postgresql/14/main/postgresql.conf
调整以下参数:
# 记录所有SQL语句(生产环境建议按需设置,如只记录SELECT、UPDATE等)
log_statement = 'all'
# 记录客户端连接和断开事件
log_connections = true
log_disconnections = true
# 记录日志到文件(路径需可写)
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
修改后重启PostgreSQL服务使配置生效:
sudo systemctl restart postgresql
pgaudit是PostgreSQL的官方审计扩展,支持细粒度审计(如按用户、表、操作类型过滤),满足合规要求(如GDPR、HIPAA)。
sudo apt install postgresql-contrib-14 # 替换为实际版本
postgresql.conf中添加以下配置:shared_preload_libraries = 'pgaudit' # 必须设置为shared_preload_libraries
pgaudit.log = 'all' # 记录所有审计事件(可细化为read, write, ddl等)
pgaudit.log_relation = on # 记录表名
pgaudit.log_user = on # 记录执行操作的用户
sudo systemctl restart postgresql
/var/log/postgresql/pg_log/),日志会包含审计详情(如执行时间、用户、SQL语句、影响的表)。使用logrotate工具自动归档和清理旧日志,避免日志文件占用过多磁盘空间:
sudo nano /etc/logrotate.d/postgresql
/var/log/postgresql/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 postgres adm
sharedscripts
postrotate
systemctl reload postgresql > /dev/null
endscript
}
sudo logrotate -vf /etc/logrotate.d/postgresql
cp postgresql.conf postgresql.conf.bak)。postgresql.conf中的ssl = on,配置证书路径),保护数据传输安全(参考之前的安全设置指南)。