PostgreSQL安全权限体系详解(第二期):端到端加密传输与强认证体系

0 阅读20分钟

PostgreSQL安全权限体系详解(第二期):端到端加密传输与强认证体系

引言

在上一期文章中,我们系统梳理了PostgreSQL的角色、权限体系与最小权限原则,完成了安全体系的第一层——基础访问控制的构建。然而,仅有访问控制还远远不够——当数据在客户端与服务器之间传输时,如果缺乏加密保护,用户名、密码乃至敏感业务数据都可能暴露在网络中,面临中间人攻击、流量嗅探等严重风险。

本期作为系列第二期,我们将聚焦于 认证与传输安全,涵盖从客户端连接到服务器身份验证的全链路保障。这是任何生产级数据库安全体系的“第一道大门”,也是合规审计的重点关注领域。

系列回顾与预告

  • 第一期:角色与权限体系、最小权限原则、权限管理最佳实践 ✅
  • ****第二期(本期):认证方式配置(pg_hba.conf详解)、SSL/TLS加密传输
  • 第三期:行级安全(RLS)深度实践、多租户数据隔离
  • 第四期:审计日志(pgAudit)、备份加密、透明数据加密(TDE)
  • 第五期:综合场景实战(多租户SaaS、金融系统、企业内网完整安全方案)

本文将以 “加密传输”和“强身份认证” 两条主线展开,从原理到实操,帮助读者构建一个既符合安全合规要求、又经得起实战检验的数据库连接安全体系。

一、认证体系全景:从连接到授权的完整链路

在深入具体配置之前,我们首先需要理解PostgreSQL管理客户端连接的完整链路。这条链路可以分为四个关键环节,任何一个环节的薄弱都可能导致安全隐患:

1.1 认证链路的四个关键环节

第一环:网络监听配置(postgresql.conf)

listen_addresses 参数决定PostgreSQL监听哪些网络接口。默认值为 localhost(只监听本地),这是安全的选择。生产环境务必避免使用 '*' 暴露到公网,除非使用了防火墙和SSL双重保护

-- postgresql.conf
listen_addresses = '192.168.1.100'   -- 只监听特定内网IP
port = 5432

第二环:认证规则文件(pg_hba.conf)

这是客户端接入认证的“总开关”,控制允许哪些IP、以什么身份、用什么认证方法连接。每一行记录对应一条认证规则,规则之间按顺序匹配,首条匹配的规则生效。

第三环:密码存储加密(pg_authid系统表)

用户的密码哈希存储在 pg_authid.rolpassword 中,当前推荐使用SCRAM-SHA-256哈希算法。加密算法的选择至关重要——弱算法(如MD5)在今天的计算能力下已被证明是可破解的。

第四环:用户角色权限(已在第一期详述)

认证通过后的操作权限由角色和权限体系控制,形成纵深防御。

1.2 认证方法全景对比

PostgreSQL支持多种认证方法,从完全不设防的 trust 到高度安全的 cert(客户端证书认证),安全强度差异巨大:

认证方法安全级别适用场景说明
trust❌ 极低仅限本地管理维护无条件允许连接,仅适用于 localhost 且要求底层网络完全可信及操作系统账号严格控制
peer⚠️ 低本地连接通过操作系统用户匹配验证,安全性依赖操作系统身份验证,仅适用于local连接
password❌ 极低不推荐明文密码传输,立即被网络嗅探窃听,禁止使用
md5⚠️ 中低(已过时)兼容老旧系统哈希算法已被证明存在碰撞风险,且密码哈希在网络中传输可被捕获,逐步淘汰
scram-sha-256✅ 高推荐生产环境行业标准强认证算法,密码哈希在网络中传输,并提供更强的抗破解能力
ldap / radius✅ 高企业统一认证对接企业已有身份目录,集中管理账号
cert✅ 极高高安全等级金融/政务系统双向证书认证,客户端也需持有CA签发的证书
gss / sspi✅ 高Windows/Kerberos环境使用Kerberos票据认证,适合内网统一身份认证

核心建议:生产环境统一使用 scram-sha-256 作为密码认证方法,高敏感场景叠加 cert(客户端证书认证) 实现双因子认证。

二、pg_hba.conf:认证规则的“控制中枢”

pg_hba.conf(Host-Based Authentication)是PostgreSQL客户端接入认证的核心配置文件,通常位于数据目录(如 /var/lib/pgsql/data//etc/postgresql/xx/main/)下。任何对该文件的修改都需要执行 pg_ctl reloadSELECT pg_reload_conf() 才能生效,且修改前建议先用 pg_hba.conf 的完整备份或版本控制记录变更,便于回滚与审计。

2.1 规则格式精要

# TYPE  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]

2.2 详细字段一表速查

字段含义常用取值与示例
TYPE连接类型local(Unix域套接字)、host(TCP/IP,加密或非加密均可)、hostssl(强制SSL加密)、hostnossl(禁用SSL)
DATABASE目标数据库数据库名、allreplication。使用 all 时需谨慎,会匹配所有数据库包括 postgrestemplate0template1
USER目标用户用户名、all+组名(组内所有用户)。注意 +组名 匹配的是角色成员关系(PostgreSQL的ROLE继承体系)
ADDRESS来源地址IPv4(192.168.1.0/24)、IPv6、samehostsamenet。建议使用最严格的CIDR表示法,避免使用整个 /0::/0 开放互联网访问
METHOD认证方法见上节表格。推荐 scram-sha-256,高安全场景使用 cert
OPTIONS可选参数clientcert=verify-fullmap=mapnameclientcert 可配合 scram-sha-256 实现“密码+证书”双因子验证

2.3 安全配置模板:生产环境强制加密配置

以下是一套生产环境推荐的安全配置模板,遵循 “最小暴露面、强制加密、强认证” 原则:

# TYPE    DATABASE    USER        ADDRESS                 METHOD

# 1. 本地管理通道(仅限超级用户)
local     all         postgres                            scram-sha-256
local     all         all                                 reject

# 2. 强制SSL加密的远程连接(对接标准应用账号)
hostssl   app_db       app_user    192.168.10.0/24         scram-sha-256

# 3. 只读副本的复制连接(必须走SSL)
hostssl   replication  replica_user 192.168.20.0/24       scram-sha-256

# 4. DBA安全通道(IP最严格限制+证书认证)
hostssl   all         dba_user    10.88.88.88/32          cert

# 5. 明确拒绝所有未匹配连接(安全兜底)
host      all         all         0.0.0.0/0               reject
host      all         all         ::/0                    reject

⚠️ 重要提醒:上述配置仅为示例。ADDRESS 段的IP网段必须按实际网络环境替换,确保不会因为网段过大而引入风险;reject 兜底规则只匹配明确 host 的连接,不会影响之前已匹配的 hostssl 规则。

2.4 生产环境安全规则书写要点

  1. 禁用超级用户远程访问:生产环境禁止配置 hostssl ... postgres ... 规则。超级用户应仅限本地管理,日常运维使用专用 dba_user 角色。
  2. 最小化暴露面ADDRESS 字段尽可能细化到具体IP或最小CIDR网段。即使内网环境,也应按业务模块划分独立网段。
  3. 强制加密:远程连接统一使用 hostssl,确保传输层加密。如果存在遗留系统必须允许非SSL连接,应另行规划隔离网络环境。
  4. 规则顺序有讲究:pg_hba.conf 按顺序逐条匹配,首次匹配即生效。因此最严格的规则应放在文件前面,通用规则放在后面,reject 规则作为兜底放在最后。
  5. 配置变更后重载验证:修改完配置文件,执行 SELECT pg_reload_conf(); 或系统命令 pg_ctl reload 使配置生效,然后通过 psql 从各IP测试认证是否按预期工作,避免生产故障。

2.5 认证常见故障排查

错误信息原因解决方案
FATAL: no pg_hba.conf entry for host "x.x.x.x"没有匹配的认证规则检查ADDRESS是否覆盖了客户端IP,确认规则顺序未被过早匹配,使用psql -h <client_ip> 在服务器端本地测试参数
FATAL: password authentication failed for user "xxx"密码错误或认证方法不一致确认密码正确,检查数据库中的密码哈希算法(SELECT rolpassword FROM pg_authid WHERE rolname='xxx';)与pg_hba.conf中的METHOD是否兼容
FATAL: connection requires a valid client certificateSSL证书认证失败检查客户端证书文件路径和权限,确认pg_hba.conf中使用cert方法且服务器配置了正确的CA证书
FATAL: no SSL connections allowed客户端未使用SSL但服务器要求SSL修改客户端连接字符串添加sslmode=require,或在pg_hba.conf中将hostssl改为host(不推荐)
FATAL: database "xxx" does not exist数据库名拼写错误检查DATABASE字段配置,确认目标数据库已创建
FATAL: role "xxx" does not exist用户角色不存在先创建对应的LOGIN ROLE,或检查USER字段写法

三、SSL/TLS 加密传输:从原理到生产实践

仅依靠认证规则不足以保障传输安全——密码和认证信息在网络中仍然是明文传输的(即使使用scram-sha-256,密码哈希在网络中传输虽然无法直接还原原始密码,但仍存在哈希被捕获用于重放攻击的风险,因此必须结合SSL/TLS实现链路层加密)。SSL/TLS加密正是在客户端与服务器之间建立安全隧道,保护整个通信链路。

3.1 SSL/TLS与连接类型的矩阵对应

连接类型加密状态适用场景
localUnix域套接字(不经过网络,无需SSL)本地管理工具、运维脚本、备份脚本等。虽然不走网络,仍需通过文件系统权限控制访问
hostnossl明文TCP/IP仅限完全隔离的信任网络或测试环境
host可为明文或SSL(根据客户端选择协商)过渡环境,不推荐生产使用
hostssl强制SSL加密所有生产远程连接推荐标准

3.2 SSL/TLS配置全景图

服务器端启用SSL(postgresql.conf)

ssl = on                         -- 开启SSL
ssl_cert_file = 'server.crt'    -- 服务器证书
ssl_key_file = 'server.key'     -- 服务器私钥(权限600)
ssl_ca_file = 'ca.crt'          -- 根证书(用于验证客户端证书)
ssl_crl_file = 'crl.pem'        -- 证书吊销列表(可选)
ssl_min_protocol_version = 'TLSv1.2'   -- 最低TLS版本,当前标准TLSv1.2/1.3;TLSv1.0/1.1已被证明存在漏洞,不应在生产使用
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'  -- 加密套件

客户端连接配置(sslmode关键参数)

sslmode加密证书验证适用场景
disable仅测试环境
allow可能不推荐
prefer优先有旧版客户端的环境
require仅防窥探,无防中间人能力
verify-ca✅(验证CA)内部服务间调用 (推荐最低标准)
verify-full✅(CA+主机名)金融/监管/合规场景强制要求

核心建议:生产环境客户端至少配置 sslmode=verify-ca,高安全等级业务强制要求 verify-full 并对主机名进行校验。如果必须在公网暴露PostgreSQL端口,务必配置verify-full 并严格限制IP访问。

3.3 完整七步配置指南

以下是从零开始配置SSL/TLS加密的完整流程。

第一步:确认OpenSSL环境

openssl version
# 建议使用 OpenSSL 1.1.1 或更高版本,以支持 TLSv1.3

第二步:生成自签名CA证书(仅测试环境)

# 生成CA私钥
openssl genrsa -out ca.key 4096

# 生成CA根证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
  -out ca.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=MyOrg Root CA"

第三步:生成服务器证书

# 生成服务器私钥
openssl genrsa -out server.key 2048

# 生成证书签名请求(CN必须是服务器域名或IP)
openssl req -new -key server.key -out server.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=db.example.com"

# 使用CA签名(配置subjectAltName扩展支持多域名)
cat > server-ext.cnf << EOF
subjectAltName = DNS:db.example.com,DNS:db.internal.com,IP:192.168.1.100
EOF

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out server.crt -days 365 -sha256 \
  -extfile server-ext.cnf -extensions subjectAltName

# 设置正确权限
chmod 600 server.key

第四步:配置postgresql.conf

ssl = on
ssl_cert_file = 'server.crt'      -- 放置于数据目录,如 '/var/lib/pgsql/data/'
ssl_key_file = 'server.key'       -- 同上目录
ssl_ca_file = 'ca.crt'            -- 如果需要客户端证书验证
ssl_min_protocol_version = 'TLSv1.2'
ssl_ciphers = 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'

第五步:配置pg_hba.conf强制SSL

hostssl    all    all    192.168.0.0/16    scram-sha-256

第六步:重载配置并验证

SELECT pg_reload_conf();

-- 查看SSL是否启用
SHOW ssl;

-- 查看当前连接的加密状态
SELECT pid, usename, application_name, client_addr, ssl, ssl_version, ssl_cipher
FROM pg_stat_ssl
JOIN pg_stat_activity USING (pid);

第七步:客户端配置示例

# psql命令行
psql "host=db.example.com port=5432 dbname=mydb user=app_user \
      sslmode=verify-full sslrootcert=ca.crt"

# JDBC URL
jdbc:postgresql://db.example.com:5432/mydb?ssl=true&sslmode=verify-full&sslrootcert=ca.crt

# Python (psycopg2)
conn = psycopg2.connect(
    host="db.example.com",
    sslmode="verify-full",
    sslrootcert="ca.crt"
)

3.4 证书续期与轮换流程

证书过期是生产环境中常见的问题,建议建立以下自动化流程:

  1. 监控告警:通过监控系统(Prometheus、Zabbix等)定期检查证书有效期,在过期前30天、15天、7天分级告警。
  2. 生成新证书:在CA环境下生成新证书,确保新旧证书有重叠有效期(至少15天)。
  3. 滚动替换
    • 将新证书(server_new.crt)和私钥传输到数据库服务器,放置于数据目录。
    • 修改postgresql.conf中的证书相关路径指向新文件。
    • 执行 SELECT pg_reload_conf(); 使配置生效(无需重启数据库)。
    • 验证新连接使用新证书后,保留旧证书至少一个监控周期作为回退。
  4. 撤销旧证书:将旧证书加入到 ssl_crl_file 对应的吊销列表中,强制客户端更新。

3.5 云数据库SSL配置差异

各大云厂商对SSL的支持有所不同,需特别关注:

云厂商SSL默认状态证书来源特殊说明
阿里云RDS可选开启云端证书(可下载)提供CA证书下载,需配置sslmode=verify-ca
华为云RDS默认开启内置证书服务端默认开启SSL加密,加密取决于客户端SSL配置
Azure Database强制开启内置CA默认强制TLS 1.2/1.3,拒绝TLS 1.0/1.1
AWS RDS可选开启rds-ca-rsa2048-g1等提供多种CA证书选项,支持证书轮换

云环境核心原则:使用云厂商提供的CA证书配置 sslmode=verify-caverify-full,并将证书随应用代码纳入版本管理。

四、高级认证:证书双向认证(cert)

对于金融系统、政务平台等 高安全等级场景,单纯的密码认证可能不足以满足合规要求。cert 方法利用TLS协议的客户端证书特性,实现“你有证书才准入”的强身份认证。

4.1 cert认证工作原理

客户端                          服务器
   |                              |
   |--- 建立TLS连接 ------------->|
   |                              |
   |--- 发送客户端证书 ---------->|
   |                              |--- 使用CA证书验证客户端证书
   |                              |--- 检查证书中的CN与请求的数据库用户匹配
   |                              |--- 返回认证结果
   |<--- 认证通过/失败 -----------|

4.2 完整配置流程

服务器端配置

-- postgresql.conf
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'ca.crt'           -- 必须配置,用于验证客户端证书

-- pg_hba.conf(明确要求cert认证,并映射证书CN到数据库用户)
hostssl   all    all   192.168.0.0/16    cert
hostssl   all    all   192.168.0.0/16    cert clientcert=verify-full

客户端证书生成

# 生成客户端私钥
openssl genrsa -out client.key 2048

# 生成客户端证书签名请求(CN必须与数据库用户名一致)
openssl req -new -key client.key -out client.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=app_user"

# 使用CA签名(与服务器相同的CA)
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out client.crt -days 365 -sha256

客户端连接配置

psql "host=db.example.com port=5432 dbname=mydb user=app_user \
      sslmode=verify-full sslrootcert=ca.crt \
      sslcert=client.crt sslkey=client.key"

4.3 cert + 密码双因子认证

对于极高安全场景,可以同时要求证书认证 密码认证,实现双因子验证:

hostssl   all    all   192.168.0.0/16    scram-sha-256  clientcert=verify-full

此时,客户端必须同时提供有效的客户端证书和正确的数据库密码才能登录,安全性达到金融级标准。

五、密码加密算法深度解析

5.1 为什么必须淘汰MD5?

MD5在设计时并非为密码存储而优化,在现代计算能力下已可以被高效攻击。PostgreSQL中的MD5认证机制其实传递的是“salt+hash over the network”,攻击者即使捕获通信包也能通过线下彩虹表或暴力破解尝试还原密码。相比之下,SCRAM-SHA-256通过迭代哈希计算(默认4096次)和随机盐机制,大幅提升了破解难度。

5.2 迁移到SCRAM-SHA-256的完整路径

步骤一:修改密码加密算法配置

-- postgresql.conf
password_encryption = 'scram-sha-256'

-- 重载配置
SELECT pg_reload_conf();

步骤二:为所有用户重置密码(使新加密算法生效)

ALTER USER app_user PASSWORD 'new_strong_password';
-- 或保留原密码但重设加密方式(密码本身不变)
ALTER USER app_user PASSWORD 'existing_password';

步骤三:检查密码加密状态

SELECT rolname, rolpassword 
FROM pg_authid 
WHERE rolpassword LIKE 'SCRAM-SHA-256%' 
   OR rolpassword LIKE 'md5%';
-- 确保所有业务账号均显示为 SCRAM-SHA-256

步骤四:更新pg_hba.conf中的认证方法

# 替换原有的 md5 为 scram-sha-256
hostssl   app_db   app_user   192.168.0.0/16    scram-sha-256

步骤五:灰度验证与回退方案

在生产环境中,可通过以下方式实现平滑迁移:

  • 在pg_hba.conf中为同一用户同时保留两条规则(先scram-sha-256md5),支持新旧客户端共存。
  • 观察日志确认所有客户端成功切换到SCRAM后,再移除md5规则。
  • 为关键业务准备快速回退方案(恢复pg_hba.conf备份并重载)。

六、安全验证与监控

6.1 自动化安全配置检查脚本

将以下检查集成到CI/CD或定期巡检中:

-- 1. 验证所有远程连接强制使用SSL
SELECT EXISTS (
    SELECT 1 FROM pg_hba_file_rules 
    WHERE type IN ('host', 'hostnossl') 
      AND auth_method NOT IN ('reject', 'trust')
);

-- 期望返回 false(无未加密的非拒绝规则)

-- 2. 检查是否存在弱认证方法
SELECT type, database, user_name, address, auth_method 
FROM pg_hba_file_rules 
WHERE auth_method IN ('trust', 'password', 'md5');

-- 期望为空

-- 3. 检查SSL配置状态
SHOW ssl;                    -- 应为 on
SHOW ssl_min_protocol_version; -- 应为 TLSv1.2 或更高

-- 4. 检查当前连接的加密情况
SELECT ssl, count(*) 
FROM pg_stat_ssl 
JOIN pg_stat_activity USING (pid) 
WHERE backend_type = 'client backend' 
GROUP BY ssl;

-- 期望非SSL连接为0

6.2 典型不安全配置清单(禁止项)

配置项不安全示例改为
信任认证host all all 0.0.0.0/0 trust删除该规则,改用scram-sha-256cert
明文密码host all all 0.0.0.0/0 password使用scram-sha-256
过时TLSssl_min_protocol_version = 'TLSv1'升级到TLSv1.2及以上
MD5密码password_encryption = md5改为scram-sha-256
超级用户远程hostssl all postgres 0.0.0.0/0 scram-sha-256删除该规则,优先使用角色继承
SSL关闭ssl = off改为ssl = on并配置证书

6.3 安全事件响应流程

当检测到认证异常或可疑连接时,建议建立以下标准响应流程:

  1. 快速定位:通过PostgreSQL日志(配置了log_connections=on)定位来源IP、用户名和时间。
  2. 遏制措施:在pg_hba.conf中临时添加拒绝规则(host all all <malicious_ip>/32 reject),执行pg_reload_conf()阻断。
  3. 分析取证:检查pg_stat_ssl确认可疑连接是否使用了加密,分析pg_stat_activity中的查询历史。
  4. 修复加固:根据根本原因强化认证配置,轮换受影响账号的密码或证书。
  5. 复盘优化:更新安全配置检查清单,完善监控告警规则。

七、最佳实践汇总

7.1 认证配置黄金法则

  1. 强制加密不可妥协:所有远程连接必须同时满足三个条件:hostssl + sslmode=verify-ca + ssl_min_protocol_version = TLSv1.2
  2. 淘汰弱认证方法trustpasswordmd5 禁止在生产环境使用
  3. 密码算法升级到SCRAMpassword_encryption = scram-sha-256
  4. 最小暴露面原则listen_addresses 限定最小范围,ADDRESS 精确到最少CIDR,禁止超级用户远程连接
  5. 自动化配置检查:将6.1节中的检查脚本纳入CMDB或安全基线系统,确保配置偏离时及时告警

7.2 配置检查清单

检查项验证方法健康标准
密码加密算法SHOW password_encryption;scram-sha-256
SSL是否启用SHOW ssl;on
最低TLS版本SHOW ssl_min_protocol_version;TLSv1.2 或更高
pg_hba.conf禁止trustSELECT ... WHERE auth_method='trust';返回空
pg_hba.conf禁止md5SELECT ... WHERE auth_method='md5';返回空
远程超级用户检查pg_hba.conf中USER postgres的远程规则不允许存在
证书有效期openssl x509 -in server.crt -noout -dates距离过期>30天

7.3 常见陷阱与避坑指南

陷阱后果解决方案
SSL证书使用IP地址作为CN,生产环境通过域名访问主机名校验失败证书CN使用域名,同时在subjectAltName中包含IP地址
私钥文件权限过大(如644)PostgreSQL拒绝启动chmod 600 server.key
仅配置hostssl规则但未开启SSL客户端无法连接确保postgresql.confssl=on并配置证书
客户端使用sslmode=require易受中间人攻击强制使用verify-caverify-full
服务端更换证书后客户端缓存旧证书连接失败或安全降级同步更新客户端的sslrootcert,并在变更窗口进行验证

八、总结与下期预告

本期作为系列第二期,深入解析了PostgreSQL认证体系和SSL/TLS加密传输的两大核心主题。至此,我们已具备构建 “强身份认证 + 加密传输” 的基础安全能力。

然而,仅靠连接安全和基础权限控制,仍然无法解决 多租户数据隔离 这一典型业务挑战。在第三期中,我们将揭开PostgreSQL最为强大的安全特性之一——行级安全(Row Level Security,RLS) 的深层奥秘,学会如何在数据库内核层面实现行级数据隔离,让每个租户只能看到自己的数据,再也不用担心WHERE条件被恶意篡改。

参考文献

  1. PostgreSQL全球开发组,"18.9. 使用SSL安全地进行TCP/IP连接", PostgreSQL官方文档(中文版), 2025. [1†L4-L7]
  2. PostgreSQL全球开发组,"20.1. The pg_hba.conf File", PostgreSQL官方文档, 2026. [0†L14-L18]
  3. 华为云,"RDS for PostgreSQL安全最佳实践", 华为云帮助文档, 2026. [3†L27-L30]
  4. 阿里云,"使用云端证书快速开启SSL加密", 阿里云帮助文档, 2025. [1†L28-L30]
  5. Microsoft Azure,"配置TLS连接到Azure Database for PostgreSQL", Azure文档, 2026. [3†L17-L20]
  6. 华为云,"修改PostgreSQL配置文件以确保数据安全", 华为云开发者社区, 2025. [0†L37-L39]
  7. 百度云,"PostgreSql连接权限管理:从基础到进阶的全面指南", 百度云开发者社区, 2025. [4†L7-L10]
  8. Percona,"Best practices for securing PostgreSQL in hybrid environments", Percona博客, 2025. [4†L23-L27]
  9. 阿里云,"Configure a client CA certificate", 阿里云帮助文档, 2026. [5†L9-L14]
  10. Kaspersky,"情景:验证PostgreSQL服务器", Kaspersky企业文档, 2026. [5†L39-L42]