这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

安全合规

身份认证、访问控制、加密通信、审计日志,满足等保三级与 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 备份

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


安全检查清单

部署前

  • 准备强密码(使用密码管理器生成)
  • 规划网络分区(内网/外网 CIDR)
  • 确定 SSL 策略(自签名/外部 CA)

部署后(必做)

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

定期维护

  • 审计用户权限
  • 检查过期账户
  • 更新证书(如需要)
  • 检查审计日志

快速配置示例

生产环境安全配置

# 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

安全检查清单

部署前

  • 准备好要使用的密码(使用密码管理器生成)
  • 规划网络分区(内网/外网 CIDR)
  • 确定 SSL 证书策略(自签名/外部 CA)

部署后

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

定期维护

  • 审计用户权限
  • 检查过期账户
  • 更新证书(如需要)
  • 检查审计日志

安全相关参数

参数 说明
pg_pwd_enc 密码加密算法
pg_default_hba_rules 默认 HBA 规则
pg_hba_rules 自定义 HBA 规则
pg_default_roles 默认角色定义
patroni_ssl_enabled Patroni SSL 开关
pgbouncer_sslmode Pgbouncer SSL 模式
node_firewall_mode 防火墙模式

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'  # 指定日期过期

证书认证

证书认证提供比密码更强的安全性,可实现双因素认证。

工作原理

  1. 客户端持有由 CA 签发的证书
  2. 证书的 CN(Common Name)字段对应数据库用户名
  3. 服务器验证证书有效性并提取用户名

配置步骤

第一步:签发客户端证书

# 使用 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

客户端需要同时提供:

  1. 有效的客户端证书
  2. 正确的密码

登录失败处理

日志记录

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 导入系统钥匙串,并设置为"信任"。


安全建议

  1. 保护 CA 私钥ca.key 是最重要的安全资产,应加密备份

  2. 使用 verify-full:生产环境客户端应使用 sslmode=verify-full

  3. 定期轮换:虽然证书有效期很长,但建议定期轮换

  4. 监控证书过期:配置告警监控证书即将过期

  5. 强制 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 角色系统保证用户名唯一
口令复杂度 ⚠️ 启用 passwordcheckcredcheck 扩展
口令定期更换 ⚠️ 使用 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;"

合规文档

进行合规审计时,可能需要提供以下文档:

  1. 架构文档:系统架构图、网络拓扑图
  2. 配置清单pigsty.yml 配置文件
  3. 用户清单:用户列表、角色分配
  4. 审计日志:PostgreSQL 日志、操作日志
  5. 备份记录:备份策略、恢复测试记录
  6. 监控告警:告警规则、响应流程