openGauss数据库源码解析系列文章—安全管理源码解析(三)

审计机制和审计追踪机制能够对用户的日常行为进行记录和分析,实现规避风险、提高安全性。

5.1  审计日志设计

审计内容的记录方式通常有两种:记录到数据库的表中、记录到OS文件中。openGauss采用记录到OS文件中(即审计日志)的方式来保存审计结果,审计日志文件夹受操作系统权限保护,默认只有初始化用户可以读写,从数据库安全角度出发,保证了审计结果的可靠性。日志文件的存储目录由audit_directory参数指定。

openGauss审计日志每条记录包括time、type、result、userid、username、database、client_conninfo、object_name、detail_info、node_name、thread_id、local_port、remote_port共13个字段。图23为审计日志的单条记录示例。

图23  审计记录示例

对审计日志文件进行读写的函数的代码主要位于“pgaudit.cpp”文件中,其中主要包括两类函数:审计文件的读、写、更新函数;审计记录的增、删、查接口。

首先介绍审计文件的数据结构,如图24所示。

openGauss的审计日志采用文件的方式存储在指定目录中。通过查看目录,可以发现日志主要包括两类文件:形如0_adt的审计文件以及名为index_table索引文件。

图24  审计文件结构

以adt结尾的审计文件中,每一条审计记录对应一个AuditData结构体。数据结构AuditData代码如下:

typedef struct AuditData {    AuditMsgHdr header;    /*  记录文件头,存储记录的标识、大小等信息   */    AuditType type;        /*  审计类型   */    AuditResult result;      /*  执行结果   */    char varstr[1];         /*  二进制格式存储的具体审计信息   */ } AuditData;