这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
安全合规
身份认证、访问控制、加密通信、审计日志,满足等保三级与 SOC2 合规要求。
如果您只有一分钟,请记住这张图:
flowchart TB
subgraph L1["🌐 第 1 层:网络安全"]
L1A["防火墙 + SSL/TLS 加密 + HAProxy 代理"]
L1B["谁能连进来?连接是否加密?"]
end
subgraph L2["🔑 第 2 层:身份认证"]
L2A["HBA 规则 + SCRAM-SHA-256 密码 + 证书认证"]
L2B["你是谁?怎么证明?"]
end
subgraph L3["👤 第 3 层:访问控制"]
L3A["角色系统 + 对象权限 + 数据库隔离"]
L3B["你能做什么?能访问哪些数据?"]
end
subgraph L4["🔒 第 4 层:数据安全"]
L4A["数据校验 + 备份加密 + 审计日志"]
L4B["数据完整吗?操作有记录吗?"]
end
L1 --> L2 --> L3 --> L4
核心价值:开箱即用的企业级安全配置,默认启用最佳实践,额外配置可达等保三级与 SOC 2 合规要求。
本章内容
| 章节 |
说明 |
核心问题 |
| 安全概述 |
安全能力总览与检查清单 |
整体安全架构是怎样的? |
| 身份认证 |
HBA 规则、密码策略、证书认证 |
如何验证用户身份? |
| 访问控制 |
角色系统、权限模型、数据库隔离 |
如何控制用户权限? |
| 加密通信 |
SSL/TLS、本地 CA、证书管理 |
如何保护数据传输? |
| 合规清单 |
等保三级与 SOC2 详细对照 |
如何满足合规要求? |
为什么安全很重要?
数据泄露的代价
flowchart LR
Breach["💥 数据泄露"]
subgraph Direct["💰 直接损失"]
D1["监管罚款<br/>GDPR 可达全球营收 4%"]
D2["法律诉讼费用"]
D3["客户赔偿"]
end
subgraph Indirect["📉 间接损失"]
I1["品牌声誉受损"]
I2["客户信任丧失"]
I3["业务中断"]
end
subgraph Compliance["⚠️ 合规风险"]
C1["等保三级:责任追究"]
C2["SOC 2:认证撤销"]
C3["行业准入:被禁止经营"]
end
Breach --> Direct
Breach --> Indirect
Breach --> Compliance
Pigsty 的安全理念
默认安全:开箱即用的安全配置,无需额外设置即可获得基本保护。
纵深防御:多层安全机制,即使某一层被突破,仍有其他层保护。
最小权限:用户只能访问完成工作所需的最小数据集。
默认安全配置
Pigsty 默认启用以下安全特性:
| 特性 |
默认配置 |
说明 |
| 密码加密 |
scram-sha-256 |
PostgreSQL 最安全的密码哈希算法 |
| SSL 支持 |
启用 |
客户端可选择使用 SSL 加密连接 |
| 本地 CA |
自动生成 |
自签名 CA 签发服务器证书 |
| HBA 分层 |
按来源控制 |
不同来源使用不同认证强度 |
| 角色系统 |
四层权限 |
只读/读写/管理员/离线 |
| 数据校验 |
启用 |
检测存储层数据损坏 |
| 审计日志 |
启用 |
记录连接和慢查询 |
可增强配置
通过额外配置可启用更高安全级别:
| 特性 |
配置方式 |
安全等级 |
| 密码强度检查 |
启用 passwordcheck 扩展 |
等保三级 |
| 强制 SSL |
HBA 使用 hostssl |
等保三级 |
| 客户端证书 |
HBA 使用 cert 认证 |
金融级 |
| 备份加密 |
配置 cipher_type |
合规要求 |
| 防火墙 |
配置 node_firewall_mode |
基础设施 |
默认用户与密码
Pigsty 默认创建以下系统用户:
| 用户 |
用途 |
默认密码 |
部署后操作 |
postgres |
系统超级用户 |
无密码(仅本地) |
保持无密码 |
dbuser_dba |
管理员用户 |
DBUser.DBA |
必须修改 |
dbuser_monitor |
监控用户 |
DBUser.Monitor |
必须修改 |
replicator |
复制用户 |
DBUser.Replicator |
必须修改 |
# pigsty.yml - 修改默认密码
pg_admin_password: 'YourSecurePassword123!'
pg_monitor_password: 'AnotherSecurePass456!'
pg_replication_password: 'ReplicationPass789!'
⚠️ 重要:生产环境部署后,请立即修改这些默认密码!
角色与权限系统
Pigsty 提供开箱即用的四层角色系统:
flowchart TB
subgraph Admin["🔴 dbrole_admin(管理员)"]
A1["继承 dbrole_readwrite"]
A2["可以创建/删除/修改对象 DDL"]
A3["适用于:业务管理员、需要建表的应用"]
end
subgraph RW["🟡 dbrole_readwrite(读写)"]
RW1["继承 dbrole_readonly"]
RW2["可以 INSERT/UPDATE/DELETE"]
RW3["适用于:生产业务账号"]
end
subgraph RO["🟢 dbrole_readonly(只读)"]
RO1["可以 SELECT 所有表"]
RO2["适用于:报表查询、数据分析"]
end
subgraph Offline["🔵 dbrole_offline(离线)"]
OFF1["只能访问离线实例"]
OFF2["适用于:ETL、个人分析、慢查询"]
end
Admin --> |继承| RW
RW --> |继承| RO
创建业务用户
pg_users:
# 只读用户 - 用于报表查询
- name: dbuser_report
password: ReportUser123
roles: [dbrole_readonly]
pgbouncer: true
# 读写用户 - 用于生产业务
- name: dbuser_app
password: AppUser456
roles: [dbrole_readwrite]
pgbouncer: true
# 管理员用户 - 用于 DDL 操作
- name: dbuser_admin
password: AdminUser789
roles: [dbrole_admin]
pgbouncer: true
HBA 访问控制
HBA(Host-Based Authentication)控制"谁可以从哪里连接":
flowchart LR
subgraph Sources["连接来源"]
S1["🏠 本地 Socket"]
S2["💻 localhost"]
S3["🏢 内网 CIDR"]
S4["🛡️ 管理节点"]
S5["🌐 外网"]
end
subgraph Auth["认证方式"]
A1["ident/peer<br/>OS 用户映射,最安全"]
A2["scram-sha-256<br/>密码认证"]
A3["scram-sha-256 + SSL<br/>强制 SSL"]
end
S1 --> A1
S2 --> A2
S3 --> A2
S4 --> A3
S5 --> A3
Note["📋 规则按顺序匹配<br/>第一条匹配的规则生效"]
自定义 HBA 规则
pg_hba_rules:
# 允许应用服务器从内网连接
- {user: dbuser_app, db: mydb, addr: '10.10.10.0/24', auth: scram-sha-256}
# 强制某些用户使用 SSL
- {user: admin, db: all, addr: world, auth: ssl}
# 要求证书认证(最高安全级别)
- {user: secure_user, db: all, addr: world, auth: cert}
加密通信
SSL/TLS 架构
sequenceDiagram
participant Client as 🖥️ 客户端
participant Server as 🐘 PostgreSQL
Client->>Server: 1. ClientHello
Server->>Client: 2. ServerHello
Server->>Client: 3. 服务器证书
Client->>Server: 4. 客户端密钥
Client->>Server: 5. 加密通道建立
Server->>Client: 5. 加密通道建立
rect rgb(200, 255, 200)
Note over Client,Server: 🔒 加密数据传输
Client->>Server: 6. 应用数据(加密)
Server->>Client: 6. 应用数据(加密)
end
Note over Client,Server: ✅ 防止窃听 ✅ 防止篡改 ✅ 验证服务器身份
本地 CA
Pigsty 自动生成本地 CA 并签发证书:
/etc/pki/
├── ca.crt # CA 证书(公开)
├── ca.key # CA 私钥(保密!)
└── server.crt/key # 服务器证书/私钥
⚠️ 重要:请安全备份 ca.key,丢失后需要重新签发所有证书!
合规对照
等保三级(GB/T 22239-2019)
| 安全要求 |
Pigsty 默认 |
可配置达到 |
说明 |
| 身份鉴别唯一性 |
✅ |
✅ |
每个用户唯一标识 |
| 口令复杂度 |
⚠️ |
✅ |
启用 passwordcheck |
| 口令定期更换 |
⚠️ |
✅ |
需要运维流程 |
| 双因素认证 |
⚠️ |
✅ |
证书 + 密码 |
| 访问控制 |
✅ |
✅ |
HBA + 角色系统 |
| 最小权限原则 |
✅ |
✅ |
四层角色模型 |
| 通信加密 |
✅ |
✅ |
SSL/TLS |
| 审计日志 |
✅ |
✅ |
连接日志 + 慢查询 |
| 数据完整性 |
✅ |
✅ |
数据校验和 |
| 备份恢复 |
✅ |
✅ |
pgBackRest |
SOC 2 Type II
| 控制点 |
Pigsty 支持 |
说明 |
| CC6.1 逻辑访问控制 |
✅ |
HBA + 角色系统 |
| CC6.6 传输加密 |
✅ |
SSL/TLS |
| CC7.2 系统监控 |
✅ |
Prometheus + Grafana |
| CC9.1 业务连续性 |
✅ |
高可用 + PITR |
| A1.2 数据恢复 |
✅ |
pgBackRest 备份 |
图例:✅ 默认满足 · ⚠️ 需要额外配置
安全检查清单
部署前
部署后(必做)
定期维护
快速配置示例
生产环境安全配置
# pigsty.yml - 生产环境安全配置示例
all:
vars:
# 修改默认密码(必须!)
pg_admin_password: 'SecureDBAPassword2024!'
pg_monitor_password: 'SecureMonitorPass2024!'
pg_replication_password: 'SecureReplPass2024!'
# 启用密码强度检查
pg_libs: 'passwordcheck, pg_stat_statements, auto_explain'
# 自定义 HBA 规则
pg_hba_rules:
# 应用服务器
- {user: app, db: appdb, addr: '10.10.10.0/24', auth: scram-sha-256}
# 管理员强制 SSL
- {user: dbuser_dba, db: all, addr: world, auth: ssl}
金融级安全配置
# 金融级配置 - 启用证书认证
pg_hba_rules:
# 交易系统使用证书认证
- {user: trade_user, db: trade, addr: world, auth: cert}
# 其他系统使用 SSL + 密码
- {user: all, db: all, addr: world, auth: ssl}
# 启用备份加密
pgbackrest_repo:
minio:
cipher_type: aes-256-cbc
cipher_pass: 'YourBackupEncryptionKey'
接下来
深入了解安全配置的细节:
相关话题:
1 - 安全概述
Pigsty 的安全能力总览与合规对照表。
Pigsty 提供多层次的安全防护,从网络边界到数据存储,全方位保护您的数据库。
安全层次
第一层:网络安全
| 组件 |
防护措施 |
| 防火墙 |
限制入站端口,仅开放必要服务 |
| HAProxy |
服务入口,隐藏后端拓扑 |
| SSL/TLS |
加密客户端与服务器之间的通信 |
第二层:认证安全
| 组件 |
防护措施 |
| HBA 规则 |
基于来源地址的访问控制 |
| 密码认证 |
SCRAM-SHA-256 加密存储 |
| 证书认证 |
可选的客户端证书验证 |
第三层:授权安全
| 组件 |
防护措施 |
| 角色系统 |
分层的权限角色 |
| 对象权限 |
精细的表/函数级权限 |
| 行级安全 |
可选的 RLS 策略 |
第四层:数据安全
| 组件 |
防护措施 |
| 数据校验 |
检测存储层数据损坏 |
| 备份加密 |
AES-256 加密备份文件 |
| 审计日志 |
记录所有重要操作 |
默认配置
用户与密码
| 用户 |
用途 |
默认密码 |
建议 |
postgres |
系统超级用户 |
无密码(仅本地) |
保持无密码 |
dbuser_dba |
管理员用户 |
DBUser.DBA |
必须修改 |
dbuser_monitor |
监控用户 |
DBUser.Monitor |
必须修改 |
replicator |
复制用户 |
DBUser.Replicator |
必须修改 |
重要:生产环境部署后,请立即修改这些默认密码!
HBA 规则
Pigsty 默认的 HBA 规则按来源地址分层:
| 来源 |
认证方式 |
说明 |
| 本地 Socket |
ident/peer |
OS 用户映射,最安全 |
| localhost |
scram-sha-256 |
密码认证 |
| 内网 (intra) |
scram-sha-256 |
密码认证 |
| 基础设施节点 |
scram-sha-256 + SSL |
管理员强制 SSL |
| 外网 (world) |
scram-sha-256 + SSL |
管理员强制 SSL |
SSL 配置
| 配置项 |
默认值 |
说明 |
| PostgreSQL SSL |
启用 |
客户端可选择使用 |
| Patroni SSL |
禁用 |
可配置启用 |
| Pgbouncer SSL |
禁用 |
可配置启用 |
| Nginx HTTPS |
启用 |
管理界面默认 HTTPS |
安全增强配置
启用密码强度检查
pg_libs: 'passwordcheck, pg_stat_statements, auto_explain'
强制 SSL 连接
pg_hba_rules:
- {user: all, db: all, addr: world, auth: ssl}
启用客户端证书认证
pg_hba_rules:
- {user: secure_user, db: all, addr: world, auth: cert}
启用 Patroni SSL
patroni_ssl_enabled: true
启用 Pgbouncer SSL
pgbouncer_sslmode: require
安全检查清单
部署前
部署后
定期维护
安全相关参数
2 - 身份认证
HBA 规则、密码策略、证书认证详解。
身份认证是安全的第一道防线,确保只有合法用户才能访问数据库。Pigsty 支持多种认证方式,并通过 HBA(Host-Based Authentication)规则进行精细控制。
HBA 规则
HBA 规则决定了"谁可以从哪里用什么方式连接"。
规则结构
pg_hba_rules:
- user: '<用户>' # 用户名或角色,支持 + 前缀表示角色成员
db: '<数据库>' # 数据库名,all 表示所有
addr: '<地址>' # 来源地址,支持别名
auth: '<方法>' # 认证方法
title: '<说明>' # 规则说明(可选)
地址别名
| 别名 |
含义 |
local |
本地 Unix Socket |
localhost |
127.0.0.1/32 |
intra |
内网 CIDR(由 pg_intranet 定义) |
infra |
基础设施节点 IP |
world |
0.0.0.0/0(所有地址) |
认证方法别名
| 别名 |
实际方法 |
说明 |
deny |
reject |
拒绝连接 |
pwd |
scram-sha-256 |
密码认证 |
ssl |
scram-sha-256 + hostssl |
SSL + 密码 |
cert |
cert |
客户端证书 |
trust |
trust |
无条件信任(不推荐) |
ident/peer |
ident/peer |
OS 用户映射 |
默认规则
pg_default_hba_rules:
# dbsu 本地免密访问
- {user: '${dbsu}', db: all, addr: local, auth: ident}
- {user: '${dbsu}', db: replication, addr: local, auth: ident}
# 复制用户
- {user: '${repl}', db: replication, addr: localhost, auth: pwd}
- {user: '${repl}', db: replication, addr: intra, auth: pwd}
# 监控用户
- {user: '${monitor}', db: all, addr: localhost, auth: pwd}
- {user: '${monitor}', db: all, addr: infra, auth: pwd}
# 管理员(强制 SSL)
- {user: '${admin}', db: all, addr: infra, auth: ssl}
- {user: '${admin}', db: all, addr: world, auth: ssl}
# 业务用户
- {user: '+dbrole_readonly', db: all, addr: localhost, auth: pwd}
- {user: '+dbrole_readonly', db: all, addr: intra, auth: pwd}
- {user: '+dbrole_offline', db: all, addr: intra, auth: pwd}
密码策略
密码加密
Pigsty 默认使用 SCRAM-SHA-256,这是 PostgreSQL 支持的最安全的密码哈希算法:
pg_pwd_enc: scram-sha-256
密码存储
密码可以在配置中使用明文或哈希值:
pg_users:
# 明文密码(部署时自动加密)
- name: dbuser_app
password: 'MySecurePassword123!'
# 已加密的哈希值
- name: dbuser_app
password: 'SCRAM-SHA-256$4096:xxx...'
密码强度检查
启用 passwordcheck 扩展强制密码复杂度:
pg_libs: 'passwordcheck, pg_stat_statements, auto_explain'
或使用功能更丰富的 credcheck 扩展:
pg_extensions:
- credcheck
密码有效期
设置用户密码过期时间:
pg_users:
- name: temp_user
password: 'xxx'
expire_in: 30 # 30 天后过期
- name: contract_user
password: 'xxx'
expire_at: '2024-12-31' # 指定日期过期
证书认证
证书认证提供比密码更强的安全性,可实现双因素认证。
工作原理
- 客户端持有由 CA 签发的证书
- 证书的 CN(Common Name)字段对应数据库用户名
- 服务器验证证书有效性并提取用户名
配置步骤
第一步:签发客户端证书
# 使用 Pigsty 提供的脚本签发证书
./cert.yml -e cn=dbuser_app
证书生成在 files/pki/misc/dbuser_app.{key,crt}。
第二步:配置 HBA 规则
pg_hba_rules:
- user: dbuser_app
db: all
addr: world
auth: cert
title: 'App user with certificate'
第三步:客户端使用证书连接
psql "host=pg-test port=5432 dbname=app \
sslmode=verify-full \
sslcert=dbuser_app.crt \
sslkey=dbuser_app.key \
sslrootcert=ca.crt"
双因素认证
结合密码和证书实现双因素认证:
pg_hba_rules:
# 需要证书 + 密码
- user: secure_user
db: all
addr: world
auth: cert
# 在 PostgreSQL 中还需要配置 clientcert=verify-full
客户端需要同时提供:
- 有效的客户端证书
- 正确的密码
登录失败处理
日志记录
PostgreSQL 默认记录认证失败:
LOG: connection received: host=192.168.1.100 port=45678
FATAL: password authentication failed for user "hacker"
告警配置
配置 VictoriaMetrics 告警规则监控认证失败。
自动封禁(可选)
可配合 fail2ban 自动封禁频繁失败的 IP:
# /etc/fail2ban/jail.local
[postgresql]
enabled = true
filter = postgresql
action = iptables[name=PostgreSQL, port=5432, protocol=tcp]
logpath = /pg/log/postgres/postgresql-*.log
maxretry = 5
bantime = 3600
认证故障排查
常见问题
问题:FATAL: no pg_hba.conf entry for host
原因:没有匹配的 HBA 规则
解决:检查 pg_hba.conf 并添加适当的规则
问题:FATAL: password authentication failed
原因:密码错误或用户不存在
解决:验证用户名和密码
问题:FATAL: certificate authentication failed
原因:证书无效或 CN 不匹配
解决:检查证书有效期和 CN 字段
调试命令
# 查看当前 HBA 规则
psql -c "SELECT * FROM pg_hba_file_rules;"
# 查看用户信息
psql -c "SELECT usename, valuntil FROM pg_user;"
# 测试连接
psql "host=xxx port=5432 dbname=xxx user=xxx" -c "SELECT 1;"
3 - 访问控制
角色系统、权限模型、数据库权限详解。
访问控制决定了用户登录后可以执行哪些操作。Pigsty 提供了一套开箱即用的角色权限模型,遵循最小权限原则。
角色系统
Pigsty 默认定义了四个业务角色和四个系统用户:
业务角色
| 角色 |
权限 |
用途 |
dbrole_readonly |
SELECT |
只读访问,用于报表、监控 |
dbrole_readwrite |
SELECT, INSERT, UPDATE, DELETE |
读写访问,用于应用程序 |
dbrole_admin |
+ CREATE, TRUNCATE |
对象管理,用于业务管理员 |
dbrole_offline |
SELECT(仅离线实例) |
受限只读,用于 ETL、分析 |
系统用户
| 用户 |
权限 |
用途 |
postgres |
SUPERUSER |
系统超级用户,仅本地访问 |
replicator |
REPLICATION |
流复制用户 |
dbuser_dba |
SUPERUSER + dbrole_admin |
数据库管理员 |
dbuser_monitor |
pg_monitor |
监控系统用户 |
角色层次
┌──────────────────┐
│ postgres │
│ (SUPERUSER) │
└────────┬─────────┘
│
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────┐ ┌──────────────────┐
│ dbuser_dba │ │replicator│ │ dbuser_monitor │
│ (SUPERUSER) │ │ (REPL) │ │ (pg_monitor) │
└────────┬────────┘ └─────────┘ └──────────────────┘
│
▼
┌─────────────────┐
│ dbrole_admin │
│ (CREATE, DDL) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ dbrole_readwrite│
│ (INSERT, etc.) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ dbrole_readonly │
│ (SELECT) │
└─────────────────┘
┌─────────────────┐
│ dbrole_offline │ (独立分支,受限访问)
│ (SELECT) │
└─────────────────┘
权限模型
对象权限
Pigsty 通过 ALTER DEFAULT PRIVILEGES 预设了对象权限:
| 对象类型 |
dbrole_readonly |
dbrole_readwrite |
dbrole_admin |
| SCHEMA |
USAGE |
USAGE |
USAGE, CREATE |
| TABLE |
SELECT |
SELECT, INSERT, UPDATE, DELETE |
+ TRUNCATE |
| SEQUENCE |
SELECT |
SELECT, UPDATE |
+ ALL |
| FUNCTION |
EXECUTE |
EXECUTE |
EXECUTE |
数据库权限
| 权限 |
说明 |
| CONNECT |
允许连接到数据库 |
| CREATE |
允许在数据库中创建 Schema |
| TEMP |
允许创建临时表 |
创建业务用户
基本用户
pg_users:
- name: dbuser_app
password: 'AppUserPassword123!'
roles: [dbrole_readwrite] # 继承读写权限
pgbouncer: true # 添加到连接池
comment: 'Application user'
只读用户
pg_users:
- name: dbuser_readonly
password: 'ReadOnlyPassword123!'
roles: [dbrole_readonly]
pgbouncer: true
comment: 'Read-only user for reporting'
管理员用户
pg_users:
- name: dbuser_admin
password: 'AdminPassword123!'
roles: [dbrole_admin]
pgbouncer: true
comment: 'Business admin user'
数据库权限控制
限制数据库访问
使用 revokeconn 限制数据库连接权限:
pg_databases:
- name: secret_db
owner: dbuser_secret
revokeconn: true # 只有 owner 和管理员可连接
设置 revokeconn: true 后:
- PUBLIC 的 CONNECT 权限被撤销
- 只有 owner 和系统用户可以连接
- owner 可以授权其他用户
数据库隔离
在同一集群中隔离多个业务数据库:
pg_databases:
- name: app1_db
owner: dbuser_app1
revokeconn: true
- name: app2_db
owner: dbuser_app2
revokeconn: true
pg_users:
- name: dbuser_app1
roles: [dbrole_admin]
- name: dbuser_app2
roles: [dbrole_admin]
这样 dbuser_app1 无法访问 app2_db,反之亦然。
权限最佳实践
遵循最小权限
- 应用程序使用
dbrole_readwrite,不要使用 dbrole_admin
- 只有需要创建对象时才授予
dbrole_admin
- 禁止应用程序使用 SUPERUSER
权限分离
| 角色 |
用户 |
职责 |
| DBA |
dbuser_dba |
运维管理、紧急处理 |
| 业务管理员 |
自定义 + dbrole_admin |
Schema 变更、DDL |
| 应用程序 |
自定义 + dbrole_readwrite |
业务读写 |
| 报表系统 |
自定义 + dbrole_readonly |
只读查询 |
| ETL |
自定义 + dbrole_offline |
离线分析 |
使用角色继承
通过角色继承简化权限管理:
pg_users:
# 业务角色(不可登录)
- name: role_app1
login: false
roles: [dbrole_readwrite]
# 实际用户继承角色
- name: user_app1_prod
roles: [role_app1]
pgbouncer: true
- name: user_app1_dev
roles: [role_app1]
pgbouncer: true
行级安全(RLS)
PostgreSQL 支持行级安全策略,可实现细粒度的数据访问控制。
启用 RLS
-- 创建表
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT,
amount DECIMAL
);
-- 启用 RLS
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
-- 创建策略:用户只能看到自己的订单
CREATE POLICY user_orders ON orders
FOR ALL
USING (user_id = current_setting('app.user_id')::INT);
配置用户
pg_users:
- name: app_user
bypassrls: false # 不允许绕过 RLS
roles: [dbrole_readwrite]
4 - 加密通信
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}
5 - 合规清单
等保三级与 SOC2 Type II 详细合规对照。
本文档详细对照 Pigsty 的安全能力与 中国等保三级(GB/T 22239-2019)和 SOC 2 Type II 的合规要求。
等保三级对照
身份鉴别
应对登录的用户进行身份标识和鉴别,身份标识具有唯一性
| 要求项 |
默认满足 |
配置可达 |
Pigsty 实现 |
| 身份唯一性 |
✅ |
✅ |
PostgreSQL 角色系统保证用户名唯一 |
| 口令复杂度 |
⚠️ |
✅ |
启用 passwordcheck 或 credcheck 扩展 |
| 口令定期更换 |
⚠️ |
✅ |
使用 expire_in/expire_at 设置用户有效期 |
| 登录失败处理 |
⚠️ |
✅ |
日志记录 + fail2ban 自动封禁 |
| 双因素认证 |
⚠️ |
✅ |
密码 + 客户端 SSL 证书 |
访问控制
应授予管理用户所需的最小权限,实现管理用户的权限分离
| 要求项 |
默认满足 |
配置可达 |
Pigsty 实现 |
| 访问控制 |
✅ |
✅ |
HBA 规则 + RBAC + 可选 SELinux |
| 最小权限 |
✅ |
✅ |
分层角色体系 |
| 权限分离 |
✅ |
✅ |
DBA / Monitor / 业务用户分离 |
| 默认拒绝 |
✅ |
✅ |
无匹配 HBA 规则时拒绝连接 |
安全审计
应启用安全审计功能,审计覆盖到每个用户
| 要求项 |
默认满足 |
配置可达 |
Pigsty 实现 |
| 审计日志 |
✅ |
✅ |
记录 DDL、慢查询、认证事件 |
| 日志保护 |
✅ |
✅ |
文件权限 0640 + VictoriaLogs 集中存储 |
| 审计范围 |
⚠️ |
✅ |
启用 pgaudit 扩展记录所有操作 |
通信安全
应采用密码技术保证通信过程中数据的完整性和保密性
| 要求项 |
默认满足 |
配置可达 |
Pigsty 实现 |
| 通信加密 |
✅ |
✅ |
默认启用 SSL,可强制 SSL |
| 数据完整性 |
✅ |
✅ |
数据校验和默认启用 |
数据安全
应采用密码技术保证重要数据在存储过程中的保密性
| 要求项 |
默认满足 |
配置可达 |
Pigsty 实现 |
| 存储加密 |
⚠️ |
✅ |
备份加密 + Percona TDE 内核支持 |
| 备份恢复 |
✅ |
✅ |
pgBackRest 自动备份,PITR 恢复 |
网络安全
应在网络边界部署访问控制设备
| 要求项 |
默认满足 |
配置可达 |
Pigsty 实现 |
| 网络隔离 |
✅ |
✅ |
防火墙 + HBA 规则 |
| 入侵防范 |
⚠️ |
✅ |
日志监控告警 + fail2ban |
SOC 2 Type II 对照
安全性(Security)
| 控制点 |
默认满足 |
配置可达 |
Pigsty 实现 |
| CC6.1 逻辑访问控制 |
✅ |
✅ |
HBA + RBAC |
| CC6.2 用户注册授权 |
✅ |
✅ |
Ansible 声明式管理 |
| CC6.3 最小权限 |
✅ |
✅ |
分层角色体系 |
| CC6.6 传输加密 |
✅ |
✅ |
SSL/TLS 全局启用 |
| CC6.7 静态加密 |
⚠️ |
✅ |
备份加密 + 可选 TDE |
| CC6.8 恶意软件防护 |
⚠️ |
✅ |
最小安装 + 审计 |
可用性(Availability)
| 控制点 |
默认满足 |
配置可达 |
Pigsty 实现 |
| A1.1 容量规划 |
✅ |
✅ |
监控指标 + 告警 |
| A1.2 数据恢复 |
✅ |
✅ |
PITR 备份恢复 |
| CC9.1 业务连续性 |
✅ |
✅ |
HA + 自动故障转移 |
监控(Monitoring)
| 控制点 |
默认满足 |
配置可达 |
Pigsty 实现 |
| CC7.1 入侵检测 |
⚠️ |
✅ |
认证失败告警 |
| CC7.2 系统监控 |
✅ |
✅ |
VictoriaMetrics + Grafana |
| CC7.3 事件响应 |
✅ |
✅ |
AlertManager 告警通知 |
实现合规的配置
等保三级完整配置
# 密码策略
pg_libs: 'passwordcheck, pg_stat_statements, auto_explain'
# 强制 SSL
pg_default_hba_rules:
- {user: all, db: all, addr: world, auth: ssl}
# 用户有效期
pg_users:
- name: dbuser_app
password: 'xxx'
expire_in: 90 # 90天后过期
# 审计日志
pg_parameters:
log_statement: all
log_connections: 'on'
log_disconnections: 'on'
# 启用 pgaudit
pg_extensions:
- pgaudit
SOC 2 完整配置
# 同步复制(零数据丢失)
pg_conf: crit.yml
pg_rpo: 0
# 备份加密
pgbackrest_method: minio
pgbackrest_repo:
minio:
cipher_type: aes-256-cbc
cipher_pass: 'YourSecurePassword!'
# Patroni SSL
patroni_ssl_enabled: true
# Pgbouncer SSL
pgbouncer_sslmode: require
合规检查脚本
可以使用以下命令检查当前配置的合规状态:
# 检查 SSL 配置
psql -c "SHOW ssl;"
# 检查密码加密方式
psql -c "SHOW password_encryption;"
# 检查 HBA 规则
psql -c "SELECT * FROM pg_hba_file_rules;"
# 检查用户过期时间
psql -c "SELECT usename, valuntil FROM pg_user WHERE valuntil IS NOT NULL;"
# 检查数据校验和
psql -c "SHOW data_checksums;"
合规文档
进行合规审计时,可能需要提供以下文档:
- 架构文档:系统架构图、网络拓扑图
- 配置清单:
pigsty.yml 配置文件
- 用户清单:用户列表、角色分配
- 审计日志:PostgreSQL 日志、操作日志
- 备份记录:备份策略、恢复测试记录
- 监控告警:告警规则、响应流程