依据 GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》第三级”安全计算环境” 条款,结合 PostgreSQL 15/14/13 官方安全指南 及多家测评机构现场实践,给出可直接落地的 测评命令清单。
已在 CentOS 7 + PostgreSQL 15.4 环境验证,默认 psql -U postgres -h 127.0.0.1 -p 5432 连接。
一、身份鉴别(8.1.4.1)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 空口令账号 | SELECT usename FROM pg_user WHERE passwd IS NULL; | 无返回行 |
| 账号唯一性 | SELECT usename FROM pg_user GROUP BY usename HAVING COUNT(*)>1; | 无返回行 |
| 密码复杂度 | SHOW shared_preload_libraries; 包含 passwordcheck;SELECT name,setting FROM pg_settings WHERE name LIKE 'password%'; | 长度≥8,含大小写、数字、特殊字符 |
| 密码有效期 | SELECT usename,valuntil FROM pg_user WHERE valuntil IS NOT NULL; | 有效期 ≤90 天 |
| 登录失败锁定 | SHOW auth_delay.max_auth_delay; | 启用 auth_delay 模块或 fail2ban |
| 会话超时 | SHOW idle_in_transaction_session_timeout; | ≤600 s |
| 远程鉴别加密 | SHOW ssl; + SHOW ssl_ciphers; | on 且 TLS1.2+ |
二、访问控制(8.1.4.2)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 默认/匿名账户 | SELECT usename FROM pg_user WHERE usename IN ('','test','postgres'); | 已删除或禁用 |
| 最小权限 | SELECT grantee,privilege_type FROM information_schema.role_table_grants WHERE privilege_type='ALL'; | 仅授权业务所需 |
| 三权分立角色 | SELECT rolname FROM pg_roles WHERE rolname IN ('app_admin','app_audit','app_sec'); | 角色分离 |
| 网络白名单 | SELECT * FROM pg_hba_file_rules; | 仅允许业务网段/堡垒机 |
| 文件权限 | ls -ld $PGDATA | 0700 postgres:postgres |
三、安全审计(8.1.4.3)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 日志开关 | SHOW log_destination; SHOW logging_collector; | stderr & on |
| 审计级别 | SHOW log_statement; SHOW log_checkpoints; | all 或 ddl |
| 日志字段 | 查看日志样例:tail -n 1 $PGDATA/log/postgresql-*.log | 含时间、用户、客户端 IP、SQL、结果 |
| 日志大小与保留 | SHOW log_rotation_age; SHOW log_rotation_size; | 单文件 ≤100 MB,保留 ≥6 个月 |
| 日志权限 | ls -l $PGDATA/log/ | 640 postgres:postgres |
四、入侵防范(8.1.4.4)
| 控制项 | 测评命令 | 达标判据 | |
|---|---|---|---|
| 补丁更新 | SELECT version(); | 版本 ≥ 官方最新季度补丁 | |
| 最小安装 | `yum list installed | grep -i postgres` | 仅安装必要组件 |
| 监听地址 | SHOW listen_addresses; | 非 * | |
| 高危端口 | `ss -tulnp | grep 5432` | 仅业务网段可访问 |
五、恶意代码防范(8.1.4.5)
| 控制项 | 测评命令 | 达标判据 | |
|---|---|---|---|
| 杀毒软件 | systemctl is-active clamdfreshclam --version | 实时保护开启,病毒库≤24 h | |
| 可信启动 | `dmesg | grep -i ima` | IMA/EVM 已启用 |
六、数据完整性(8.1.4.7)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 传输完整性 | SHOW ssl; + openssl s_client -connect ip:5432 | TLS1.2+ |
| 存储完整性 | SHOW data_checksums; | on |
| WAL 完整性 | SHOW wal_log_hints; | on |
七、数据备份与恢复(8.1.4.9)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 本地备份 | pg_dumpall --file=/backup/pg-$(date +%F).sql | 每日全量,保留≥30 天 |
| 异地备份 | ls -l /backup/offsite/ | 异地同步 |
| 恢复演练 | pg_restore --list /backup/latest.dump | 验证可恢复 |
| PITR | SELECT * FROM pg_stat_archiver; | 归档正常 |
八、剩余信息保护(8.1.4.10)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 鉴别信息清除 | SHOW password_encryption; | scram-sha-256 |
| 日志清零 | 访谈 + 查看 secure_delete 脚本 | 删除前覆写 |
一键巡检脚本(可直接使用)
#!/bin/bash
# PostgreSQL 等保三级一键巡检脚本
# 适用:PostgreSQL 13/14/15
# 执行用户:postgres
exportPGDATA=/var/lib/pgsql/15/data
exportPATH=/usr/pgsql-15/bin:$PATH
echo"===== 1 身份鉴别 ====="
psql -U postgres -c"SELECT '空口令账户',usename FROM pg_user WHERE passwd IS NULL;"
psql -U postgres -c"SELECT name,setting FROM pg_settings WHERE name LIKE 'password%';"
psql -U postgres -c"SHOW ssl; SHOW ssl_ciphers; SHOW idle_in_transaction_session_timeout;"
echo"===== 2 访问控制 ====="
psql -U postgres -c"SELECT usename FROM pg_user WHERE usename IN ('','test','postgres');"
psql -U postgres -c"SELECT * FROM pg_hba_file_rules;"
ls-ld$PGDATA
echo"===== 3 安全审计 ====="
psql -U postgres -c"SHOW log_destination; SHOW logging_collector; SHOW log_statement;"
ls-l$PGDATA/log/
echo"===== 4 入侵防范 ====="
psql -U postgres -c"SELECT version();"
psql -U postgres -c"SHOW listen_addresses;"
ss -tulnp|grep5432
echo"===== 5 数据完整性 ====="
psql -U postgres -c"SHOW data_checksums; SHOW wal_log_hints;"
echo"===== 6 备份检查 ====="
ls-l /backup/pg-*.sql 2>/dev/null ||echo"备份目录未配置"
psql -U postgres -c"SELECT * FROM pg_stat_archiver;"
关键配置说明
1. 密码复杂度配置(postgresql.conf)
# 加载密码检查模块
shared_preload_libraries='passwordcheck'
# 或自定义策略(需创建扩展)
password_encryption='scram-sha-256'
2. 登录失败锁定方案
PostgreSQL 原生不支持登录失败锁定,需通过以下方式实现:
方案一:auth_delay 模块
# postgresql.conf
shared_preload_libraries='auth_delay'
auth_delay.milliseconds=5000
方案二:fail2ban 集成
# 安装 fail2ban
yum install fail2ban
# 配置 /etc/fail2ban/jail.local
[postgresql]
enabled =true
port =5432
filter = postgresql
logpath = /var/lib/pgsql/15/data/log/postgresql-*.log
maxretry =5
bantime =3600
3. 网络访问控制(pg_hba.conf)
# 查看当前规则
psql -U postgres -c"SELECT * FROM pg_hba_file_rules;"
# 合规配置示例(pg_hba.conf)
# TYPE DATABASE USER ADDRESS METHOD
hostssl all all 10.0.0.0/24 scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
# 拒绝其他所有连接
host all all 0.0.0.0/0 reject
高风险项重点核查清单
| 检查项 | 验证命令 | 不合规判定 | 整改建议 |
|---|---|---|---|
| 空口令账户 | SELECT usename FROM pg_user WHERE passwd IS NULL | 存在返回行 | 立即执行 DROP USER 或设置密码 |
| 默认账户未清理 | SELECT usename FROM pg_user WHERE usename='test' | 存在 test/postgres 默认账户 | 删除测试账户,重命名 postgres |
| 审计未启用 | SHOW logging_collector | 值为 off | 修改 logging_collector=on 并重启 |
| 密码复杂度未配置 | SHOW shared_preload_libraries | 不包含 passwordcheck | 安装 contrib 包并配置参数 |
| 无SSL加密 | SHOW ssl | 值为 off | 配置 SSL 证书并启用 |
| 监听地址过大 | SHOW listen_addresses | 值为 * | 修改为特定 IP 或 localhost |
| 无异地备份 | ls /backup/offsite/ | 目录不存在或为空 | 配置 rsync/s3 异地同步 |
版本差异说明(13 vs 14 vs 15)
| 功能项 | PostgreSQL 13 | PostgreSQL 14 | PostgreSQL 15 |
|---|---|---|---|
| 默认认证方式 | md5 | scram-sha-256 | scram-sha-256 |
| 并行 vacuum | 支持 | 支持 | 增强 |
| 逻辑复制 | 基础 | 增强 | 支持两阶段提交 |
| 审计功能 | 依赖日志 | 依赖日志 | 依赖日志 |
| 数据校验 | 支持 | 支持 | 支持 |
建议升级至 PostgreSQL 14+,默认使用
scram-sha-256认证,安全性更高。
测评执行要点
1. 权限要求
- 系统命令需
postgres用户或root权限 - 数据库命令需
SUPERUSER权限或pg_read_all_settings角色
2. 环境变量配置
exportPGDATA=/var/lib/pgsql/15/data
exportPATH=/usr/pgsql-15/bin:$PATH
exportPGUSER=postgres
exportPGHOST=127.0.0.1
exportPGPORT=5432
3. 现场核查重点
- 密码复杂度:尝试创建弱口令用户验证
passwordcheck是否生效 - 审计完整性:抽查
$PGDATA/log/下日志文件,确认包含连接失败、DDL 操作记录 - 网络加密:使用
openssl s_client -connect ip:5432验证是否为 TLS 握手 - 备份有效性:现场执行
pg_restore --list验证备份文件可解析
4. 三权分立实施建议
PostgreSQL 通过角色实现三权分立:
-- 创建系统管理员(仅管理权限)
CREATE ROLE app_admin WITH LOGIN CREATEDB CREATEROLE;
-- 创建安全管理员(管理用户和权限)
CREATE ROLE app_sec WITH LOGIN CREATEUSER;
-- 创建审计管理员(查看日志,无业务权限)
CREATE ROLE app_audit WITH LOGIN;
GRANT pg_read_all_settings TO app_audit;
GRANT pg_read_all_stats TO app_audit;
使用提示
1. 变量说明
$PGDATA默认/var/lib/pgsql/15/data,可按实际版本修改(如/var/lib/pgsql/14/data)- 需确保
psql在 PATH 中,或指定完整路径/usr/pgsql-15/bin/psql
2. 图形化工具
通过 pgAdmin → 服务器状态 → 日志,可导出合规报告。
3. 日志分析工具
推荐使用 pgBadger 生成审计报告:
pgbadger /var/lib/pgsql/15/data/log/postgresql-*.log -o report.html
参考标准:GB/T 22239-2019、GB/T 28448-2019、PostgreSQL Security Guide
适用版本:PostgreSQL 13/14/15
验证环境:CentOS 7.9 / RHEL 8 / Rocky Linux 8
声明:来自A校园虚拟空间,仅代表创作者观点。链接:https://eyangzhen.com/6213.html