七层安全模型

Pigsty 如何在七个安全层次上提供纵深防御,从物理安全到用户安全。

安全不是一道墙,而是一座城。Pigsty 采用 纵深防御 策略,在七个层次上构建多重保护,即使某一层被突破,仍有其他层提供保护。


概览

flowchart TB
    subgraph L1["🏢 第 1 层:物理安全"]
        L1A["数据校验和 · PGTDE 透明加密"]
    end
    subgraph L2["🌐 第 2 层:网络安全"]
        L2A["防火墙 · SSL/TLS 加密 · 本地 CA"]
    end
    subgraph L3["🛡️ 第 3 层:边界安全"]
        L3A["HAProxy 代理 · Nginx 网关"]
    end
    subgraph L4["💻 第 4 层:主机安全"]
        L4A["SELinux · 最小权限 · 系统加固"]
    end
    subgraph L5["🐘 第 5 层:应用安全"]
        L5A["HBA 规则 · 密码策略 · 连接池"]
    end
    subgraph L6["🔒 第 6 层:数据安全"]
        L6A["备份加密 · 审计日志 · PITR"]
    end
    subgraph L7["👤 第 7 层:用户安全"]
        L7A["四角色模型 · RBAC · 证书认证"]
    end

    L1 --> L2 --> L3 --> L4 --> L5 --> L6 --> L7

物理安全

物理访问失守,则其他层形同虚设。

物理安全是最基础的一层,涉及机房门禁、监控、环境控制、设备防盗、电力保障等。Pigsty 作为软件解决方案,在物理层面提供以下保护机制:

数据校验和

启用数据校验和可以检测存储层的静默数据损坏(如磁盘坏块、内存错误、固件 Bug):

pg_checksum: true  # v3.5+ 默认启用

原理:PostgreSQL 在每个数据页写入时计算校验和,读取时验证。发现损坏时报错而非返回错误数据。

兜底机制:从库副本提供坏块兜底,主库数据页损坏时可从从库恢复。

透明数据加密

对于有合规要求的场景,可使用 PGTDE(PostgreSQL Transparent Data Encryption)扩展:

pg_extensions:
  - pg_tde  # 透明数据加密扩展

效果:数据在磁盘上以加密形式存储,即使物理介质被盗也无法读取数据。


网络安全

控制数据包层面的访问和过滤。

防火墙

Pigsty 支持节点级防火墙配置,控制哪些端口对外开放:

node_firewall_mode: zone       # off | none | zone
node_firewall_intranet:        # 内网 CIDR(信任区域)
  - 10.0.0.0/8
  - 172.16.0.0/12
  - 192.168.0.0/16
node_firewall_public_port:     # 公网开放端口
  - 22    # SSH
  - 80    # HTTP
  - 443   # HTTPS

三种模式

模式说明适用场景
off不配置防火墙(默认)开发环境、已有安全组
none禁用 firewalld使用外部防火墙
zone区域模式:内网信任,公网受限生产环境推荐

SSL/TLS 加密

Pigsty 在多个层次提供 SSL/TLS 加密:

组件参数默认值说明
PostgreSQLHBA authpwd支持 ssl(强制)、cert(证书)
Pgbouncerpgbouncer_sslmodedisable可选 require / verify-full
Patronipatroni_ssl_enabledfalseREST API 加密
Nginxnginx_sslmodeenable可选 enforce(强制 HTTPS)
MinIO默认启用启用使用本地 CA 证书
etcd默认启用启用TLS 加密通信

安全加固配置

patroni_ssl_enabled: true    # 启用 Patroni SSL
pgbouncer_sslmode: require   # 强制 Pgbouncer SSL
nginx_sslmode: enforce       # 强制 HTTPS

本地 CA 证书基础设施

Pigsty 自动生成本地 CA 并签发证书,无需购买商业证书:

files/pki/ca/
├── ca.crt              # CA 证书(公开,分发到所有节点)
└── ca.key              # CA 私钥(⚠️ 保密!安全备份!)

/etc/pki/               # 节点上的证书目录
├── ca.crt              # CA 证书
├── server.crt          # 服务器证书
└── server.key          # 服务器私钥

⚠️ 重要:请安全备份 ca.key,丢失后需要重新签发所有证书!


边界安全

处理内外网交界处的安全策略。

HAProxy 安全

HAProxy 作为数据库流量的统一入口,提供以下安全功能:

haproxy_admin_password: 'StrongPassword123'  # 管理界面密码

安全特性

  • 健康检查与流量控制,避免脑裂
  • 连接限制与速率限制
  • 管理界面密码保护

Nginx 安全

Nginx 作为 Web 服务的统一网关,提供:

nginx_sslmode: enforce  # 强制 HTTPS
infra_portal:           # 配置各组件域名
  grafana: { domain: g.pigsty.cc }
  alertmanager: { domain: a.pigsty.cc }

安全特性

  • 统一的 HTTPS 入口,便于审计
  • 反向代理保护后端服务
  • 可集成外部认证(OAuth、LDAP)

主机安全

操作系统加固、补丁管理、最小化安装。

SELinux 配置

Pigsty 正确配置 SELinux 策略,确保 PostgreSQL 等服务正常运行:

node_selinux_mode: permissive  # disabled | permissive | enforcing
模式说明适用场景
disabled完全禁用开发环境
permissive宽容模式(记录但不阻止)生产环境推荐
enforcing强制模式高安全要求环境

操作系统加固

Pigsty 遵循最小权限原则设计:

  • 文件权限:敏感文件(如 CA 私钥)权限严格控制
  • 用户组:PostgreSQL、etcd 等服务使用专用用户运行
  • 管理员配置
node_admin_username: dba        # 管理员用户名
node_admin_sudo: nopasswd       # sudo 策略

系统更新

保持关键安全组件更新:

  • openssh:SSH 服务
  • ca-certificates:系统根证书
  • openssl:加密库

应用安全

数据库配置、认证授权、输入验证。

密码策略

密码加密算法

pg_pwd_enc: scram-sha-256  # 最安全的密码哈希算法
算法安全性兼容性说明
scram-sha-256⭐⭐⭐PostgreSQL 10+推荐,默认值
md5所有版本仅用于老旧客户端

密码强度检查

启用 passwordcheck 扩展强制密码复杂度:

pg_libs: '$libdir/passwordcheck, pg_stat_statements, auto_explain'
pg_extensions:
  - passwordcheck  # 强制密码复杂度
  - credcheck      # 额外的密码检查

密码过期

pg_users:
  - { name: dbuser_app, password: 'SecurePass123', expire_in: 365 }  # 1年后过期

HBA 规则

HBA(Host-Based Authentication)控制"谁可以从哪里连接,使用什么方式认证":

pg_default_hba_rules:
  - {user: '${dbsu}'     ,db: all         ,addr: local     ,auth: ident ,title: 'dbsu local via ident'}
  - {user: '${dbsu}'     ,db: replication ,addr: local     ,auth: ident ,title: 'dbsu repl via ident'}
  - {user: '${repl}'     ,db: replication ,addr: localhost ,auth: pwd   ,title: 'repl via localhost'}
  - {user: '${repl}'     ,db: replication ,addr: intra     ,auth: pwd   ,title: 'repl from intranet'}
  - {user: '${repl}'     ,db: postgres    ,addr: intra     ,auth: pwd   ,title: 'repl from intranet'}
  - {user: '${monitor}'  ,db: all         ,addr: localhost ,auth: pwd   ,title: 'monitor via localhost'}
  - {user: '${monitor}'  ,db: all         ,addr: infra     ,auth: pwd   ,title: 'monitor from infra'}
  - {user: '${admin}'    ,db: all         ,addr: infra     ,auth: ssl   ,title: 'admin from infra'}
  - {user: '${admin}'    ,db: all         ,addr: world     ,auth: ssl   ,title: 'admin from world'}
  - {user: '+dbrole_readonly',db: all     ,addr: localhost ,auth: pwd   ,title: 'read from localhost'}
  - {user: '+dbrole_readonly',db: all     ,addr: intra     ,auth: pwd   ,title: 'read from intranet'}
  - {user: '+dbrole_offline' ,db: all     ,addr: intra     ,auth: pwd   ,title: 'offline from intranet'}

认证方式

别名说明安全等级
ident/peerOS 用户映射⭐⭐⭐ 仅本地
pwd密码认证(scram-sha-256)⭐⭐
ssl强制 SSL + 密码⭐⭐⭐
cert客户端证书认证⭐⭐⭐⭐ 最高
deny拒绝访问-

监听地址

限制 PostgreSQL 监听的网络接口:

pg_listen: '${ip},${vip},${lo}'  # 仅监听特定 IP,而非 0.0.0.0

数据安全

加密、备份、审计、完整性保护。

备份加密

pgBackRest 支持 AES-256 加密备份:

pgbackrest_repo:
  minio:
    cipher_type: aes-256-cbc           # AES-256-CBC 加密
    cipher_pass: 'pgBR.${pg_cluster}'  # 使用集群名作为密码一部分

效果:备份文件在存储中以加密形式保存,即使存储被入侵也无法读取数据。

审计日志

PostgreSQL 审计扩展

pg_extensions:
  - pgaudit           # SQL 审计日志
  - pgauditlogtofile  # 审计日志写入文件
  - pg_auth_mon       # 认证监控
  - pg_auditor        # 审计辅助

连接日志

# 在 pg_parameters 中配置
log_connections: on        # 记录连接建立
log_disconnections: on     # 记录连接断开

慢查询日志

log_min_duration_statement: 1000  # 记录 >1s 的查询

时间点恢复(PITR)

Pigsty 默认配置 pgBackRest 支持时间点恢复:

pgbackrest_enabled: true
pgbackrest_repo:
  local:                           # 本地备份
    path: /pg/backup
    retention_full: 2
  minio:                           # 远程备份
    path: /pgbackrest
    retention_full_type: time
    retention_full: 14             # 保留 14 天

用户安全

身份认证、权限管理、行为审计。

四角色模型

Pigsty 提供开箱即用的四层权限角色:

flowchart TB
    subgraph Admin["🔴 dbrole_admin(管理员)"]
        A1["继承 dbrole_readwrite"]
        A2["可以 CREATE/DROP/ALTER(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: 'ReportPass123', roles: [dbrole_readonly] }
  - { name: dbuser_app, password: 'AppPass456', roles: [dbrole_readwrite] }
  - { name: dbuser_admin, password: 'AdminPass789', roles: [dbrole_admin] }

默认用户与密码

用户默认密码用途部署后操作
postgres无密码(仅本地)系统超级用户保持无密码
dbuser_dbaDBUser.DBA管理员用户必须修改
dbuser_monitorDBUser.Monitor监控用户必须修改
replicatorDBUser.Replicator复制用户必须修改

自动生成强密码

./configure -g  # 自动生成随机强密码

证书认证

最高安全级别,要求客户端提供有效证书:

pg_hba_rules:
  - {user: admin, db: all, addr: world, auth: cert}  # 管理员使用证书认证

ETCD 与 MinIO 安全

附属组件同样采用 RBAC 模型与 TLS 加密:

# ETCD
etcd_root_password: 'Etcd.Root.Strong'  # 必须修改

# MinIO
minio_access_key: minioadmin
minio_secret_key: 'S3User.MinIO.Strong'  # 必须修改
minio_users:
  - { access_key: pgbackrest, secret_key: 'Min10.bAckup', policy: readwrite }
  - { access_key: dba, secret_key: 'S3User.DBA.Strong', policy: consoleAdmin }

Watchdog 防护

防止脑裂,确保故障切换时主库强制关机:

patroni_watchdog_mode: required  # off | automatic | required

效果:当 Patroni 进程异常时,watchdog 强制重启节点,避免双主脑裂。


合规对照

等保三级(GB/T 22239-2019)

安全要求Pigsty 默认可配置达到实现方式
身份鉴别唯一性用户名唯一标识
口令复杂度⚠️passwordcheck 扩展
口令定期更换⚠️expire_in 属性
双因素认证⚠️证书 + 密码 (auth: cert)
访问控制HBA + 四层角色模型
最小权限原则dbrole_readonly/readwrite/admin
通信加密SSL/TLS
审计日志pgaudit + 连接日志
数据完整性pg_checksum: true
备份恢复pgBackRest + PITR

SOC 2 Type II

控制点Pigsty 支持实现方式
CC6.1 逻辑访问控制HBA + RBAC
CC6.6 传输加密SSL/TLS(可强制)
CC7.2 系统监控Prometheus + Grafana
CC9.1 业务连续性高可用 + PITR
A1.2 数据恢复pgBackRest 备份

图例:✅ 默认满足 · ⚠️ 需要额外配置


安全检查清单

部署前

  • 准备强密码(使用 ./configure -g 自动生成)
  • 规划网络分区(内网/外网 CIDR)
  • 确定 SSL 策略(自签名 CA 或外部 CA)
  • 确定是否启用防火墙

部署后(必做)

  • 修改所有默认密码
  • 验证 HBA 规则符合预期
  • 测试 SSL 连接正常
  • 配置认证失败告警
  • 安全备份 CA 私钥

增强安全(可选)

  • 启用 passwordcheck 扩展
  • 强制 SSL(pgbouncer_sslmode: require
  • 启用证书认证(auth: cert
  • 启用 pgaudit 审计日志
  • 启用备份加密
  • 启用 Patroni SSL
  • 启用 watchdog
  • 配置防火墙规则
  • 启用 SELinux 强制模式

接下来

深入了解安全配置的细节:

相关话题:


最后修改 2026-01-10: add some new concepts (9dd4edb)