加密通信
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 导入系统钥匙串,并设置为"信任"。
安全建议
-
保护 CA 私钥:
ca.key是最重要的安全资产,应加密备份 -
使用 verify-full:生产环境客户端应使用
sslmode=verify-full -
定期轮换:虽然证书有效期很长,但建议定期轮换
-
监控证书过期:配置告警监控证书即将过期
-
强制 SSL:敏感环境通过 HBA 规则强制 SSL:
pg_hba_rules: - {user: all, db: all, addr: world, auth: ssl}