暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

海量智库第38期 | 早发现,早预防!语句序列审计:识别数据潜在安全威胁

海量数据库 2025-07-04
125


数据库审计是数据库安全防御体系的重要组成部分。其中,语句序列审计作为数据库安全领域中的一种高级审计技术,能够为用户的数据安全提供可靠保障。它能够记录特定会话(Session)或事务(Transaction)中语句执行的完整先后顺序,不仅记录"做了什么",还能记录"做的顺序",帮助用户及时发现和预防安全威胁。

本期海量智库将为大家介绍语句序列审计的功能以及海量数据库Vastbase的实现原理


01

语句序列审计与统一审计机制


学习语句序列审计之前,先来了解下什么是统一审计机制。


统一审计机制是一种通过定制审计策略实现高效安全审计管理的技术。审计策略中包含要审计的对象及行为。当管理员定义审计策略后,用户执行的任务如果关联到对应的审计策略,则记录审计日志并产生审计响应。定制化审计策略可涵盖常见的用户管理活动、DDL和DML行为,满足日常审计诉求。


语句序列审计功能则是基于统一审计功能扩展而来。它不同于简单的单条SQL语句审计,而是通过记录和分析连续执行的语句序列来识别潜在的安全威胁或异常操作模式。


语句序列审计与普通审计的区别如下:

特性

普通审计

语句序列审计

记录粒度

单条语句

有顺序的语句序列

分析维度

独立操作

连续操作

典型应用

合规检查

行为分析/攻击检测


在统一审计机制中,与语句序列审计功能相关的主要约束及配置主要有以下几点:


  • 统一审计仅审计用户通过客户端执行的SQL语句,而不会审计数据库内部SQL语句。

  • 统一审计策略需要由初始用户或具备POLADMIN或SYSADMIN属性的用户创建,普通用户无访问安全策略系统表和系统视图的权限。

  • 统一审计功能由GUC控制,相关GUC功能及取值如下:

语句序列审计则继承了统一审计功能的GUC以及统一审计整体处理逻辑,另外新增了以下拓展点:


  • 新增GUC单独控制语句序列审计功能的开启和关闭:

  • 扩展统一审计策略增删改SQL语法,支持语句序列审计策略的增删改。

02

语句序列审计功能使用


语句序列审计功能新增3个语法,支持创建、修改、删除语句序列审计策略,语法格式如下:

-- 创建
CREATE AUDIT POLICY [IF NOT EXISTS] policy_name SEQUENCE BY ['SQL'] [normally | warning | block];
-- 修改
ALTER AUDIT POLICY [IF EXISTS] policy_name ADD SEQUENCE BY ['SQL'];
-- 删除
DROP AUDIT POLICY [IF EXISTS] policy_name;


其中 ['SQL'] 表示需要审计的通过客户端执行的SQL语句,支持的 SQL 语句如下:

  • DDL 语句:CREATE、ALTER、DROP、ANALYZE、COMMENT、GRANT、REVOKE、SET、SHOW;

  • DML 语句:SELECT、COPY、DEALLOCATE、DELETE、EXECUTE、INSERT、PREPARE、REINDEX、TRUNCATE、UPDATE。

  • [normally | warning | block]表示审计策略的响应动作,若不指定,则默认响应动作为 normally。

  • normally:响应动作为写普通级别日志。

  • warning:响应动作为写告警日志。

  • block:响应动作为阻断当前会话。


每次仅能添加一条SQL语句到审计策略中,SQL 语句应被单引号及方括号包围。在 MySQL兼容模式下,客户端执行的SQL必须与策略中定义的SQL大小写完全一致时,才会触发审计。


下面列举一个简单的示例。


--1.启动语句序列审计功能
vb_guc reload -D $PGDATA -c "audit_enabled = on"
vb_guc reload -D $PGDATA -c "enable_security_policy = on"
vb_guc reload -D $PGDATA -c "audit_sequence_enabled = on"

--2. 创建基于语句序列的审计策略;修改策略,向策略追加 SQL 语句
CREATE AUDIT POLICY audit_p1 SEQUENCE BY ['CREATE TABLE audit_seq0(id int);'];
ALTER AUDIT POLICY audit_p1 ADD SEQUENCE BY ['INSERT INTO audit_seq0 VALUES(1);'];
ALTER AUDIT POLICY audit_p1 ADD SEQUENCE BY ['SELECT * FROM audit_seq0;'];

--3. 清理审计日志
SELECT * FROM pg_delete_audit(now()-1,now());

--4. 在客户端会话中按顺序执行策略中的 SQL 语句
CREATE TABLE audit_seq0 (id int);
INSERT INTO audit_seq0 VALUES(1);
SELECT * FROM audit_seq0;

--5. 查看审计日志,返回结果如下
SELECT type,result,detail_info FROM pg_query_audit(now()-0.01,now()) where type='audit_policy';
-- 示例输出:
    type   |    result    |                                        detail_info

--------------+--------+------------------------------------------------------------------------------------------------------------------------------------------
--------------------
audit_policy |ok | vastbase|vsql|local|vastbase|sequence||CREATE TABLE audit_seq0(id int)|INSERT INTO audit_seq0 VALUES(1)|SELECT * FROM audit_seq0|28626|no
rmally|
(1 rows)


03

Vastbase语句序列审计功能原理

首先,来了解系统表gs_auditing_policygs_auditing_policy_sequence。


系统表gs_auditing_policy用来存储和管理统一审计策略的相关信息。该表的字段和字段含义如下:

字段名称

类型

描述

oid

oid

行标识符(隐含属性,必须明确选择),表示审计策略的唯一标识符。

polname

name

策略名称,需要唯一,不可重复。

polcomments

name

策略描述字段,记录策略相关的描述信息,通过COMMENTS关键字体现。

modifydate

timestamp without time zone

策略创建或修改的最新时间戳。

polenabled

boolean

表示策略启动开关。

pollevel

name

表示策略等级。


创建语句审计策略时,Vastbase会为语句审计策略分配唯一的策略oid,并将策略名、策略oid、策略响应动作等信息记录在系统表gs_auditing_policy中。


CREATE AUDIT POLICY audit_p1 SEQUENCE BY ['CREATE TABLE audit_seq0(id int);'];

SELECT polname,oid,pollevel FROM gs_auditing_policy WHERE polname = 'audit_p1';
-- 示例输出:
 polname | oid   | pollevel
---------+-------+------------
 audit_p1| 19216 | normally
 (1 rows)


系统表gs_auditing_policy_sequence用来存储和管理语句序列审计策略的相关信息。该表的字段和字段含义如下:

字段名称

类型

描述

polname

name

策略名称,需要唯一,不可重复。

policyoid

oid

所属审计策略的oid,通过policyoid字段,可以将gs_auditing_policy_sequence表中的记录与gs_auditing_policy表中的特定审计策略关联起来。

firstsqllen

integer

表示语句序列中第一条SQL的长度。

polenabled

boolean

表示策略启动开关。

sqlsequence

text

表示语句序列,格式形如:SQL1 | SQL2 | SQL3


创建该策略时,Vastbase将策略名、策略oid、要审计的语句序列、语句序列中第一条SQL的长度等记录在系统表gs_auditing_policy_sequence中。


CREATE AUDIT POLICY audit_p1 SEQUENCE BY ['CREATE TABLE audit_seq0(id int);'];

SELECT polname,sqlsequence,firstsqllen FROM gs_auditing_policy_sequence WHERE polname = 'audit_p1';
-- 示例输出:
 polname | sqlsequence                     | firstsqllen
---------+---------------------------------+------------
 audit_p1| create table audit_seq0(id int) | 28
 (1 rows)


数据库服务端通过系统表gs_auditing_policygs_auditing_policy_sequence中配置的审计策略,实时监控数据库中用户执行的连续语句序列。系统会基于这些策略规则记录符合审计条件的用户行为,实现完整的语句序列审计功能,仅限具有系统管理员或安全策略管理员权限的用户访问上述系统表。


• END •


往期推荐


关于海量数据


北京海量数据技术股份有限公司(股票代码:603138.SH)成立于2007年,是国内首家以数据库为主营业务的主板上市企业。公司十余年来秉承“专注做好数据库”的初心,始终致力于数据库产品的研发、销售和服务。核心产品海量数据库Vastbase系列、数据库一体机Vastcube系列,全栈国产化,应用满足度高,目前广泛应用于政务、制造、金融、通信、能源、交通等多个重点行业,已成为国产企业级数据库的首选之一。





文章转载自海量数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论