GBase 8c
运维管理
文章
精选

在 GBase 8c 里做审计,我更在意的是“能查到、留得住、查得动”,而不是只把开关打开

发表于2026-03-25 09:56:2632次浏览3个评论

我最近看 GBase 8c 相关资料时,一个感受特别明显:很多项目提到“数据库审计”,最先想到的动作往往只是把审计功能打开,但真正到了生产环境,问题很快就会变成另外三个层面——审计项到底配到什么粒度、审计日志能不能长期保留下来、出了问题以后能不能快速把那段操作链路还原出来。GBase 8c 本身提供了比较完整的审计能力,既支持登录注销、数据库启动停止、权限授予回收、对象 DDL、DML、SELECT、COPY、函数执行、SET 参数等不同维度的审计项,也支持通过函数和日志目录去查结果。更关键的是,审计总开关和多数审计项支持动态生效,不一定要停库重启。

从落地角度看,这种能力并不只是为了“合规检查时能交材料”。在真实环境里,审计更常见的用途反而是下面几类:

  • 查谁在什么时间删了数据;

  • 查一段时间里哪些账号做过越权或敏感访问;

  • 查某个对象为什么突然结构变了;

  • 查批量导入、函数调用、参数修改是不是在错误时间窗口执行;

  • 做事后追溯,给故障排查补上证据链。

我自己理解下来,GBase 8c 的审计如果要真正落地,不能只停留在“开了没开”这一级,而是要沿着下面这条线往下看:先决定审计边界,再决定采集粒度,再决定保存策略,最后再决定查询和巡检方式。 这几个环节只要有一个没处理好,审计很容易要么太重、把系统拖慢,要么太轻、事后查不到东西。


一、先别急着全量审计,第一步应该先定义“到底要审什么”

GBase 8c 的审计项覆盖面比较广。社区整理里列出的常用配置就已经包括:登录注销审计 audit_login_logout、数据库启动停止恢复切换审计 audit_database_process、用户锁定解锁审计 audit_user_locked、越权访问审计 audit_user_violation、权限授予回收审计 audit_grant_revoke、对象 DDL 审计 audit_system_object、DML 审计 audit_dml_state、SELECT 审计 audit_dml_state_select、COPY 审计 audit_copy_exec、函数执行审计 audit_function_exec、系统函数执行审计 audit_system_function_exec、SET 审计 audit_set_parameter、事务 ID 记录 audit_xid_info 等。默认情况下,并不是所有项目都开启。比如 DML 和 SELECT 审计默认就是关闭的。

这个地方我个人比较在意,因为很多人一看审计项很全,就容易直接往“全开”走。
但真正落到现场时,最先要回答的问题其实是:

你是为了安全合规、运维追溯,还是为了业务数据留痕?

这三类目标,关注点并不一样。

目标

更该优先开启的审计项

不建议一开始就全开的项

安全合规

登录注销、锁定解锁、越权访问、权限授予回收、数据库启停

全量 SELECT、全量函数执行

运维追溯

对象 DDL、SET 参数、数据库进程、COPY

所有用户全量审计

业务留痕

指定表 DML、必要时补 SELECT

全库无差别 DML + SELECT

之所以不建议上来就把 SELECT 和所有表 DML 全量打开,原因也不复杂:这类日志增长会非常快,尤其是报表类、查询密集型业务。如果没有明确边界,最后很容易从“审计系统”变成“日志堆积系统”。这一点从官方给出的日志保存策略参数也能看出来,GBase 8c 对审计目录、空间上限、最小保存时长、文件数量阈值都单独给了配置项,显然不是按“无限留存”来设计的。


二、GBase 8c 的审计更适合按“默认基础项 + 重点对象补充项”来设计

我自己更倾向于把审计拆成两层。

第一层:默认基础审计

这层主要保证系统级动作和安全边界有记录,通常建议至少覆盖:

  • 用户登录与注销;

  • 数据库启动、停止、恢复、切换;

  • 用户锁定与解锁;

  • 权限授予与回收;

  • 核心对象的 CREATE / ALTER / DROP;

  • 必要的参数修改操作。

这类项有一个共同点:日志量通常可控,但排障价值很高。

第二层:重点对象审计

这层是围绕关键表、关键账号、关键时间窗口做补充。
比如:

  • 财务清分表:重点审 INSERT / UPDATE / DELETE;

  • 运维管理员账号:做更高粒度的审计;

  • 夜间批量窗口:重点审 COPY 和函数执行;

  • 敏感分析库:必要时补 SELECT 审计。

这种分层方式的好处是,能把审计做得更接近真实场景。
真正落地时,我一般不会把“审计覆盖率”理解成“所有动作都记录”,而是更看重“关键动作能不能有足够证据”。


三、审计开关能动态生效,这点在生产环境里很实用

社区文章里明确提到,GBase 8c 的审计总开关 audit_enabled 支持动态加载,运行期间修改后可立即生效;很多具体审计项也支持动态修改,无需重启数据库。默认 audit_enabled=on。这一点非常适合线上临时加审计、窗口期提级留痕,或者问题结束后再收缩粒度。

比如临时需要追一张关键表的 DML 行为,我一般会采用这种方式:

gs_guc reload -N all -I all -c "audit_dml_state = 1"
gs_guc reload -N all -I all -c "audit_dml_state_select = 1"

如果只是想确认当前目录或参数,也可以直接在库里看:

SHOW audit_directory;
SHOW audit_enabled;
SHOW audit_dml_state;
SHOW audit_dml_state_select;

这里更适合这样理解:
动态生效意味着审计可以做成“可控加压”,而不是永远固定一个重配置。
这对生产库很关键,因为很多时候你不是一直想保持最高粒度审计,而是只在敏感时期、问题窗口、变更期提升留痕级别。相关参数和查询方式在社区示例里都有直接说明。


四、只会查日志还不够,我更建议把 pg_query_audit 当成第一入口

GBase 8c 社区里给了一个很实用的办法:直接通过 pg_query_audit(起始时间,终止时间) 查询指定时间段的审计动作;如果需要进一步核对原始日志,再通过 SHOW audit_directory 找到底层审计文件目录。对于“想看某段时间到底执行过哪些系统 SQL / DML / SELECT”的场景,这个入口非常顺手。

一个更贴近日常使用的查询方式可以这样写:

SELECT detail_info, type, result
FROM pg_query_audit('2026-03-25 09:00:00', '2026-03-25 10:00:00')
WHERE type IN ('dml_action', 'dml_action_select')
  AND detail_info LIKE '%acct_trade_detail%';

如果是查某个对象的 DDL 变化,也可以把过滤条件换成对象名和动作类型。
如果是查某个账号的操作轨迹,通常就会把时间段、用户名、对象名一起带上。

这个点我个人比较在意,因为很多团队做审计,最后停留在“日志文件存在”,但一旦真要排故障,大家又得去翻 OS 目录、grep 文件、拼时间窗口,效率很低。
pg_query_audit() 这种方式,本质上就是给现场排查留了一个更适合 SQL 视角的入口。


五、真正麻烦的不是“有没有日志”,而是“日志保留策略有没有把自己逼到角落里”

我最近整理资料时发现,GBase 8c 对审计日志维护给出的参数其实已经很完整了:

  • audit_directory:审计文件存储目录;

  • audit_resource_policy:审计日志保存策略;

  • audit_space_limit:审计文件总空间上限;

  • audit_file_remain_time:最小保存时间;

  • audit_file_remain_threshold:审计目录下最大文件数量阈值。

官方社区还提到,如果通过 gs_om 部署,默认审计目录一般在 /var/log/gaussdb/用户名/pg_audit

从实际场景看,这几个参数最容易出现两类问题。

1)空间上限太保守

刚开始觉得审计只是辅助功能,给了很小的空间;
结果某次排查窗口临时打开了 DML / SELECT,几小时就把目录吃满,后面日志保留策略开始不断回收,真正关键的证据反而没留住。

2)保留时间和业务周期不匹配

很多公司月结、季结、审计抽查都不是按 7 天来算。
如果 audit_file_remain_time 太短,等到真正有人来追溯,文件可能早就滚没了。官方默认示例里给出的最小保存时间是 90。这个数字并不一定适合所有环境,但它至少说明 GBase 8c 设计审计时,默认就是按“长期留痕”思路考虑的。

所以我更建议把审计保留策略按场景分层:

场景

更适合的留存思路

关注点

普通业务库

基础安全审计长期留,细粒度 DML 按窗口启停

控制空间增长

金融/审计敏感库

敏感对象审计时间更长

保证追溯周期

临时问题排查

短期提升粒度

问题结束及时收口

报表/分析库

谨慎开启 SELECT 全量审计

防止日志爆量


六、GBase 8c 为什么更偏向把审计结果写到 OS 文件,而不是只放表里

社区资料里专门对两种审计日志保存方式做过比较:如果审计结果保存在数据库表里,理论上查询方便,但只要用户拥有相应对象权限,就存在被访问甚至被非法操作的风险;而写到 OS 文件,虽然需要用户维护日志,但从安全角度更可靠,因为即使能访问数据库,也不一定就能访问操作系统层面的审计文件。GBase 8c 从安全角度出发,更强调用 OS 文件保存审计结果。

这个设计我自己是比较认可的。
因为审计的核心诉求之一就是“独立可信”。如果审计和业务数据都放在同一个权限边界里,那么一旦真遇到高权限误操作或恶意篡改,审计记录本身也可能失去说服力。社区文章还提到,GBase 8c 甚至设置了专门的安全审计员角色,用于独立审计管理和查看审计数据。

所以如果放到治理视角里,这件事不是“文件查询不如表查询方便”,而是“审计证据要不要尽量和业务权限分层”。
我更倾向于后者。


七、真正上线时,我更建议用“小步启用”的方式做一次审计基线

如果让我给 GBase 8c 审计落地梳一遍更稳妥的顺序,我一般会按下面这套来。

第一步:先上基础安全项

先开启登录注销、数据库进程、权限授予回收、对象 DDL、锁定解锁。
这一步日志量通常不夸张,但已经能覆盖大部分常见排查线索。

第二步:确认目录和保留策略

核对:

SHOW audit_directory;
SHOW audit_resource_policy;
SHOW audit_space_limit;
SHOW audit_file_remain_time;
SHOW audit_file_remain_threshold;

这一步不是形式检查,而是为了防止“开了审计但没留住”。相关参数含义在维护审计日志说明里都有。

第三步:按关键对象补 DML / SELECT

不要全库一把梭,先围绕关键表、关键账号、关键时间段加粒度。
比如月结窗口、敏感表、审计抽查期。

第四步:形成固定查询模板

至少准备三类:

  • 按时间窗口查;

  • 按对象名查;

  • 按动作类型查。

比如:

SELECT detail_info, type, result
FROM pg_query_audit('2026-03-25 00:00:00', '2026-03-25 23:59:59')
WHERE detail_info LIKE '%fin_settle_result%';

第五步:把审计纳入日常巡检

重点看两件事:

  • 审计目录增长速度是否异常;

  • 是否存在超出预期的大量 SELECT / DML 留痕。


八、我更认可的一种审计思路:别追求“全记录”,而要追求“关键动作可还原”

我自己理解下来,GBase 8c 的审计能力已经足够把很多关键问题讲清楚。
它既能对登录、权限、对象变更做系统级留痕,也能在需要时对 DML、SELECT、COPY、函数执行、SET 参数做更细粒度跟踪;再配合 pg_query_audit()、审计目录和日志维护策略,基本可以把“谁、在什么时间、对什么对象、做了什么动作、结果如何”串起来。

真正落到现场,我更看重的不是“审计项是不是开到了最多”,而是下面这几件事:

  • 关键账号有没有留痕;

  • 关键表有没有证据链;

  • 关键变更窗口能不能追溯;

  • 日志是不是能在需要的时候还在;

  • 查询入口是不是足够顺手。

如果这几件事都做到了,GBase 8c 的审计就不只是一个合规功能,而会真正变成数据库治理里的基础设施。
出了问题以后,不是靠猜,也不是靠口头确认,而是能直接把操作轨迹拉出来说话。这个价值,在生产环境里通常比“配置项记住了多少”更实在。

参考资料

[1] 南大通用GBase 8c审计功能简述
https://www.gbase.cn/community/post/4410

[2] GBase 8c维护审计日志(一)
https://www.gbase.cn/community/post/1964

[3] 如何查看8c执行过的系统sql - GBase 8c
https://www.gbase.cn/community/post/5544

[4] GBase 8c 数据库审计概述(八)
https://www.gbase.cn/community/post/2481

[5] GBase 8c数据库安全审计
https://www.gbase.cn/community/post/1953

[6] GBase 8c 开发者手册
https://cdn.gbase.cn/products/34/Pr3MGDrcOeeWwC9kdNEjM/GBase%208c%20V5_3.0.1_%E5%BC%80%E5%8F%91%E

评论

登录后才可以发表评论
GBase用户21143发表于 2个月前
感谢您分享
GBase用户47954发表于 2个月前
感谢作者的精彩分享!
流泪猫猫头发表于 4小时前
很详细实用的文章