文章总结: 该文档是一份针对PostgreSQL数据库的等保合规核查指南,旨在解决现有检查命令缺乏验证和系统性的问题。作者基于PostgreSQL15版本,详细列举了身份鉴别、访问控制、安全审计、入侵防范、可信验证及备份恢复六大方面的核查命令与配置方法。内容包含具体SQL语句与Shell命令,并附带参数解释与合规建议,提供了极高的可操作性,适合安全运维人员进行自查或测评工作。 综合评分: 90 文章分类: 安全建设,数据安全,实战经验,安全运营
【数据库】PostgreSQL等保核查命令大全|亲测有效 + 持续更新
原创
Fuyuanzi Fuyuanzi
汤池杂货铺
2026年3月2日 04:21 北京
解决以下3个痛点:
1️⃣能查到的大部分检查命令没有运行结果的截图,无法确定命令是否有效。
2️⃣不同版本的被侧目标可能使用不同的命令,过时或者较新的命令可能无法有效运行,明显降低检查效率。
3️⃣网络公开的检查方法整体缺乏系统性与持续维护
💽测试环境:虚拟机
💽测试镜像版本:Rocky-10.1-x86_64-dvd1.iso
💽数据库版本:PostgreSQL 15.15
📚文末可提取本文的无水印PDF版本的百度网盘下载链接,方便各位在无网络环境下的使用。
👇如果有更加好的检测命令或者需要修改的地方,请在评论区留言。我会及时更新改正,并上传新的离线文件。
目录结构:
一、身份鉴别
1.1 账号管理
PostgreSQL 中每个角色(role)名称在集群内必须是唯一的,这是由系统强制保证的。但你可以通过以下 SQL 查询确认所有具有登录权限的角色:
SELECT * FROM pg_roles WHERE rolcanlogin = true;
PostgreSQL 的密码存储在 pg_authid 系统表中(需超级用户权限):
SELECT rolname, rolpassword FROM pg_authid WHERE rolcanlogin = true;
1.2 密码复杂度
PostgreSQL 原生不支持密码复杂度策略,但可通过以下扩展实现:
方法一:安装 pg_password_policy 扩展(第三方)
- 支持最小长度、数字/大小写字母/特殊字符要求等。
- 需手动编译安装,并在 `postgresql.conf` 中配置。
# 查看是否存在第三方安全扩展
cat /var/lib/pgsql/15/data/postgresql.conf | grep "扩展名"
存在复杂度设置的示例:
# 加载扩展
shared_preload_libraries = 'pg_password_policy' # 若已有其他扩展,用逗号分隔
# 配置密码策略(按需调整)
password_policy.min_length = 8 # 密码最小长度
password_policy.digits = 1 # 至少1个数字
password_policy.uppercase = 1 # 至少1个大写字母
password_policy.lowercase = 1 # 至少1个小写字母
password_policy.special = 1 # 至少1个特殊字符
password_policy.max_length = 64 # 密码最大长度
password_policy.reuse_check = 3 # 禁止复用最近3次密码
方法二:使用 pam + pam_pwquality(通过 PAM 认证)
- 在 `pg_hba.conf` 中配置 `pam` 认证;
- 系统级 PAM 模块可强制密码复杂度。
# 查看用户是否启用了pam认证
cat /var/lib/pgsql/15/data/pg_hba.conf
如果进行了PAM配置,则配置内容基本如下:
# 基本 PAM 认证配置
# TYPE DATABASE USER ADDRESS METHOD
host mydb myuser 192.168.1.0/24 pam
# 带参数的 PAM 认证配置
host mydb myuser 192.168.1.0/24 pam pamservice=postgresql pam_use_hostname=1
1.3 登录失败处理
在 PostgreSQL 中,原生并不直接提供“账户锁定”或“登录失败次数限制”等传统意义上的登录失败处理机制(如 Oracle、SQL Server 或 Windows AD 中的账户锁定策略)。但是可以通过第三方安全工具实现。
1.4 远程登录管理
cat /var/lib/pgsql/15/data/postgresql.conf | grep -E "listen_addresses|port"
# 检查数据库配置的远程管理的监听地址
*:允许监听任意IPv4地址,也可以将其替换为指定IPv4
cat /var/lib/pgsql/15/data/pg_hba.conf | grep -v "^#\|^$"
# 查看允许访问数据库的IP范围
常见的 “认证方式” 取值:
- •
scram-sha-256:推荐的安全加密认证方式,比md5更安全。 - •
md5:使用 MD5 哈希密码认证(兼容性较好,但安全性不如 SCRAM)。 - •
peer/ident:仅适用于本地连接,通过操作系统用户名验证。 - •
trust:无需密码直接允许连接(仅在绝对可信的内网环境中临时使用,生产环境禁止)。
1.5 双因素认证
PostgreSQL 原生不直接支持双因素认证(2FA / MFA),但可以通过 PAM配置来集成 2FA
cat /etc/pam.d/postgresql
拿 Google Authenticator 举例,如果安装了 Google Authenticator PAM 模块(Linux) 则可以在/etc/pam.d/postgresql中找到如下的配置:
# /etc/pam.d/postgresql
auth required pam_google_authenticator.so
auth include system-auth
account include system-auth
二、访问控制
2.1 账户权限划分
结合1.1账号管理的内容可以进行可登录账号的权限查看是否存在多种类型的可登录账户用以划分权限👇:
SELECT * FROM pg_roles WHERE rolcanlogin = true;
| 字段名 | 值 | 含义 |
| — | — | — |
| rolname | postgres | 角色名称,这是 PostgreSQL 安装时默认创建的超级用户 |
| rolsuper | t | 该角色是超级用户,拥有数据库的所有权限 |
| rolcreaterole | t | 允许该角色创建其他数据库角色 |
| rolcreatedb | t | 允许该角色创建新的数据库 |
| rolcanlogin | t | 该角色允许登录数据库(这也是你查询的过滤条件) |
| rolreplication | t | 该角色拥有流复制权限,可以用于主备复制场景 |
| rolconnlimit | -1 | 对该角色的并发连接数无限制(-1 表示不限制) |
| rolpassword | ******** | 该角色已设置密码(出于安全考虑,密码显示为星号) |
| rolbypassrls | t | 该角色可以绕过行级安全策略(RLS) |
2.2 默认账户/口令
PostgreSQL 在 initdb 初始化集群时,会创建一个与操作系统当前用户同名的角色(通常是 postgres)。该角色默认具有 SUPERUSER 权限,且无密码(依赖 peer 或 ident 认证本地登录)。
结合 1.2 密码复杂度 判断是否存在默认口令、默认账户的情况。
SELECT
*
FROM
pg_authid
WHERE
rolcanlogin = true;
2.3 共享账户
最佳判断方式是通过日志进行分析👇:
ls var/lib/pgsql/15/data/log
# 查看当前文件夹下是否存在日志信息
cat postgresql-Tue.log | grep "用户名"
# 分析用户的链接状况
2.4 最小权限原则
结合 2.1 账户权限划分 判断账户权限是否按照最小权限原则进行权限划分
检查 PUBLIC 角色是否被过度授权,PUBLIC 是隐式包含所有角色的组,对其授权等于对所有人授权。
SELECT
*
FROM
information_schema.table_privileges
WHERE
grantee = 'PUBLIC';
-- 查看是否有角色被授予 ALL PRIVILEGES on ALL TABLES(过度授权)
SELECT
grantee,
COUNT(*) AS num_tables,
STRING_AGG(table_name, ', ') AS tables
FROM
information_schema.table_privileges
WHERE
privilege_type IN ('SELECT', 'INSERT', 'UPDATE', 'DELETE')
GROUP BY
grantee
HAVING
COUNT(DISTINCT table_schema || '.' || table_name) > 50;
-- 阈值根据实际数据库拥有的表数目进行修改
2.5 由授权主体配置访问控制策略
检查授权主体,仅少数可信角色(如 postgres、db_sec_admin)具备授权能力,普通用户拥有 CREATEROLE权限,可自行授权 ,这违反了“由授权主体配置”:
SELECT
rolname
FROM
pg_roles
WHERE
rolsuper = true
OR rolcreaterole = true;
2.6 访问控制的粒度
结合2.4 最小权限原则 中角色权限查看的信息进行判断,PUBLIC 相当于“所有用户”,对其授权等于放弃访问控制粒度,任何返回结果均视为不符合细粒度要求。
2.7 强访问控制
-- 检查哪些角色可绕过 RLS
SELECT
rolname
FROM
pg_roles
WHERE
rolbypassrls = true;
除极少数审计账号外,不应授予普通用户 BYPASSRLS。
3.1 安全审计功能
-- 查看关键审计相关参数
SELECT
name,
setting
FROM
pg_settings
WHERE
name IN (
'log_destination',
'logging_collector',
'log_directory',
'log_filename',
'log_statement',
'log_connections',
'log_disconnections',
'log_min_duration_statement',
'log_line_prefix'
);
| 参数 | 推荐值 | 作用 |
| — | — | — |
| logging_collector | on | 启用日志收集 |
| log_connections | on | 记录登录 |
| log_disconnections | on | 记录登出 |
| log_statement | 'ddl' 或 'mod' | – none:不记录 – ddl:记录 DDL(CREATE/ALTER/DROP) – mod:DDL + DML(INSERT/UPDATE/DELETE) – all:记录所有 SQL(含 SELECT,慎用) |
| log_line_prefix | '%t [%p]: user=%u,db=%d,host=%h,app=%a ' | 必须包含 %u(用户)、%h(IP)、%d(数据库) |
| log_min_duration_statement | 1000 (毫秒) | 可用于记录慢查询,辅助审计异常操作 |
3.2 审计记录信息
3.1 审计功能中的 log_line_prefix 参数提供了审计日志中提供的审计信息
3.3 审计记录保护
日志是否防篡改:日志文件权限为 600,仅 DBA 可读。
ls -l /var/lib/pgsql/15/data/log
四、入侵防范
4.1 限制终端接入
结合 1.3 远程登录管理的检查信息进行分析
4.2 补丁更新
SELECT version();
各版本最新小版本对照表(截至 2026 年 2 月 2 日),2026 年 2 月 13 日可能发布 16.3、15.16 等 👇,数据库版本达到最新小版本即为安全补丁已经更新到最新状态:
| 大版本 | 当前最新小版本 | 发布日期 | 支持截止时间 | 是否仍在支持 | | — | — | — | — | — | | 16 | 16.2 | 2024-02-08 | 2028-11 | ✅ 是 | | 15 | 15.15 | 2025-11-13 | 2027-11 | ✅ 是 | | 14 | 14.11 | 2024-02-08 | 2026-11 | ✅ 是(即将 EOL) | | 13 | 13.13 | 2023-11-09 | 2023-11 | ❌ 已停止支持 | | 12 | 12.17 | 2023-11-09 | 2023-11 | ❌ 已停止支持 | | ≤11 | — | — | 已过期多年 | ❌ 高危 |
五、可信验证
5.1 数据传输过程中的保密性与完整性
| 要求 | PostgreSQL 实现方式 |
| — | — |
| 通信保密性 | SSL/TLS + scram-sha-256 |
| 通信完整性 | TLS 内置 MAC 校验 |
cat /var/lib/pgsql/15/data/postgresql.conf | grep -E "ssl"
# 判断是否开启SSL
# 是否使用SSL链接,同时查看加密认证方式
cat /var/lib/pgsql/15/data/pg_hba.conf
-- 验证链接是否加密
SELECT
ssl,
client_addr
FROM
pg_stat_ssl s
JOIN pg_stat_activity a ON s.pid = a.pid;
5.2 数据存储过程中的保密性与完整性
配合数据库敏感信息的加密存储情况进行判断。
cryptsetup status $(lsblk | grep crypt | awk '{print $1}') 2>/dev/null || echo "无LUKS加密分区"
SELECT
name,
setting,
source
FROM
pg_settings
WHERE
name = 'data_checksums';
| 要求 | PostgreSQL 实现方式 |
| — | — |
| 存储保密性 | LUKS / 云盘加密 / 列加密(pgcrypto) |
| 存储完整性 | data_checksums = on + WAL |
六、数据备份恢复
6.1 本地备份
SELECT
name,
setting
FROM
pg_settings
WHERE
name IN ('archive_mode', 'archive_command', 'wal_level');
| 参数 | 合规值 | 说明 |
| — | — | — |
| wal_level | replica 或 logical | 必须 ≥ replica 才能归档 |
| archive_mode | on | 启用归档 |
| archive_command | 非空(如 test ! -f /backup/wal/%f && cp %p /backup/wal/%f) | 实际归档命令 |
配合查找数据库系统中是否存在备份文件结合进行判断。
6.2 异地备份
访谈,是否存在异地备份,且备份是否符合异地备份要求。
6.3 冗余配置
访谈,是否存在冗余配置,且配置是否符合冗余配置要求。
关注公众号”汤池杂货铺”,回复关键字”等级保护”,即可得到PDF文件的下载地址。大家有好的建议,也欢迎给我留言。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:汤池杂货铺 Fuyuanzi Fuyuanzi《【数据库】PostgreSQL等保核查命令大全|亲测有效 + 持续更新》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论