1. 系统与软件基础安全
yum update postgresql-server(CentOS)或对应包管理器更新PostgreSQL至最新版本,及时修复已知安全漏洞。postgresql-server、postgresql-contrib),避免不必要的功能暴露攻击面。2. 配置文件安全优化
postgresql.conf中的listen_addresses为localhost(仅本地访问)或特定可信IP段(如192.168.1.0/24),避免数据库监听所有网络接口。pg_hba.conf(客户端认证配置文件),将远程访问认证方式设为md5(密码加密)或scram-sha-256(更安全的加密方式),禁止trust(无密码验证);示例配置:host all all 192.168.1.0/24 md5(仅允许192.168.1.0/24网段用户通过密码认证访问)。postgresql.conf中关闭pg_hba.conf中未使用的认证方法(如ident、peer),减少潜在攻击入口。3. 用户与权限精细化管理
SUPERUSER(超级用户)权限;示例:创建普通用户并授权特定数据库:CREATE USER app_user WITH PASSWORD 'StrongPass123!';
GRANT CONNECT ON DATABASE app_db TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app_user;
passwordcheck.so模块强制密码复杂度(至少8位,包含大小写字母、数字和特殊字符);修改postgresql.conf:shared_preload_libraries = 'passwordcheck',重启服务生效;创建用户时验证:CREATE USER weak_user WITH PASSWORD '123'会提示“password too weak”。ALTER USER app_user VALID UNTIL '2025-12-31';,到期后用户需修改密码才能登录。pg_stat_statements扩展跟踪SQL语句,识别异常操作;修改postgresql.conf:shared_preload_libraries = 'pg_stat_statements',重启后执行CREATE EXTENSION pg_stat_statements;,通过SELECT * FROM pg_stat_statements;查看高频/异常SQL。4. 网络与连接安全加固
firewalld(CentOS 7+)开放PostgreSQL默认端口(5432),并限制访问源;示例:sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="5432" accept'
sudo firewall-cmd --reload
server.crt、server.key),修改postgresql.conf启用SSL:ssl = on; ssl_cert_file = '/path/to/server.crt'; ssl_key_file = '/path/to/server.key';客户端连接时需指定sslmode=require(如psql "sslmode=require dbname=app_db user=app_user host=192.168.1.100"),确保数据传输加密。postgresql.conf中设置max_connections(如100),避免过多连接导致资源耗尽;结合pgbouncer等连接池工具,进一步优化连接管理。5. 数据安全保护
pg_basebackup(物理备份)或pg_dump(逻辑备份)定期备份数据库,存储到安全位置(如异地服务器、云存储);示例:pg_dump -U app_user -F t -f app_db_backup.tar app_db(逻辑备份为tar格式)。pgcrypto扩展加密;示例:CREATE EXTENSION pgcrypto;
INSERT INTO users (name, phone) VALUES ('张三', pgp_sym_encrypt('13800138000', 'aes_key'));
SELECT pgp_sym_decrypt(phone, 'aes_key') FROM users WHERE name = '张三';
pg_restore -U app_user -d test_db app_db_backup.tar。6. 监控与审计机制
postgresql.conf开启日志记录,记录用户登录、SQL操作等关键事件;示例:logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all' # 记录所有SQL语句(生产环境可调整为'ddl'或'modify')
log_connections = on
log_disconnections = on
Prometheus+Grafana监控PostgreSQL性能指标(如连接数、查询响应时间、磁盘空间),设置阈值告警(如连接数超过80%时发送邮件通知);或使用Zabbix等工具实现自动化监控。grep、ausearch等工具分析日志,检测异常行为(如频繁的登录失败、未授权的表删除);示例:grep "authentication failed" /var/lib/pgsql/12/data/pg_log/*.log查找登录失败记录。7. SELinux与操作系统加固(可选但推荐)
getenforce返回Enforcing),需允许PostgreSQL访问相关资源;示例:setsebool -P postgres_can_rsync on(允许rsync备份),chcon -R -t postgresql_db_t /var/lib/pgsql/12/data(设置数据目录的安全上下文)。/etc/ssh/sshd_config:PermitRootLogin no),使用强密码或密钥认证;定期更新操作系统补丁,关闭不必要的服务(如FTP、Telnet)。