1. 系统更新
在安装PostgreSQL前,确保Debian系统及所有软件包为最新版本,修复已知安全漏洞:
sudo apt update && sudo apt upgrade -y
2. PostgreSQL基础安装与初始配置
安装PostgreSQL服务器及附加组件(如postgresql-contrib提供额外工具):
sudo apt install postgresql postgresql-contrib -y
默认安装后,postgres用户无密码,需通过以下命令设置强密码:
sudo -u postgres psql -c "\password postgres"
创建专用数据库用户(避免使用postgres超级用户执行常规操作)并授权数据库:
sudo -u postgres psql
CREATE USER myuser WITH PASSWORD 'StrongPassword123!';
CREATE DATABASE mydb OWNER myuser;
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
\q
3. 配置文件安全调整
修改postgresql.conf(路径:/etc/postgresql/<version>/main/postgresql.conf)优化连接设置:
listen_addresses从'*'(允许所有IP)改为'localhost'(仅本地连接)或特定IP,减少远程暴露风险;port从5432改为非标准端口(如5433),降低被自动扫描的概率;max_connections(如100),避免资源耗尽攻击。修改pg_hba.conf(路径:/etc/postgresql/<version>/main/pg_hba.conf)严格限制客户端认证:
# 允许本地连接(MD5密码验证)
host all all 127.0.0.1/32 md5
# 允许特定远程IP连接(MD5密码验证)
host all all 203.0.113.10/32 md5
# 拒绝其他所有远程连接
host all all 0.0.0.0/0 reject
修改后重启服务使配置生效:
sudo systemctl restart postgresql
4. 启用SSL/TLS加密
为数据传输加密,防止中间人攻击:
mkdir -p /etc/postgresql/ssl
openssl req -new -x509 -days 365 -nodes -text -subj "/CN=postgres" -out /etc/postgresql/ssl/server.crt -keyout /etc/postgresql/ssl/server.key
chmod 600 /etc/postgresql/ssl/server.key # 私钥必须严格保密
postgresql.conf启用SSL:ssl = on
ssl_cert_file = '/etc/postgresql/ssl/server.crt'
ssl_key_file = '/etc/postgresql/ssl/server.key'
重启服务应用SSL配置:
sudo systemctl restart postgresql
5. 用户与权限管理
read_only、read_write),分别授予对应权限,示例:CREATE ROLE read_only WITH LOGIN PASSWORD 'ReadOnlyPass';
GRANT CONNECT ON DATABASE mydb TO read_only;
GRANT USAGE ON SCHEMA public TO read_only;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only;
SELECT * FROM pg_user WHERE usename = 'myuser';
REVOKE ALL PRIVILEGES ON DATABASE mydb FROM inactive_user;
6. 防火墙配置
使用UFW(Uncomplicated Firewall)限制PostgreSQL端口(默认5432)的访问,仅允许可信IP:
sudo ufw allow from 203.0.113.10 to any port 5432/tcp # 替换为实际可信IP
sudo ufw enable # 启用防火墙
7. 审计与监控
postgresql.conf记录连接、查询等操作,便于溯源:log_statement = 'all' # 记录所有SQL语句(生产环境可设为'dml'或'none'减少负载)
log_connections = true
log_disconnections = true
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
sudo tail -f /var/log/postgresql/postgresql-<version>-main.log
8. 数据加密(可选增强)
对敏感数据(如身份证号、密码)进行加密存储,使用pgcrypto扩展:
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- 插入加密数据(使用AES算法)
INSERT INTO users (username, password) VALUES ('john', pgp_sym_encrypt('MySecretPass', 'encryption_key'));
-- 查询时解密
SELECT username, pgp_sym_decrypt(password, 'encryption_key') AS password FROM users;
9. 定期备份
使用pg_dump工具备份数据库,建议每日增量备份+每周全量备份,存储到安全位置(如异地服务器):
sudo -u postgres pg_dump -U myuser -F t -f /backups/mydb_backup_$(date +%F).tar mydb