安全与合规

Pigsty 中 PostgreSQL 集群的安全特性与合规能力详解

Pigsty v4.0 提供了 企业级 的 PostgreSQL 安全配置,涵盖身份鉴别、访问控制、通信加密、审计日志、数据完整性、备份恢复等多个维度。

本文档以 中国等保三级(GB/T 22239-2019)和 SOC 2 Type II 安全合规要求为参照,逐项对比验证 Pigsty 的安全能力。

每个安全维度包含两部分说明:

  • 默认配置:使用 conf/meta.yml 及默认参数时的安全合规状态 (个人使用)
  • 可用配置:通过调整 Pigsty 参数可达到的增强安全状态 (企业级配置可达)

合规对照总结

等保三级核心要求对照

要求项默认满足配置可达说明
身份唯一性角色系统保证用户唯一标识
口令复杂度⚠️可启用 passwordcheck / credcheck 强制执行密码复杂度
口令定期更换⚠️通过 expire_in/expire_at 设置用户有效期并定时刷新
登录失败处理⚠️日志中记录失败的登陆请求,可配合 fail2ban 自动封禁
双因素认证⚠️密码 + 客户端 SSL 证书认证
访问控制HBA规则 + RBAC + SELinux
最小权限分层角色体系
权限分离DBA / Monitor / 应用读/写/ETL/个人用户分离
通信加密默认启用并使用 SSL,可强制 SSL
数据完整性数据校验和默认启用
存储加密⚠️备份加密 + Percona TDE 内核支持
审计日志日志记录 DDL 与敏感操作,可记录所有操作。
日志保护文件权限隔离,VictoriaLogs 集中收集防篡改
备份恢复pgBackRest 自动备份
网络隔离防火墙 + HBA

SOC 2 Type II 控制点对照

控制点默认满足配置可达说明
CC6.1 逻辑访问控制HBA + RBAC + SELinux
CC6.2 用户注册授权Ansible声明式管理
CC6.3 最小权限分层角色
CC6.6 传输加密SSL/TLS 全局启用
CC6.7 静态加密⚠️可使用 Percona PGTDE 内核,以及 pgsodium/valut 等扩展
CC6.8 恶意软件防护⚠️最小安装 + 审计
CC7.1 入侵检测⚠️设置日志 Auth Fail 监控告警规则
CC7.2 系统监控VictoriaMetrics + Grafana
CC7.3 事件响应Alertmanager
CC9.1 业务连续性HA + 自动故障转移
A1.2 数据恢复PITR备份恢复

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


身份鉴别

等保要求:应对登录的用户进行身份标识和鉴别,身份标识具有唯一性;应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术。

SOC 2:CC6.1 - 逻辑和物理访问控制;用户身份验证机制。

用户身份标识

PostgreSQL 通过角色(Role)系统实现用户身份标识,每个用户具有唯一的角色名。

配置项默认值说明
pg_default_roles4个默认角色 + 4个系统用户预定义角色体系
pg_users[]业务用户定义列表

默认配置:Pigsty 预置了分层的角色体系:

pg_default_roles:
  - { name: dbrole_readonly  ,login: false ,comment: '全局只读角色' }
  - { name: dbrole_offline   ,login: false ,comment: '受限只读角色(离线查询)' }
  - { name: dbrole_readwrite ,login: false ,roles: [dbrole_readonly] ,comment: '全局读写角色' }
  - { name: dbrole_admin     ,login: false ,roles: [pg_monitor,dbrole_readwrite] ,comment: '对象管理角色' }
  - { name: postgres         ,superuser: true  ,comment: '系统超级用户' }
  - { name: replicator       ,replication: true,roles: [pg_monitor,dbrole_readonly] ,comment: '复制用户' }
  - { name: dbuser_dba       ,superuser: true  ,roles: [dbrole_admin] ,pgbouncer: true ,comment: '管理员用户' }
  - { name: dbuser_monitor   ,roles: [pg_monitor,dbrole_readonly] ,pgbouncer: true ,comment: '监控用户' }

可用配置:用户可通过 pg_users 定义业务用户,支持设置账户有效期、连接限制等:

pg_users:
  - name: dbuser_app
    password: 'SecurePass123!'
    roles: [dbrole_readwrite]
    expire_in: 365           # 365天后过期
    connlimit: 100           # 最大100个连接
    comment: '应用程序用户'

密码策略

配置项默认值说明
pg_pwd_encscram-sha-256密码加密算法
pg_dbsu_password''(空)数据库超级用户密码

默认配置

  • 密码加密采用 SCRAM-SHA-256 算法,这是目前 PostgreSQL 支持的最安全的密码哈希算法
  • 密码在设置时自动使用 SET log_statement TO 'none' 防止明文泄露到日志
  • 数据库超级用户 postgres 默认无密码,仅允许通过本地 Unix Socket 使用 ident 认证

可用配置

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

    pg_libs: 'passwordcheck, pg_stat_statements, auto_explain'
    
  • 使用 credcheck 扩展实现更丰富的密码策略(长度、复杂度、历史记录等)

  • 设置用户账户有效期:

    pg_users:
      - { name: temp_user, password: 'xxx', expire_in: 30 }  # 30天后过期
      - { name: temp_user, password: 'xxx', expire_at: '2025-12-31' }  # 指定日期过期
    

认证机制

配置项默认值说明
pg_default_hba_rules12条规则默认HBA认证规则
pg_hba_rules[]业务HBA规则

默认配置:Pigsty 实现了基于来源地址的分层认证策略:

pg_default_hba_rules:
  - {user: '${dbsu}'    ,db: all         ,addr: local     ,auth: ident ,title: 'dbsu本地ident认证'}
  - {user: '${dbsu}'    ,db: replication ,addr: local     ,auth: ident ,title: 'dbsu本地复制'}
  - {user: '${repl}'    ,db: replication ,addr: localhost ,auth: pwd   ,title: '复制用户本地密码认证'}
  - {user: '${repl}'    ,db: replication ,addr: intra     ,auth: pwd   ,title: '复制用户内网密码认证'}
  - {user: '${repl}'    ,db: postgres    ,addr: intra     ,auth: pwd   ,title: '复制用户内网访问postgres'}
  - {user: '${monitor}' ,db: all         ,addr: localhost ,auth: pwd   ,title: '监控用户本地密码认证'}
  - {user: '${monitor}' ,db: all         ,addr: infra     ,auth: pwd   ,title: '监控用户从基础设施节点访问'}
  - {user: '${admin}'   ,db: all         ,addr: infra     ,auth: ssl   ,title: '管理员SSL+密码认证'}
  - {user: '${admin}'   ,db: all         ,addr: world     ,auth: ssl   ,title: '管理员全局SSL+密码认证'}
  - {user: '+dbrole_readonly',db: all    ,addr: localhost ,auth: pwd   ,title: '只读角色本地密码认证'}
  - {user: '+dbrole_readonly',db: all    ,addr: intra     ,auth: pwd   ,title: '只读角色内网密码认证'}
  - {user: '+dbrole_offline' ,db: all    ,addr: intra     ,auth: pwd   ,title: '离线角色内网密码认证'}

支持的认证方法别名:

别名实际方法说明
denyreject拒绝连接
pwdscram-sha-256密码认证(默认加密)
sslscram-sha-256 + hostsslSSL + 密码认证
certcert客户端证书认证
os/ident/peerident/peer操作系统用户映射
trusttrust无条件信任(不推荐)

可用配置

  • 启用客户端证书认证实现双因素认证:

    pg_hba_rules:
      - {user: 'secure_user', db: all, addr: world, auth: cert, title: '证书认证用户'}
    
  • 限制特定用户只能从指定 IP 访问:

    pg_hba_rules:
      - {user: 'app_user', db: 'appdb', addr: '192.168.1.100/32', auth: ssl}
    

访问控制

等保要求:应授予管理用户所需的最小权限,实现管理用户的权限分离;应由授权主体配置访问控制策略。

SOC 2:CC6.3 - 基于角色的访问控制和最小权限原则。

权限分离

默认配置:Pigsty 实现了清晰的职责分离模型:

角色权限用途
postgresSUPERUSER系统超级用户,仅限本地OS认证
dbuser_dbaSUPERUSER + dbrole_admin数据库管理员
replicatorREPLICATION + pg_monitor复制和监控
dbuser_monitorpg_monitor + dbrole_readonly只读监控
dbrole_adminCREATE + dbrole_readwrite对象管理(DDL)
dbrole_readwriteINSERT/UPDATE/DELETE + dbrole_readonly数据读写
dbrole_readonlySELECT只读访问
dbrole_offlineSELECT(受限)离线/ETL查询

可用配置

  • 细粒度权限控制通过 pg_default_privileges 实现:

    pg_default_privileges:
      - GRANT USAGE      ON SCHEMAS   TO dbrole_readonly
      - GRANT SELECT     ON TABLES    TO dbrole_readonly
      - GRANT SELECT     ON SEQUENCES TO dbrole_readonly
      - GRANT EXECUTE    ON FUNCTIONS TO dbrole_readonly
      - GRANT INSERT     ON TABLES    TO dbrole_readwrite
      - GRANT UPDATE     ON TABLES    TO dbrole_readwrite
      - GRANT DELETE     ON TABLES    TO dbrole_readwrite
      - GRANT TRUNCATE   ON TABLES    TO dbrole_admin
      - GRANT CREATE     ON SCHEMAS   TO dbrole_admin
    

操作系统层面权限

配置项默认值说明
pg_dbsupostgres数据库超级用户OS账号
pg_dbsu_sudolimitsudo权限级别
node_admin_sudonopass管理员sudo权限

默认配置

  • 数据库超级用户 postgres 的 sudo 权限为 limit,仅允许执行特定的服务管理命令:
    • 启动/停止/重启 PostgreSQL 相关服务
    • 加载 softdog 内核模块(用于 watchdog)
%postgres ALL=NOPASSWD: /bin/systemctl stop postgres
%postgres ALL=NOPASSWD: /bin/systemctl start postgres
%postgres ALL=NOPASSWD: /bin/systemctl reload patroni
# ... 等受限命令

可用配置

  • pg_dbsu_sudo: none - 完全禁用 sudo 权限(最严格)
  • pg_dbsu_sudo: all - 需要密码的完整 sudo(平衡方案)
  • pg_dbsu_sudo: nopass - 无密码完整 sudo(不推荐)

行级安全策略(RLS)

PostgreSQL 原生支持行级安全策略(Row Level Security),可通过 pg_users 设置用户属性:

pg_users:
  - name: secure_user
    bypassrls: false  # 不允许绕过RLS
    roles: [dbrole_readwrite]

配合数据库内的 RLS 策略,可实现细粒度的数据访问控制。


通信安全

等保要求:应采用密码技术保证通信过程中数据的完整性和保密性。

SOC 2:CC6.6 - 数据传输安全;CC6.7 - 加密控制。

SSL/TLS 加密

配置项默认值说明
ssl (postgresql.conf)on服务端 SSL 开关
patroni_ssl_enabledfalsePatroni API SSL
pgbouncer_sslmodedisablePgBouncer 客户端 SSL
nginx_sslmodeenableNginx HTTPS

默认配置

  • PostgreSQL 服务端 默认启用 SSL,支持加密连接
  • 管理员用户(${admin})强制使用 hostssl 连接
  • 自动生成并分发 SSL 证书到所有数据库节点
# patroni.yml 中的 SSL 配置
ssl: 'on'
ssl_cert_file: '/pg/cert/server.crt'
ssl_key_file: '/pg/cert/server.key'
ssl_ca_file: '/pg/cert/ca.crt'

可用配置

  • 启用 Patroni REST API SSL 加密:

    patroni_ssl_enabled: true
    
  • 启用 PgBouncer 客户端 SSL:

    pgbouncer_sslmode: require  # 或 verify-ca, verify-full
    
  • 强制所有连接使用 SSL:

    pg_hba_rules:
      - {user: all, db: all, addr: world, auth: ssl, title: '强制SSL'}
    

PKI 证书管理

配置项默认值说明
cert_validity7300d证书有效期(20年)
CA 证书有效期100年自签名 CA 有效期

默认配置

Pigsty 使用自建 PKI 体系,自动管理证书生命周期:

files/pki/
├── ca/           # CA 根证书
│   ├── ca.crt    # CA 公钥证书
│   └── ca.key    # CA 私钥
├── csr/          # 证书签名请求
├── pgsql/        # PostgreSQL 集群证书
├── etcd/         # ETCD 集群证书
├── infra/        # 基础设施节点证书
└── minio/        # MinIO 证书
  • 每个 PostgreSQL 集群共享一个私钥,每个实例有独立的证书
  • 证书包含正确的 SAN(Subject Alternative Name)配置
  • CA 证书自动分发到 /etc/pki/ca.crt/pg/cert/ca.crt

可用配置

  • 使用外部 CA 签发的证书:将证书放入 files/pki/ 目录,设置 ca_create: false
  • 调整证书有效期:cert_validity: 365d(1年)

ETCD 通信安全

ETCD 作为 Patroni 的 DCS(分布式配置存储),默认使用 mTLS(双向 TLS)认证:

etcd3:
  hosts: '10.10.10.10:2379'
  protocol: https
  cacert: /pg/cert/ca.crt
  cert:   /pg/cert/server.crt
  key:    /pg/cert/server.key
  username: 'pg-meta'        # 集群专用账号
  password: 'pg-meta'        # 默认与集群名相同

数据加密

等保要求:应采用密码技术保证重要数据在存储过程中的保密性。

SOC 2:CC6.1 - 数据加密存储。

备份加密

配置项默认值说明
cipher_typeaes-256-cbc备份加密算法(MinIO仓库)
cipher_passpgBackRest加密密码(需修改)

默认配置

  • 本地备份(pgbackrest_method: local)默认不加密
  • 远程对象存储备份支持 AES-256-CBC 加密

可用配置

启用备份加密(推荐用于远程存储):

pgbackrest_method: minio
pgbackrest_repo:
  minio:
    type: s3
    s3_endpoint: sss.pigsty
    s3_bucket: pgsql
    s3_key: pgbackrest
    s3_key_secret: S3User.Backup
    cipher_type: aes-256-cbc
    cipher_pass: 'YourSecureBackupPassword!'  # 务必修改!
    retention_full_type: time
    retention_full: 14

透明数据加密(TDE)

PostgreSQL 社区版本不支持原生 TDE,但可通过以下方式实现存储加密:

  • 文件系统级加密:使用 LUKS/dm-crypt 加密存储卷
  • pgsodium 扩展:支持列级加密
# 启用 pgsodium 列级加密
pg_libs: 'pgsodium, pg_stat_statements, auto_explain'

# 自定义加密密钥(64位十六进制)
pgsodium_key: 'a1b2c3d4e5f6...'  # 或使用外部密钥管理脚本

数据完整性校验

配置项默认值说明
pg_checksumtrue数据校验和

默认配置

  • 数据校验和默认启用,可检测存储层数据损坏
  • crit.yml 模板强制启用数据校验和
  • 支持 pg_rewind 进行故障恢复
pg_checksum: true  # 强烈建议保持启用

安全审计

等保要求:应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计。

SOC 2:CC7.2 - 系统监控和日志记录;CC7.3 - 安全事件检测。

数据库审计日志

配置项默认值说明
logging_collectoron启用日志收集器
log_destinationcsvlogCSV格式日志
log_statementddl记录DDL语句
log_min_duration_statement100ms慢查询阈值
log_connectionsauthorization (PG18) / on连接审计
log_disconnectionson (crit模板)断开连接审计
log_checkpointson检查点日志
log_lock_waitson锁等待日志
log_replication_commandson复制命令日志

默认配置

# oltp.yml 模板的审计配置
log_destination: csvlog
logging_collector: 'on'
log_directory: /pg/log/postgres
log_filename: 'postgresql-%a.log'    # 按星期轮转
log_file_mode: '0640'                # 限制日志文件权限
log_rotation_age: '1d'
log_truncate_on_rotation: 'on'
log_checkpoints: 'on'
log_lock_waits: 'on'
log_replication_commands: 'on'
log_statement: ddl                   # 记录所有DDL
log_min_duration_statement: 100      # 记录慢查询 >100ms

可用配置(crit.yml 关键业务模板)

# crit.yml 提供更全面的审计
log_connections: 'receipt,authentication,authorization'  # PG18完整连接审计
log_disconnections: 'on'             # 记录断开连接
log_lock_failures: 'on'              # 记录锁失败(PG18)
track_activity_query_size: 32768     # 完整查询记录

启用 pgaudit 扩展实现细粒度审计:

pg_libs: 'pgaudit, pg_stat_statements, auto_explain'
pg_parameters:
  pgaudit.log: 'all'
  pgaudit.log_catalog: 'on'
  pgaudit.log_relation: 'on'

性能与执行审计

扩展默认启用说明
pg_stat_statementsSQL统计信息
auto_explain慢查询执行计划
pg_wait_sampling配置可用等待事件采样

默认配置

pg_libs: 'pg_stat_statements, auto_explain'

# auto_explain 配置
auto_explain.log_min_duration: 1s    # 记录>1s的查询计划
auto_explain.log_analyze: 'on'
auto_explain.log_verbose: 'on'
auto_explain.log_timing: 'on'

# pg_stat_statements 配置
pg_stat_statements.max: 10000
pg_stat_statements.track: all

日志集中管理

默认配置

  • PostgreSQL 日志:/pg/log/postgres/
  • Patroni 日志:/pg/log/patroni/
  • PgBouncer 日志:/pg/log/pgbouncer/
  • pgBackRest 日志:/pg/log/pgbackrest/

可用配置

通过 Vector 将日志发送到 VictoriaLogs 集中存储:

# 日志自动收集到 VictoriaLogs
vlogs_enabled: true
vlogs_port: 9428
vlogs_options: >-
  -retentionPeriod=15d
  -retention.maxDiskSpaceUsageBytes=50GiB

网络安全

等保要求:应在网络边界部署访问控制设备,对进出网络的数据流实现访问控制。

SOC 2:CC6.1 - 边界保护和网络安全。

防火墙配置

配置项默认值说明
node_firewall_modezone防火墙模式
node_firewall_intranetRFC1918网段内网CIDR
node_firewall_public_port[22,80,443,5432]公网开放端口

默认配置

node_firewall_mode: zone             # 启用区域防火墙
node_firewall_intranet:              # 定义内网地址
  - 10.0.0.0/8
  - 192.168.0.0/16
  - 172.16.0.0/12
node_firewall_public_port:           # 公网开放端口
  - 22    # SSH
  - 80    # HTTP
  - 443   # HTTPS
  - 5432  # PostgreSQL(谨慎开放)

防火墙规则:

  • 内网地址自动加入 trusted 区域
  • 仅指定端口对外开放
  • 支持 firewalld(RHEL系)和 ufw(Debian系)

可用配置

  • node_firewall_mode: off - 禁用防火墙(不推荐)
  • node_firewall_mode: none - 不修改现有配置
  • 移除5432端口,仅允许内网访问数据库

服务访问控制

配置项默认值说明
pg_listen0.0.0.0PostgreSQL监听地址
patroni_allowlistinfra + clusterPatroni API白名单

默认配置

Patroni REST API 仅允许来自以下地址的访问:

# 自动计算的白名单
pg_allow_list = [admin_ip] + pg_cluster_members + groups["infra"]

可用配置

限制 PostgreSQL 只监听特定网卡:

pg_listen: '${ip}'  # 仅监听主机IP,不监听0.0.0.0

SELinux

配置项默认值说明
node_selinux_modepermissiveSELinux模式

默认配置:SELinux 设为 permissive 模式(记录但不阻止)

可用配置

node_selinux_mode: enforcing  # 强制模式(需要额外配置策略)

可用性与恢复

等保要求:应提供数据备份与恢复功能;应提供自动故障恢复功能。

SOC 2:CC9.1 - 业务连续性;A1.2 - 数据备份和恢复。

高可用架构

配置项默认值说明
patroni_enabledtrue启用Patroni HA
pg_rto30恢复时间目标(秒)
pg_rpo1048576恢复点目标(1MB)

默认配置

  • Patroni 自动故障检测与切换(RTO < 30秒)
  • 异步复制,最大数据丢失 1MB(RPO)
  • failsafe_mode: true 防止脑裂

可用配置

启用同步复制实现 RPO = 0:

pg_rpo: 0                    # 零数据丢失
pg_conf: crit.yml            # 使用关键业务模板
# crit.yml 自动启用 synchronous_mode: true

启用硬件看门狗:

patroni_watchdog_mode: automatic  # 或 required

备份恢复

配置项默认值说明
pgbackrest_enabledtrue启用pgBackRest
pgbackrest_methodlocal备份存储方式
retention_full2保留完整备份数量

默认配置

pgbackrest_enabled: true
pgbackrest_method: local
pgbackrest_repo:
  local:
    path: /pg/backup
    retention_full_type: count
    retention_full: 2            # 保留2个完整备份

可用配置

异地备份到对象存储:

pgbackrest_method: minio
pgbackrest_repo:
  minio:
    type: s3
    s3_endpoint: sss.pigsty
    s3_bucket: pgsql
    cipher_type: aes-256-cbc     # 加密备份
    retention_full_type: time
    retention_full: 14           # 保留14天
    block: y                     # 块级增量备份
    bundle: y                    # 小文件合并

定时备份策略:

node_crontab:
  - '00 01 * * * postgres /pg/bin/pg-backup full'   # 每日1点全量备份
  - '00 */4 * * * postgres /pg/bin/pg-backup diff'  # 每4小时差异备份

入侵防范

等保要求:应遵循最小安装的原则,仅安装需要的组件和应用程序;应能够检测到对重要节点进行入侵的行为,并在发生严重入侵事件时提供报警。

SOC 2:CC6.8 - 恶意软件防护;CC7.1 - 入侵检测。

最小化安装

默认配置

  • 仅安装必要的 PostgreSQL 组件和扩展
  • 通过 pg_packagespg_extensions 精确控制安装内容
  • 生产系统不安装开发工具和调试符号
pg_packages: [ pgsql-main, pgsql-common ]  # 最小化安装
pg_extensions: []                          # 按需添加扩展

安全扩展

Pigsty 提供以下 安全相关扩展,可按需安装启用:

扩展/包版本描述
passwordcheck_cracklib3.1.0使用 cracklib 加固 PG 用户密码
supautils3.0.2用于在云环境中确保数据库集群的安全
pgsodium3.1.9表数据加密存储 TDE
supabase_vault / pg_vault0.3.1在 Vault 中存储加密凭证的扩展 (supabase)
pg_session_jwt0.4.0使用JWT进行会话认证
anon2.5.1数据匿名化处理工具
pgsmcrypto0.1.1为PostgreSQL提供商密算法支持:SM2,SM3,SM4
pg_enigma0.5.0PostgreSQL 加密数据类型
pgaudit18.0提供审计功能
pgauditlogtofile1.7.6pgAudit 子扩展,将审计日志写入单独的文件中
pg_auditor0.2审计数据变更并提供闪回能力
logerrors2.1.5用于收集日志文件中消息统计信息的函数
pg_auth_mon3.0监控每个用户的连接尝试
pg_jobmon1.4.1记录和监控函数
credcheck4.2明文凭证检查器
pgcryptokey0.85PG密钥管理
login_hook1.7在用户登陆时执行login_hook.login()函数
set_user4.2.0增加了日志记录的 SET ROLE
pg_snakeoil1.4PostgreSQL动态链接库反病毒功能
pgextwlist1.19PostgreSQL扩展白名单功能
sslutils1.4使用SQL管理SSL证书
noset0.3.0阻止非超级用户使用SET/RESET设置变量
pg_tde1.0Percona加密存储引擎
sepgsql-基于SELinux标签的强制访问控制
auth_delay-在返回认证失败前暂停一会,避免爆破
pgcrypto1.3实用加解密函数
passwordcheck-用于强制拒绝修改弱密码的扩展

安装所有安全扩展包:

pg_extensions: [ pg18-sec ]  # 安装安全类扩展组

告警与监控

默认配置

  • VictoriaMetrics + Alertmanager 提供监控告警
  • 预置 PostgreSQL 告警规则
  • Grafana 可视化仪表板

关键安全相关告警:

  • 认证失败次数过多
  • 复制延迟过大
  • 备份失败
  • 磁盘空间不足
  • 连接数耗尽

最后修改 2025-12-20: new post on pgsql/arch (19aad69)