温馨提示×

Debian上PostgreSQL安全设置有哪些

小樊
50
2025-10-06 16:29:17
栏目: 云计算

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,减少远程暴露风险;
  • 修改默认端口:将port5432改为非标准端口(如5433),降低被自动扫描的概率;
  • 调整最大连接数:根据服务器资源设置max_connections(如100),避免资源耗尽攻击。

修改pg_hba.conf(路径:/etc/postgresql/<version>/main/pg_hba.conf)严格限制客户端认证:

  • 仅允许可信IP远程连接(如公司IP),示例:
    # 允许本地连接(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加密
为数据传输加密,防止中间人攻击:

  • 生成自签名证书(生产环境建议使用CA签发证书):
    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_onlyread_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

0