加密通信

SSL/TLS 加密、本地 CA、证书管理详解。

Pigsty 默认启用 SSL 加密,保护客户端与服务器之间的通信安全。同时提供本地 CA 基础设施,用于签发和管理证书。


SSL/TLS 概述

默认配置

组件 SSL 状态 说明
PostgreSQL 启用 客户端可选择使用 SSL
Patroni REST API 禁用 可配置启用
Pgbouncer 禁用 可配置启用
Nginx (Web UI) 启用 HTTPS 访问

启用 SSL 后的效果

  • 客户端与服务器之间的数据传输被加密
  • 可验证服务器身份,防止中间人攻击
  • 可选择验证客户端身份(证书认证)

本地 CA

Pigsty 在初始化时自动生成自签名 CA,用于签发各组件的证书。

CA 文件位置

files/pki/
├── ca/
│   ├── ca.crt     # CA 根证书(公钥)
│   └── ca.key     # CA 私钥(重要!)
├── csr/           # 证书签名请求
├── pgsql/         # PostgreSQL 集群证书
├── etcd/          # ETCD 集群证书
├── infra/         # 基础设施节点证书
└── minio/         # MinIO 证书

证书分发

CA 证书会自动分发到所有节点:

  • Linux 系统信任路径:/etc/pki/ca.crt
  • PostgreSQL 使用路径:/pg/cert/ca.crt

使用现有 CA

如果您已有 CA,可以使用现有证书:

# 将您的 CA 文件放入指定目录
cp your-ca.crt files/pki/ca/ca.crt
cp your-ca.key files/pki/ca/ca.key

# 设置参数防止覆盖
# pigsty.yml
ca_method: copy

PostgreSQL SSL

服务器证书

每个 PostgreSQL 集群使用独立的证书:

/pg/cert/
├── ca.crt         # CA 根证书
├── server.crt     # 服务器证书
└── server.key     # 服务器私钥

配置参数

PostgreSQL 的 SSL 配置在 Patroni 模板中:

ssl: 'on'
ssl_cert_file: '/pg/cert/server.crt'
ssl_key_file: '/pg/cert/server.key'
ssl_ca_file: '/pg/cert/ca.crt'

客户端连接

# 使用 SSL 连接
psql "host=pg-test port=5432 dbname=test sslmode=require"

# 验证服务器证书
psql "host=pg-test port=5432 dbname=test sslmode=verify-full sslrootcert=ca.crt"

sslmode 选项

模式 加密 验证服务器 说明
disable 禁用 SSL
allow 可选 服务器要求时使用
prefer 优先 优先使用 SSL(默认)
require 强制 SSL,不验证证书
verify-ca CA 验证 CA 签发
verify-full CA + 主机名 完全验证

Patroni SSL

启用 Patroni REST API 的 SSL 加密:

patroni_ssl_enabled: true

启用后:

  • REST API 使用 HTTPS
  • 健康检查使用加密通信
  • vip-manager 与 Patroni 通信加密

Pgbouncer SSL

客户端到 Pgbouncer

pgbouncer_sslmode: require

可选值:

模式 说明
disable 禁用 SSL
allow 客户端选择
prefer 优先 SSL
require 强制 SSL
verify-ca 验证 CA
verify-full 完全验证

Pgbouncer 到 PostgreSQL

Pgbouncer 默认通过本地 Unix Socket 连接 PostgreSQL,不需要 SSL。


证书管理

查看证书信息

# 查看 CA 证书
openssl x509 -text -noout -in /etc/pki/ca.crt

# 查看服务器证书
openssl x509 -text -noout -in /pg/cert/server.crt

证书有效期

证书类型 默认有效期
CA 根证书 100 年
服务器证书 20 年

可通过参数调整:

cert_validity: 3650d  # 证书有效期(10年)

签发客户端证书

用于客户端证书认证:

# 签发证书,CN 设为用户名
./cert.yml -e cn=dbuser_app

证书生成在 files/pki/misc/dbuser_app.{crt,key}

证书更新

证书即将过期时,重新运行安装剧本会自动更新:

# 更新 PostgreSQL 集群证书
./pgsql.yml -t pg_cert

# 重启 PostgreSQL 加载新证书
pg_ctl reload -D /pg/data

信任 CA

服务器端

CA 证书自动安装到系统信任目录。

客户端

ca.crt 复制到客户端,并在连接时指定:

# Linux/macOS
psql "... sslrootcert=/path/to/ca.crt"

# 或设置环境变量
export PGSSLROOTCERT=/path/to/ca.crt

浏览器

双击 ca.crt 导入系统钥匙串,并设置为"信任"。


安全建议

  1. 保护 CA 私钥ca.key 是最重要的安全资产,应加密备份

  2. 使用 verify-full:生产环境客户端应使用 sslmode=verify-full

  3. 定期轮换:虽然证书有效期很长,但建议定期轮换

  4. 监控证书过期:配置告警监控证书即将过期

  5. 强制 SSL:敏感环境通过 HBA 规则强制 SSL:

    pg_hba_rules:
      - {user: all, db: all, addr: world, auth: ssl}