这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
安全合规
认证、授权、加密、审计与合规基线,覆盖数据库与基础设施安全。
Pigsty 的安全目标是 CIA 三元组:
- 机密性:防止未授权访问与泄露
- 完整性:防止数据被篡改或静默损坏
- 可用性:防止故障导致业务中断
Pigsty 的安全理念:
- 默认安全:开箱即用的安全基线,配置少、覆盖广。
- 纵深防御:多层保护叠加,单点失守不致系统失守。
- 最小权限:角色与权限模型贯彻最小授权原则。
- 可合规:安全能力与流程结合即可通过合规检查。
默认安全基线(解决什么问题)
| 安全选项 | 默认值 | 解决的问题 |
|---|
| 密码加密 | pg_pwd_enc: scram-sha-256 | 防止弱哈希与明文泄露 |
| 数据校验 | pg_checksum: true | 检测静默数据损坏 |
| HBA 分层 | 管理员外网必须 ssl | 防止外网明文访问 |
| 本地 CA | ca_create: true | 统一证书信任链 |
| 备份恢复 | pgbackrest_enabled: true | 防止误删误改不可恢复 |
| Nginx HTTPS | nginx_sslmode: enable | 防止 Web 入口明文泄露 |
| MinIO HTTPS | minio_https: true | 防止备份链路窃听 |
| OS 基线 | SELinux permissive | 为强制模式预留基础 |
默认配置以“可用、可扩展”为先,生产环境应根据合规要求加固。
加固路线图
Pigsty 提供安全增强模板 conf/ha/safe.yml,可快速将默认基线升级到更高安全级别:
- 强制 SSL 与证书认证
- 密码强度与过期策略
- 连接与断开日志
- 防火墙与 SELinux 加固
本章内容
| 章节 | 说明 | 核心问题 |
|---|
| 纵深防御 | 七层安全模型与基线 | 安全体系整体如何落地? |
| 身份认证 | HBA 规则、密码策略、证书认证 | 如何验证用户身份? |
| 访问控制 | 角色系统、权限模型、数据库隔离 | 如何控制用户权限? |
| 加密通信 | TLS、本地 CA、证书管理 | 如何保护传输与证书? |
| 数据安全 | 校验和、备份、加密与恢复 | 数据如何完整可恢复? |
| 合规清单 | 等保三级与 SOC2 对照 | 如何满足合规要求? |
相关话题
1 - 七层安全模型
Pigsty 的纵深防御模型:从物理到用户的多层安全基线。
安全不是一道墙,而是一座城。Pigsty 采用纵深防御策略,在七个层次上构建多重保护,即使某一层被突破,仍有其他层提供保护。
这种分层思路解决三类核心风险:
- 边界被突破:降低“单点失守导致全盘失守”的概率。
- 内部滥用:即使内部账号被盗,也能通过最小权限限制破坏范围。
- 不可预期故障:硬件、软件、人为错误都能被“多层兜底”。
概览
L1 物理与介质安全
物理层失守时,唯一的对抗手段是数据本身的自我保护。
解决的问题
Pigsty 支持
- 数据校验和:默认开启
pg_checksum: true,可发现坏块/内存错误导致的数据损坏。 - 可选透明加密:通过
pg_tde 等扩展实现数据静态加密,防止介质泄露。
L2 网络安全
控制“谁能接触到服务”,降低攻击面。
解决的问题
Pigsty 支持
- 防火墙分区:
node_firewall_mode 可启用 zone,内网信任、公网受限。 - 监听收敛:
pg_listen 可限制监听地址,避免全网暴露。 - TLS 能力:HBA 支持
ssl/cert,保证连接加密与身份校验。
L3 边界安全
“统一入口”是可审计、可控制、可封禁的基础。
解决的问题
Pigsty 支持
- HAProxy 入口:数据库流量统一入口,便于封禁/限流/切换。
- Nginx 网关:基础设施服务统一 HTTPS 入口(
nginx_sslmode)。 - 集中管理口令:HAProxy 管理口令、Grafana 管理口令统一在配置中声明。
L4 主机安全
数据库安全的地基:最小权限、访问隔离、系统加固。
解决的问题
Pigsty 支持
- SELinux 模式:
node_selinux_mode 可切换 enforcing 强制模式。 - 最小权限管理员:
node_admin_sudo 支持 limit 限制 sudo 命令集。 - 敏感文件权限:CA 私钥目录默认 0700,私钥文件 0600。
L5 应用安全
认证是所有数据库安全的“第一道闸门”。
解决的问题
Pigsty 支持
- HBA 分层控制:默认规则按来源与角色分层,管理员外网访问必须
ssl。 - SCRAM 密码哈希:
pg_pwd_enc: scram-sha-256 默认启用。 - 密码强度检查:
passwordcheck/credcheck 可启用,阻止弱口令。 - 证书认证:
auth: cert 支持客户端证书认证。
L6 数据安全
保障数据在“可用、可恢复、可追责”。
解决的问题
Pigsty 支持
- pgBackRest 备份:默认启用,支持本地与 MinIO 仓库。
- 备份加密:MinIO 仓库支持 AES-256-CBC(
cipher_type)。 - PITR 恢复:结合归档可恢复到任意时间点。
- 审计日志:模板启用 DDL/连接/慢查询日志,可选
pgaudit。
L7 用户安全
最小权限不是口号,而是默认行为。
解决的问题
Pigsty 支持
- 四层 RBAC:
dbrole_readonly/readwrite/admin/offline。 - 默认权限策略:对象创建即自动授予正确权限。
- 数据库隔离:
revokeconn: true 可隔离跨库访问。 - 公共权限收敛:撤销
public 模式 CREATE 权限。
安全加固路径
Pigsty 提供安全增强模板:conf/ha/safe.yml。它将常见加固项集中封装:
- 强制 SSL、证书认证
- 密码强度与过期策略
- 连接与断开日志
- 防火墙与 SELinux 加固
这条路径可以作为“从默认到合规”的快速升级方案。
接下来
2 - 身份认证
HBA 规则、密码策略与证书认证,回答“谁能连进来、如何证明身份”。
身份认证解决三个核心问题:
- 你是谁:身份是否唯一可识别?
- 你怎么证明:密码/证书是否足够安全?
- 你从哪里来:来源是否受控?
Pigsty 使用 HBA 规则 + 密码/证书 完成身份认证,并以 SCRAM 为默认密码哈希方案。
认证链路
flowchart LR
C[客户端] --> HBA[HBA 规则]
HBA --> A1[密码 SCRAM]
HBA --> A2[证书认证]
HBA --> A3[本地 ident/peer]
A1 --> RBAC[角色与权限]
A2 --> RBAC
A3 --> RBAC
HBA 决定“谁能从哪里来”,认证方式决定“如何证明身份”。
HBA 分层模型
Pigsty 默认 HBA 规则已经分层:
- 本地使用
ident/peer,最安全。 - 内网使用
scram 密码认证。 - 外网管理员必须走
ssl。
这解决了“同一个用户在不同来源使用不同认证强度”的问题。
HBA 规则的关键能力
- 顺序优先:支持
order 排序,数值越小优先级越高。 - 地址别名:
local / localhost / intra / world 等。 - 角色条件:
primary/replica/offline 可精细化控制。
密码认证
默认密码哈希算法:
pg_pwd_enc: scram-sha-256
解决的问题
兼容性
如需兼容老客户端可使用 md5,但会降低安全性。
密码强度与轮换
Pigsty 支持启用密码强度检查扩展:
pg_libs: '$libdir/passwordcheck, pg_stat_statements, auto_explain'
pg_extensions: [ passwordcheck, credcheck ]
通过 expire_in 控制账号过期时间:
pg_users:
- { name: dbuser_app, password: 'StrongPwd', expire_in: 365 }
解决的问题
证书认证
证书认证解决“密码被钓鱼/被拷贝”的风险。
- HBA
auth: cert 要求客户端证书。 - 证书
CN 通常对应数据库用户名。 - Pigsty 内置
cert.yml 用于签发客户端证书。
PgBouncer 认证
PgBouncer 使用独立 HBA 规则与 TLS 设置:
pgbouncer_sslmode: disable # 默认关闭,可设为 require/verify-full
pgb_default_hba_rules: [...] # 独立规则
这解决了“连接池入口与数据库入口不同步”的问题。
默认账号与风险
| 用户 | 默认密码 | 风险 |
|---|
dbuser_dba | DBUser.DBA | 管理账号默认密码 |
dbuser_monitor | DBUser.Monitor | 监控账号易被滥用 |
replicator | DBUser.Replicator | 复制账号被滥用可导致数据外泄 |
生产环境必须修改默认密码。
安全建议
- 对外入口全部启用
ssl/cert。 - 内网用户使用
scram,避免 md5。 - 启用
passwordcheck 强制复杂度。 - 定期轮换口令(
expire_in)。
接下来
3 - 访问控制
Pigsty 提供开箱即用的角色与权限模型,贯彻最小权限原则。
访问控制解决两个核心问题:
- 你能做什么:读/写/DDL 的权限边界
- 你能访问哪些数据:跨库、跨模式的隔离边界
Pigsty 通过 RBAC 角色体系 + 默认权限策略 将“最小权限”落实为默认行为。
四层角色模型
flowchart TB
subgraph Admin["dbrole_admin(管理员)"]
A1["可执行 DDL / CREATE / ALTER"]
A2["继承 dbrole_readwrite"]
end
subgraph RW["dbrole_readwrite(读写)"]
RW1["可 INSERT/UPDATE/DELETE"]
RW2["继承 dbrole_readonly"]
end
subgraph RO["dbrole_readonly(只读)"]
RO1["可 SELECT 所有表"]
end
subgraph Offline["dbrole_offline(离线)"]
OFF1["仅离线实例可用"]
end
Admin --> RW --> RO解决的问题
- 生产账号天然拥有过高权限
- DDL 与 DML 不分离导致误操作风险
默认角色与系统用户
Pigsty 默认提供四个角色与四个系统用户(来自源码默认值):
| 角色/用户 | 属性 | 继承/角色 | 描述 |
|---|
dbrole_readonly | NOLOGIN | - | 全局只读访问 |
dbrole_offline | NOLOGIN | - | 受限只读(离线实例) |
dbrole_readwrite | NOLOGIN | dbrole_readonly | 全局读写访问 |
dbrole_admin | NOLOGIN | pg_monitor, dbrole_readwrite | 管理员 / 对象创建 |
postgres | SUPERUSER | - | 系统超级用户 |
replicator | REPLICATION | pg_monitor, dbrole_readonly | 复制用户 |
dbuser_dba | SUPERUSER | dbrole_admin | 管理员用户 |
dbuser_monitor | - | pg_monitor, dbrole_readonly | 监控用户 |
这套默认角色可以覆盖绝大多数业务场景。
默认权限策略
Pigsty 在初始化时写入默认权限(pg_default_privileges),确保新建对象自动具备合理权限。
解决的问题
- 新建对象未授权导致应用不可用
- 误授权给
PUBLIC 导致全库暴露
思路
- 只读角色:
SELECT/EXECUTE - 读写角色:
INSERT/UPDATE/DELETE - 管理员角色:
DDL 权限
对象所有权与 DDL 规范
默认权限仅对“管理员角色创建的对象”自动生效。
这意味着:
- 必须使用
dbuser_dba/postgres 执行 DDL - 或业务管理员先
SET ROLE dbrole_admin
否则新对象会脱离默认权限体系,破坏最小权限原则。
数据库隔离
数据库级别支持 revokeconn,可做到跨库隔离:
pg_databases:
- { name: appdb, owner: dbuser_app, revokeconn: true }
解决的问题
- 一个账号可以“穿透”访问所有数据库
- 多租户数据库缺乏边界
公共权限收敛
Pigsty 初始化时撤销 public 模式的 CREATE 权限:
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
解决的问题
- 非授权用户随意创建对象
- “影子表/影子函数”带来的安全风险
离线角色的作用
dbrole_offline 只能访问离线实例(pg_role=offline 或 pg_offline_query=true)。
解决的问题
- ETL/分析任务影响生产性能
- 个人账号在主库执行高危查询
最佳实践
- 业务账号默认使用
dbrole_readwrite 或 dbrole_readonly。 - 生产 DDL 必须经由管理员角色。
- 多租户业务启用
revokeconn 隔离。 - 报表/ETL 使用
dbrole_offline。
接下来
4 - 加密通信与本地 CA
Pigsty 内置自签 CA,签发 TLS 证书并加密通信流量。
加密通信解决三个问题:
- 窃听:防止明文流量被监听
- 篡改:防止中间人修改数据
- 冒充:防止服务端/客户端被伪造
Pigsty 通过 本地 CA + TLS 为数据库与基础设施组件提供统一的信任根。
本地 CA 的作用
Pigsty 默认会在管理节点生成自签 CA:
files/pki/ca/ca.key # CA 私钥(必须严格保护)
files/pki/ca/ca.crt # CA 根证书(可分发)
源码默认值:
ca_create: true:找不到 CA 时自动生成。ca_cn: pigsty-ca:CA 证书 CN 固定为 pigsty-ca。- 根证书有效期约 100 年(自签)。
- 由 CA 签发的服务器/客户端证书有效期
cert_validity: 7300d(20 年)。
证书覆盖范围
本地 CA 会签发多种组件证书,统一信任链:
| 组件 | 目的 | 典型路径 |
|---|
| PostgreSQL / PgBouncer | 连接加密 | /pg/cert/ |
| Patroni | API 通信 | /pg/cert/ |
| etcd | DCS 加密 | /etc/etcd/ |
| MinIO | 对象存储 HTTPS | ~minio/.minio/certs/ |
| Nginx | Web 入口 HTTPS | /etc/nginx/conf.d/cert/ |
解决的问题:不同组件自建证书会产生信任碎片,统一 CA 可以一次分发,多处复用。
信任分发
Pigsty 安装时会将 ca.crt 分发到所有节点并加入系统信任:
- 证书路径:
/etc/pki/ca.crt - EL 系列:
/etc/pki/ca-trust/source/anchors/ - Debian/Ubuntu:
/usr/local/share/ca-certificates/
这样可以让系统内的客户端自动信任 Pigsty 签发的证书。
使用外部 CA
如果你已有企业 CA,可以直接替换:
files/pki/ca/ca.key
files/pki/ca/ca.crt
建议设置:
解决的问题:防止系统误生成新的自签 CA,导致证书信任链混乱。
客户端证书认证
证书认证可以替代或增强密码认证:
Pigsty 自带 cert.yml 用于签发客户端证书:
./cert.yml -e cn=dbuser_dba
./cert.yml -e cn=dbuser_monitor
默认生成在:
files/pki/misc/<cn>.key
files/pki/misc/<cn>.crt
密钥保护与轮换
- CA 私钥默认 0600 权限,并在 0700 目录中保存。
- 一旦 CA 私钥泄露,必须重新生成 CA 并重签所有证书。
- 建议在重大升级或密钥泄露事件后进行证书轮换。
接下来
5 - 数据安全
数据完整性、备份与恢复、加密与审计。
数据安全关注三件事:完整性、可恢复性、保密性。Pigsty 在默认配置中已启用关键能力,并支持按需加固。
数据完整性
解决的问题
- 磁盘坏块、内存错误导致的静默损坏
- 意外写入导致的数据污染
Pigsty 支持
- 数据校验和:默认
pg_checksum: true,初始化时启用 data-checksums。 - 副本兜底:主库坏块可从从库恢复(与 HA 配合使用)。
可恢复性(备份与 PITR)
解决的问题
Pigsty 支持
- pgBackRest 默认启用:
pgbackrest_enabled: true。 - 本地仓库:默认保留 2 份完整备份。
- 远程仓库:可接入 MinIO,支持对象存储与多副本。
- PITR:结合 WAL 归档进行任意时间点恢复。
数据保密性
解决的问题
Pigsty 支持
- 备份加密:MinIO 仓库支持 AES-256-CBC(
cipher_type)。 - 透明加密(可选):通过
pg_tde 等扩展实现数据静态加密。 - 密钥隔离:建议将
cipher_pass 与 CA 私钥分离管理。
审计与可追溯
解决的问题
Pigsty 支持
- 日志收集:模板默认启用
logging_collector。 - DDL 审计:
log_statement: ddl。 - 慢查询:
log_min_duration_statement。 - 连接日志:
log_connections(PG18+)。 - 审计扩展:
pgaudit、pgauditlogtofile 可选。
加固建议
- 对远程备份强制加密与专用密钥。
- 定期演练 PITR,验证恢复链路。
- 对关键业务启用
pgaudit。 - 结合 高可用 形成“备份 + 副本”双层兜底。
接下来
6 - 合规清单
以 SOC2 与等保三级为切入点,映射 Pigsty 安全能力与证据准备。
合规不是“开关”,而是 配置 + 流程 + 证据 的组合:
- 配置:安全能力是否启用(HBA/TLS/审计/备份)
- 流程:是否有权限管理、变更、备份演练等制度
- 证据:日志、配置快照、备份报告、监控告警
本页以 SOC2 与等保三级为切入点,说明 Pigsty 的安全能力与合规映射。
默认凭证清单(必须修改)
来自源码默认值:
| 组件 | 默认用户名 | 默认密码 |
|---|
| PostgreSQL 管理员 | dbuser_dba | DBUser.DBA |
| PostgreSQL 监控 | dbuser_monitor | DBUser.Monitor |
| PostgreSQL 复制 | replicator | DBUser.Replicator |
| Patroni API | postgres | Patroni.API |
| HAProxy 管理 | admin | pigsty |
| Grafana 管理 | admin | pigsty |
| MinIO Root | minioadmin | S3User.MinIO |
| etcd Root | root | Etcd.Root |
生产环境必须修改。
证据准备(建议)
| 证据类型 | 说明 | Pigsty 支持 |
|---|
| 配置快照 | HBA、角色、TLS、备份策略 | pigsty.yml / inventory 配置 |
| 访问控制 | 角色与权限 | pg_default_roles / pg_default_privileges |
| 连接审计 | 连接、断开、DDL | log_connections / log_statement |
| 备份报告 | 完整备份与恢复记录 | pgBackRest 日志与任务 |
| 监控告警 | 异常事件记录 | Prometheus + Grafana |
| 证书管理 | CA/证书分发记录 | files/pki/ / /etc/pki/ca.crt |
SOC2 视角(示例映射)
SOC2 的核心是 安全、可用性、机密性。以下为常见控制点的概念映射:
| 控制点(SOC2) | 解决的问题 | Pigsty 能力 | 需要流程 |
|---|
| CC6 逻辑访问控制 | 未授权访问 | HBA + RBAC + 默认权限 | 权限审批与定期审计 |
| CC6 认证强度 | 弱口令/复用 | SCRAM + passwordcheck | 密码轮换策略 |
| CC6 传输加密 | 明文传输 | TLS/CA、ssl/cert | 强制 TLS 政策 |
| CC7 系统监控 | 异常未发现 | Prometheus/Grafana | 告警处理流程 |
| CC7 审计追踪 | 无法追责 | 连接/DDL/慢查日志、pgaudit | 日志留存与审查 |
| CC9 业务连续性 | 数据不可恢复 | pgBackRest + PITR | 定期恢复演练 |
以上为概念映射,实际 SOC2 需要配合组织制度与审计证据。
等保三级(GB/T 22239-2019)映射
等保三级关注“身份鉴别、访问控制、审计、数据安全、通信安全、主机安全、网络边界”等。以下为核心控制点与 Pigsty 能力的对应关系:
| 控制点 | 解决的问题 | Pigsty 能力 | 需要配置/流程 |
|---|
| 身份鉴别唯一性 | 账号混用 | 唯一用户 + SCRAM | 账号管理流程 |
| 口令复杂度 | 弱口令 | passwordcheck/credcheck | 启用扩展 |
| 口令定期更换 | 长期风险 | expire_in | 密码轮换制度 |
| 访问控制 | 越权访问 | RBAC + 默认权限 | 权限审批 |
| 最小权限 | 权限膨胀 | 四层角色模型 | 账号分级 |
| 通信保密性 | 明文泄露 | TLS/CA、HBA ssl/cert | 强制 TLS |
| 安全审计 | 无法追责 | 连接/DDL/慢查日志 + pgaudit | 日志留存 |
| 数据完整性 | 静默损坏 | pg_checksum: true | - |
| 数据备份恢复 | 数据丢失 | pgBackRest + PITR | 演练与验收 |
| 主机安全 | 主机被攻破 | SELinux/防火墙 | 加固策略 |
| 边界安全 | 暴露入口 | HAProxy/Nginx 统一入口 | 网络分区 |
| 安全管理制度 | 缺乏流程 | - | 制度与审批 |
提示:等保三级不仅是技术问题,还需要完善的制度与运维流程支撑。
合规加固配置片段
# 强制 SSL / 证书
pg_hba_rules:
- { user: '+dbrole_readonly', db: all, addr: intra, auth: ssl }
- { user: dbuser_dba, db: all, addr: world, auth: cert }
# 密码强度
pg_libs: '$libdir/passwordcheck, pg_stat_statements, auto_explain'
pg_extensions: [ passwordcheck, credcheck ]
# PgBouncer / Patroni TLS
pgbouncer_sslmode: require
patroni_ssl_enabled: true
# 操作系统安全
node_firewall_mode: zone
node_selinux_mode: enforcing
合规检查清单
部署前
部署后(必做)
定期维护
接下来