1. 更新系统
在安装PostgreSQL前,确保Debian系统及所有软件包为最新版本,修复已知安全漏洞:
sudo apt update && sudo apt upgrade -y 2. 安装PostgreSQL及附加组件
通过APT包管理器安装PostgreSQL服务器及常用扩展(如postgresql-contrib提供额外工具):
sudo apt install postgresql postgresql-contrib -y 3. 强化PostgreSQL初始用户安全
默认的postgres超级用户无初始密码,需立即设置强密码(包含大小写字母、数字及特殊字符):
sudo -u postgres psql ALTER USER postgres WITH PASSWORD 'YourStrongPassword123!'; \q 4. 配置PostgreSQL核心参数
编辑主配置文件(路径随PostgreSQL版本变化,如/etc/postgresql/15/main/postgresql.conf),调整以下关键参数:
listen_addresses从'*'(允许所有IP)改为'localhost'(仅本地连接)或特定IP(如'192.168.1.100'),减少远程暴露风险;port从5432改为非标准端口(如5433),降低被自动化工具扫描的概率;max_connections为合理值(如100),避免资源耗尽攻击;shared_buffers(通常为物理内存的25%,如64MB)、effective_cache_size(物理内存的50%-75%,如2GB)。sudo systemctl restart postgresql 5. 细化客户端访问控制
编辑pg_hba.conf文件(路径同postgresql.conf),采用“最小权限原则”配置认证规则:
host all all 0.0.0.0/0 md5(允许所有IP远程连接);host all all 127.0.0.1/32 md5(本地连接需密码);192.168.1.0/24),并使用更安全的认证方式(如scram-sha-256替代md5):host all all 192.168.1.0/24 scram-sha-256 修改后重启服务:
sudo systemctl restart postgresql 6. 启用SSL/TLS加密连接
为防止数据传输被窃听,需配置SSL加密:
sudo mkdir -p /etc/postgresql/ssl sudo openssl req -new -x509 -days 365 -nodes -text -subj "/CN=postgres" -out /etc/postgresql/ssl/server.crt -keyout /etc/postgresql/ssl/server.key sudo chmod 600 /etc/postgresql/ssl/server.key # 私钥必须严格保密 postgresql.conf,添加以下参数:ssl on ssl_cert_file '/etc/postgresql/ssl/server.crt' ssl_key_file '/etc/postgresql/ssl/server.key' pg_hba.conf中添加sslmode=require,如:hostssl all all 192.168.1.0/24 scram-sha-256 sslmode=require 重启服务使配置生效:
sudo systemctl restart postgresql 7. 用户与权限精细化管理
postgres超级用户执行常规操作,创建角色并设置密码:sudo -u postgres psql CREATE ROLE myapp_user WITH LOGIN PASSWORD 'AppSecurePassword456!' VALID UNTIL '2026-12-31'; SELECT、INSERT),避免过度授权:CREATE DATABASE myapp_db OWNER myapp_user; GRANT CONNECT ON DATABASE myapp_db TO myapp_user; GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO myapp_user; \du # 查看用户列表 DROP USER inactive_user; # 删除闲置用户 8. 启用审计日志与监控
postgresql.conf,启用连接、断开及SQL语句日志:log_connections = true log_disconnections = true log_statement = 'all' # 记录所有SQL语句(生产环境可调整为'dml'或'ddl'减少日志量) log_directory = 'pg_log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' tail命令实时查看日志,或使用logrotate工具归档旧日志(避免日志文件过大):sudo tail -f /var/log/postgresql/postgresql-15-main.log 9. 防火墙配置
若使用UFW防火墙,仅允许可信IP访问PostgreSQL端口(如5432或自定义端口):
sudo ufw allow from 192.168.1.0/24 to any port 5432/tcp # 仅允许192.168.1.0/24网段访问 sudo ufw enable # 启用防火墙 10. 定期备份与安全更新
pg_dump工具备份数据库(如每天凌晨2点),并将备份文件存储在安全位置(如异地服务器或云存储):sudo -u postgres pg_dump -U myapp_user -F t -f /backups/myapp_db_backup.tar myapp_db sudo apt update && sudo apt upgrade postgresql postgresql-contrib -y