openGauss源码解析(203)

openGauss源码解析:安全管理源码解析(14)

9.5.2 审计执行

1. 执行原理

审计机制是openGauss的内置安全能力之一,openGauss提供对用户发起的SQL行为审计和追踪能力,支持针对DDL、DML语句和关键行为(登录、退出、系统启动、恢复)的审计。在每个工作线程初始化阶段把审计模块加载至线程中,其审计的执行原理是把审计函数赋给SQL生命周期不同阶段的Hook(钩子),当线程执行至SQL处理流程的特定阶段后会进行审计执行判定逻辑。审计模块加载关键代码如下:

void pgaudit_agent_init(void) {

/* DDL、DML语句审计Hook赋值, 赋值结束后标识审计模块已在此线程加载 */

prev_ExecutorEnd = ExecutorEnd_hook;

ExecutorEnd_hook = pgaudit_ExecutorEnd;

prev_ProcessUtility = ProcessUtility_hook;

ProcessUtility_hook = (ProcessUtility_hook_type)pgaudit_ProcessUtility;

u_sess->exec_cxt.g_pgaudit_agent_attached = true;

}

SQL语句在执行到ProcessUtility_hook和ExecutorEnd_hook函数指针时,会分别进入到已预置好的审计流程中。这两个函数指针的位置在SQL进入执行器执行之前,具体关系如图9-25所示。

图9-25 审计执行关系图

如图9-25所示,在线程初始化阶段审计模块已加载完毕。SQL经过优化器得到计划树,此时审计模块的pgaudit_ExecutorEnd函数和pgaudit_ProcessUtility函数分别进行DML和DDL语句的分析,如果和已设置审计策略相匹配,则会调用审计日志接口,生成对应的审计日志。对于系统变更类的审计直接内置于相应行为的内核代码中。

posted @ 2024-05-07 09:25  openGauss-bot  阅读(2)  评论(0编辑  收藏  举报