数据库高安全—审计追踪:传统审计统一审计

书接上文数据库高安全—角色权限:权限管理&权限检查,从权限管理和权限检查方面解读了高斯数据库的角色权限,本篇将从传统审计统一审计两方面对高斯数据库的审计追踪技术进行解读。

4  审计追踪   

4.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个字段。图1为审计日志的单条记录示例。

图片

图1  审计记录示例

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

首先我们介绍审计文件的数据结构。

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

图片

图2 审计文件结构

以adt结尾的审计文件中,每一条审计记录对应一个AuditData结构体。

数据结构AuditData:

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

    其中AuditMsgHdr记录着审计记录的标识信息,其结构如下:

    数据结构 AuditMsgHdr:

      typedef struct AuditMsgHdr {    char signature[2];   // 审计记录标识,目前固定为AUDIT前两个字符’A’和’U’     uint16 version;      // 版本信息,目前固定为0     uint16 fields;       // 审计记录字段数,目前为13     uint16 flags;        // 记录有效性标识,如果被删除则标记为DEAD     pg_time_t time;     // 审计记录创建时间     uint32 size;         // 审计信息占字节长度 } AuditMsgHdr;

      AuditData的其他结构存储着审计记录的审计信息,AuditType为审计类型,目前有38种类型。AuditResult为执行的结果,有AUDIT_UNKNOWN、AUDIT_OK、AUDIT_FAILED三种结果。其余的各项信息,均通过二进制的方式写入到varstr中。

      审计日志有关的另一个文件为索引文件index_table,其中记录着审计文件的数量、审计日志文件编号、审计文件修改日期等信息。    

      数据结构 AuditIndexTable:

        typedef struct AuditIndexTable {    uint32 maxnum;             // 审计目录下审计文件个数的最大值     uint32 begidx;               // 审计文件开始编号     uint32 curidx;                // 当前使用的审计文件编号     uint32 count;                 // 当前审计文件的总数     pg_time_t last_audit_time;      // 最后一次写入审计记录的时间     AuditIndexItem data[1];        // 审计文件指针 } AuditIndexTable;

        索引文件中每一个AuditIndexItem对应一个审计文件,其结构如下:

        数据结构 AuditIndexTable:

          typedef struct AuditIndexItem {    pg_time_t ctime;             // 审计文件创建时间     uint32 filenum;              // 审计文件编号     uint32 filesize;               // 审计文件占空间大小 } AuditIndexItem;

          审计文件的读、写类函数如auditfile_open、auditfile_rotate等函数实现较简单,读者可以直接阅读源码。

          下面主要介绍日志文件的结构和日志记录的增、删、查接口。

          审计记录的写入接口为audit_report函数。该函数的原型为:

            void audit_report(AuditType type, AuditResult result, const char* object_name, const char* detail_info);

            其中入参type、result、object_name、detail_info分别对应审计日志记录中的相应字段,审计日志中的其余9个字段均为函数在执行时从全局变量中获取。

            audit_report函数的执行主要分为3个部分,首先会检查审计的各项开关,判断是否需要审计该操作。然后根据传入的参数、全局变量中的参数以及当前时间,生成审计日志所需的信息并拼接成字符串。最后调用审计日志文件读写接口,将审计日志写入文件中。

            审计记录查询接口为pg_query_audit函数,该函数为数据库内置函数,可供用户直接调用,调用形式为:

              SELECT * FROM pg_query_audit (timestamptz startime,timestamptz endtime, audit_log);

              入参为需要查询审计记录的起始时间和终止时间以及审计日志文件所在的物理路径。当不指定audit_log时,默认查看连接当前实例的审计日志信息。    

              审计记录的删除接口为pg_delete_audit函数,该函数为数据库内置函数,可供用户直接调用,调用形式为:

                SELECT * FROM pg_delete_audit (timestamptz startime,timestamptz endtime);

                入参为需要被删除审计记录的起始时间和终止时间。该函数通过调用pgaudit_delete_file来将审计日志文件中,startime与endtime之间的审计记录标记为AUDIT_TUPLE_DEAD,达到删除审计日志的效果,而不实际删除审计记录的物理数据。也即执行该函数,审计日志文件大小不会减小。

                4.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进入执行器执行之前,具体关系如图3所示。    

                  图片

                  图3  审计执行关系图

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

                  2. 关键执行流程

                  1) 系统变更类审计执行:

                    pgaudit_system_recovery_okpgaudit_system_start_okpgaudit_system_stop_okpgaudit_user_loginpgaudit_user_logoutpgaudit_system_switchover_okpgaudit_user_no_privilegespgaudit_lock_or_unlock_user

                    以上为openGauss支持系统变更类的审计执行函数,对于此类审计函数均嵌入内核相应调用流程中,以审计用户登入登出pgaudit_user_login为例说明其主体流程。    

                    图片

                    图4 登入审计执行流程

                    图4为服务端校验客户端登入时的主要流程,以登录失败场景为例,首先根据配置文件和客户端IP和用户信息确认采用的认证方式(包括sha256和SSL认证等),然后根据不同的认证方式采用不同的认证流程和客户端进行交互完成认证身份流程,如果认证失败,则线程退出报错给客户端,pgaudit_user_login即在认证失败的时候调用,获取当前访问数据库名称和详细信息,调用审计日志接口记录于审计日志中供审计管理员查看,关键代码如下:

                      /* 拼装登入口失败时候的详细信息,包括数据库名称和用户名 */rc = snprintf_s(details,PGAUDIT_MAXLENGTH,    PGAUDIT_MAXLENGTH - 1,    "login db(%s)failed,authentication for user(%s)failed",    port->database_name,    port->user_name); securec_check_ss(rc, "\0", "\0");// 调用登入审计函数,记录审计日志pgaudit_user_login(FALSE, port->database_name, details);// 退出当前线程ereport(FATAL, (errcode(errcode_return), errmsg(errstr, port->user_name)))

                      登入审计日志接口pgaudit_user_login则主要完成审计日志记录接口需要参数的拼接:

                        void pgaudit_user_login(bool login_ok, const char* object_name, const char* detaisinfo){    AuditType audit_type;    AuditResult audit_result;    Assert(detaisinfo);    // 审计类型和审计结果拼装    if (login_ok) {        audit_type = AUDIT_LOGIN_SUCCESS;        audit_result = AUDIT_OK;    } else {            audit_type = AUDIT_LOGIN_FAILED;        audit_result = AUDIT_FAILED;    }    // 直接调用审计日志记录接口    audit_report(audit_type, audit_result, object_name, detaisinfo);}

                        2) DDL、DML语句审计执行

                        依据审计日志执行原理,DDL、DML语句的执行分别由于pgaudit_ProcessUtility、pgaudit_ExecutorEnd来承载,首先介绍函数pgaudit_ProcessUtility,其主体结构如下:

                        DDL审计执行函数关键入参parsetree用于识别审计日志类型(create/drop/alter等操作),入参queryString保存原始执行SQL语句,用于记录审计日志,略去非关键流程,此函数主要根据判断nodeTag所归属的DDL操作类型,进入不同的审计执行逻辑,以T_CreateStmt为例,识别当前语句create table则进入pgaudit_ddl_table逻辑进行审计日志执行并最终记录审计日志。

                        图片

                        图5  DDL审计执行流程

                        如图5所示,首先从当前SQL语句中获取执行对象类别校验其相应的审计开关是否开启,当前支持开启的全量对象如下,可以通过GUC参数audit_system_object控制:

                          typedef enum {    DDL_DATABASE = 0,DDL_SCHEMA, DDL_USER,DDL_TABLE,DDL_INDEX,DDL_VIEW,DDL_TRIGGER,DDL_FUNCTION,DDL_TABLESPACE,DDL_RESOURCEPOOL,DDL_WORKLOAD,DDL_SERVERFORHADOOP,DDL_DATASOURCE,DDL_NODEGROUP,DDL_ROWLEVELSECURITY,DDL_TYPE,DDL_TEXTSEARCH,DDL_DIRECTORY,DDL_SYNONYM} DDLType;

                          如果DDL操作的对象审计已开启则进行审计日志记录流程,在调用审计日志记录函数audit_report之前需要对包含密码的SQL语句进行脱敏处理,即将包含密码的语句中(create role/user)密码替换成‘********’用于隐藏敏感信息,至此针对create DDL语句的审计执行完成,其他类型DDL语句主体流程一致,不做赘述。

                          下面介绍针对DML语句审计执行逻辑pgaudit_ExecutorEnd,整体调用流程如下图6所示。

                          图片

                             

                          图6 DML审计执行流程

                          首先判断SQL查询语句所归属的查询类型,以CMD_SELECT类型为例,先获取查询对象的object_name用于审计日志记录中访问对象的记录,然后调用pgaudit_dml_table:

                            case CMD_SELECT:object_name = pgaudit_get_relation_name(queryDesc->estate->es_range_table);pgaudit_dml_table_select(object_name, queryDesc->sourceText);

                            和DDL的记录一样,同样会对敏感信息进行脱敏后调用审计日志记录接口audit_report,DML审计日志执行完成。

                            以上内容从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读,下篇将从数据动态脱敏方面对高斯数据库的数据保护技术进行解读,敬请期待~

                            本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15090.html

                            如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

                            相关文章

                            【C++篇】 异常处理

                            目录 1,异常的概念及使用 1.1,异常的概念 1.2,异常的抛出和捕获 1.3,栈展开 1.4,异常的重新抛出 1.5,异常安全问题 1.6,异常规范 2,标准库中的异常 小结: 1&…

                            QT修仙之路1-1--遇见QT

                            文章目录 遇见QT二、QT概述2.1 定义与功能2.2 跨平台特性2.3 优点汇总 三、软件安装四、QT工具介绍(重要)4.1 Assistant4.2 Designer4.3 uic.exe4.4 moc.exe4.5 rcc.exe4.6 qmake4.7 QTcreater 五、QT工程项目解析(作业)5.1 配置文件(.pro)5.2 头文件&am…

                            python实现情绪识别模块,并将模块封装成可执行文件

                            目录: 1.源码:2.情绪识别模型运行流程:3.模型封装需要注意的地方:4.未解决问题: 1.源码: https://gitcode.com/xyint/deep_learning.git 2.情绪识别模型运行流程: 需要获取用户摄像头权限&…

                            网络防御高级02-综合实验

                            web页面: [FW]interface GigabitEthernet 0/0/0 [FW-GigabitEthernet0/0/0]service-manage all permit 需求一,接口配置: SW2: [Huawei]sysname SW2 1.创建vlan [sw2]vlan 10 [sw2]vlan 20 2.接口配置 [sw2]interface GigabitEther…

                            Arbess基础教程-创建流水线

                            Arbess(谐音阿尔卑斯) 是一款开源免费的 CI/CD 工具,本文将介绍如何使用 Arbess 配置你的第一条流水线,以快速入门上手。 1. 创建流水线 根据不同需求来创建不同的流水线。 1.1 配置基本信息 配置流水线的基本信息,如分组,环境&…

                            MySQL下载过程

                            MySQL Enterprise Edition Downloads | Oracle mysql官方下载网址(9.2版本) 下面的示例是5.7的包,过程是一样的 port:3308(默认的是3306,笔者下了一个占用了该端口) root:123456 问题…

                            StochSync:可在任意空间中生成360°全景图和3D网格纹理

                            StochSync方法可以用于在任意空间中生成图像,尤其是360全景图和3D网格纹理。该方法利用了预训练的图像扩散模型,以实现零-shot生成,消除了对新数据收集和单独训练生成模型的需求。StochSync 结合了 Diffusion Synchronization(DS&…

                            Windows逆向工程入门之汇编环境搭建

                            公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…

                            【多模态大模型】系列1:CLIP【多模态领域开山之作】

                            目录 1 模型结构2 伪代码3 Loss计算方法 官方网站:https://openai.com/index/clip/ 论文:Learning Transferable Visual Models From Natural Language Supervision GitHub:https://github.com/openai/CLIP Colab:https://colab.r…

                            SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现

                            SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现 目录 SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来(优…

                            idea整合deepseek实现AI辅助编程

                            1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号,DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息,File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…

                            k8s部署elasticsearch

                            前置环境:已部署k8s集群,ip地址为 192.168.10.1~192.168.10.5,总共5台机器。 1. 创建provisioner制备器(如果已存在,则不需要) 制备器的具体部署方式,参考我之前的文章:k8s部署rab…

                            (done) openMP学习 (Day13: 线程私有数据和如何支持库(Pi again),蒙特卡洛计算 Pi,线性同余法)

                            url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 视频:https://www.bilibili.com/video/BV1SW411s7ST?s…

                            借助AI,轻松读好书

                            读书笔记 AI可以帮助我们写读书笔记,通过智能化的分类和标注技术,将我们的笔记进行分类整理,使其更加清晰易懂,帮助我们高效,准确,深入的总结和掌握书中的知识,实现更好的学习和成长。 《异类》…

                            【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化

                            博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯语言模型的发展历程:从统计方法到大规模预训练模型的演化1 统计语言模型(Statistical Language Model, SLM):统…

                            活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识

                            课程介绍 参加“Azure 在线技术公开课:基础知识”活动,培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动,扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…

                            python 语音识别方案对比

                            目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…

                            C# OpenCvSharp 部署MOWA:多合一图像扭曲模型

                            目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA:多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…

                            【Java】线上故障排查实战

                            引言 JVM命令详细可以看前一篇文章,本篇文章基于之前的命令做一次简单的线上故障排查分析 JVM常见命令 实战 1. 一般显示都是Linux系统,我们排查winodows系统想知道CPU和内存使用情况,打开任务管理器就可以出现图形化界面,而L…

                            编译spring 6.2.2

                            如何编译Spring 6.2.2 下载spring 6.2.2 首先,下载spring 6.2.2,地址:下载 解压到你的目录下。 下载gradle 下载gradle,这是spring项目的依赖管理工具,本文下载的是8.12.1 gradle下载 下载合适的JDK 本文下载的是…