温馨提示×

Debian PostgreSQL数据库安全加固

小樊
58
2025-09-19 18:55:32
栏目: 云计算

1. 系统与软件更新
保持Debian系统和PostgreSQL软件包为最新版本,及时修复已知安全漏洞。定期执行以下命令:

sudo apt update && sudo apt upgrade

2. 安装PostgreSQL及初始配置
通过Debian官方仓库安装PostgreSQL及其附加组件(如postgresql-contrib提供额外工具):

sudo apt install postgresql postgresql-contrib

安装后,默认超级用户postgres无密码,需立即设置强密码:

sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'StrongPassword123!'"

3. 配置PostgreSQL核心参数
修改postgresql.conf(路径:/etc/postgresql/<version>/main/postgresql.conf),优化基础安全设置:

  • 限制监听地址:将listen_addresses'*'(允许所有IP)改为'localhost'(仅本地访问)或特定IP段(如'192.168.1.0/24'),减少远程暴露风险;
  • 调整端口:可修改port(默认5432)为非标准端口(如5433),增加攻击探测难度;
  • 控制最大连接数:设置max_connections(如100),防止资源耗尽攻击。
    修改后需重启服务生效:
sudo systemctl restart postgresql

4. 强化客户端访问控制
编辑pg_hba.conf(路径:/etc/postgresql/<version>/main/pg_hba.conf),配置细粒度的客户端认证规则:

  • 优先允许本地连接:使用peer认证(操作系统用户与数据库用户同名),提升本地访问安全性;
  • 限制远程连接:仅允许可信IP段通过md5密码认证访问特定数据库,示例如下:
    # 本地连接(操作系统用户=数据库用户)
    local   all             postgres                                peer
    local   all             all                                     peer
    
    # 可信IP段(如公司内网)远程访问
    host    all             all             192.168.1.0/24          md5
    
    # 拒绝其他所有远程连接
    host    all             all             0.0.0.0/0               reject
    

修改后重启服务:

sudo systemctl restart postgresql

5. 启用SSL/TLS加密传输
为防止数据在传输过程中被窃取或篡改,需配置SSL加密:

  • 生成证书与密钥:创建目录存放证书,使用OpenSSL生成自签名证书(有效期365天):
    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  # 密钥文件必须为root-only权限
    
  • 配置PostgreSQL使用SSL:修改postgresql.conf,添加以下参数:
    ssl on
    ssl_cert_file '/etc/postgresql/ssl/server.crt'
    ssl_key_file '/etc/postgresql/ssl/server.key'
    

重启服务使配置生效:

sudo systemctl restart postgresql

6. 用户与权限精细化管理

  • 创建专用用户:避免使用postgres超级用户执行日常操作,创建具有最小必要权限的用户:
    sudo -u postgres psql -c "CREATE USER app_user WITH PASSWORD 'AppPassword456!'"
    
  • 分配数据库权限:仅为用户分配所需数据库的权限(如SELECTINSERT),避免过度授权:
    sudo -u postgres psql -c "CREATE DATABASE app_db OWNER app_user"
    sudo -u postgres psql -c "GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO app_user"
    
  • 撤销不必要的权限:定期审查用户权限,移除冗余权限:
    sudo -u postgres psql -c "REVOKE DELETE, UPDATE ON app_table FROM app_user"
    

7. 数据加密(敏感字段)
使用pgcrypto扩展对数据库中的敏感数据(如身份证号、手机号)进行加密存储:

  • 启用扩展:在目标数据库中执行:
    sudo -u postgres psql -d app_db -c "CREATE EXTENSION IF NOT EXISTS pgcrypto"
    
  • 加密数据:插入或更新数据时使用加密函数(如pgp_sym_encrypt):
    INSERT INTO users (name, phone) VALUES ('张三', pgp_sym_encrypt('13800138000', 'aes_key'));
    
  • 解密数据:查询时使用pgp_sym_decrypt函数:
    SELECT name, pgp_sym_decrypt(phone, 'aes_key') AS phone FROM users;
    

8. 审计与日志监控
启用PostgreSQL日志功能,记录关键操作(如登录、SQL执行),便于事后追溯:

  • 修改postgresql.conf:添加以下参数:
    log_statement = 'all'  # 记录所有SQL语句(生产环境可调整为'dml'或'ddl',减少日志量)
    log_connections = true  # 记录连接尝试
    log_disconnections = true  # 记录断开连接
    log_directory = 'pg_log'  # 日志目录(默认已开启)
    log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'  # 日志文件名格式(按日期和时间分割)
    
  • 定期检查日志:使用tail命令实时查看日志,或通过logrotate工具定期归档日志(避免日志文件过大):
    sudo tail -f /var/log/postgresql/postgresql-<version>-main.log
    

9. 防火墙配置
使用UFW(Uncomplicated Firewall)限制PostgreSQL端口的访问,仅允许可信IP地址访问:

sudo ufw allow from 192.168.1.0/24 to any port 5432/tcp  # 允许内网IP访问
sudo ufw enable  # 启用防火墙
sudo ufw status  # 查看防火墙规则

10. 定期备份与恢复测试
制定备份策略,使用pg_dump工具定期备份数据库,并将备份文件存储在安全位置(如异地服务器、云存储):

  • 全量备份
    sudo -u postgres pg_dump -U postgres -F c -b -v -f /backup/app_db_backup.dump app_db
    
  • 恢复测试:定期验证备份文件的可用性,确保灾难发生时可快速恢复:
    sudo -u postgres psql -U postgres -d app_db -f /backup/app_db_backup.dump
    

0