PostgreSQL 4-1 pgaudit

1 使用pgaudt 1.1 常见SQL -- 1 ddl CREATE USER u1 PASSWORD 'u1.password'; CREATE TABLE t1(c1 INT, c2 TEXT); CREATE TABLE t2 (c1 INT, c2 TEXT); CREATE INDEX i1 ON t1(c2); -- 2 dml INSERT INTO t1 VALUES (1, 'aaa'), (2, 'bbb'), (3, 'ccc'); INSERT INTO t2 VALUES (1, 'aaa'), (5, 'bbb'); UPDATE t1 SET c2 = 'ddd' WHERE c1 < 3; DELETE FROM t1 WHERE c1 = 2; -- 3 select SELECT * FROM t1; -- 4 function SELECT c2 || '_oper' FROM t1; SELECT concat(c2, '_func') FROM t1; INSERT INTO t1 VALUES (5, concat('aaa', '_func')), (6, concat('aaa', '_func')); -- 5 multi INSERT INTO t1 SELECT * FROM t2; SELECT * FROM t1 JOIN t2 ON t1.c1 = t2.c1; CREATE TABLE t3 AS SELECT * FROM t2; DROP TABLE t1,t2,t3; 1 安装pgaudit 1.1 安装postgresql # 1 配置环境变量 echo 'export BUILD_ROOT=`pwd`' > pgenv echo 'export PG_HOME=$BUILD_ROOT/install' >> pgenv echo 'export PATH="$PG_HOME/bin:$PATH"' >> pgenv source pgenv # 2 下载源码 wget https://ftp.postgresql.org/pub/source/v14.18/postgresql-14.18.tar.gz tar -zxvf postgresql-14.18.tar.gz cd postgresql-14.18.tar.gz # 3 编译源码 (不开启debug模式,提高性能) #./configure --prefix=$PG_HOME --enable-debug=yes ./configure --prefix=$PG_HOME --enable-debug=no --enable-cassert=no make -sj make install -sj # ========================================== cd $BUILD_ROOT/pg14/contrib/pgaudit make install USE_PGXS=1 PG_CONFIG=$PG_HOME/bin/pg_config cd - # ========================================== # 4 初始化集群 initdb -D $PG_HOME/data # 4 配置集群 # echo "port = 54000" >> $PG_HOME/data/postgresql.conf # echo "max_connections = 1000" >> $PG_HOME/data/postgresql.conf # ========================================== echo "logging_collector = on" >> $PG_HOME/data/postgresql.conf echo "shared_preload_libraries = 'pgaudit'" >> $PG_HOME/data/postgresql.conf echo "pgaudit.log = 'ALL'" >> $PG_HOME/data/postgresql.conf echo "pgaudit.log_catalog = true" >> $PG_HOME/data/postgresql.conf echo "pgaudit.log_client = true" >> $PG_HOME/data/postgresql.conf echo "pgaudit.log_parameter = true" >> $PG_HOME/data/postgresql.conf echo "pgaudit.log_relation = true" >> $PG_HOME/data/postgresql.conf echo "pgaudit.log_rows = true" >> $PG_HOME/data/postgresql.conf echo "pgaudit.log_statement = true" >> $PG_HOME/data/postgresql.conf # ========================================== # 5 启动集群 pg_ctl start -D $PG_HOME/data # ========================================== DROP EXTENSION pgaudit; CREATE EXTENSION pgaudit; CREATE UNLOGGED TABLE adt(c1 TEXT); CREATE TABLE t1 (c1 INT); INSERT INTO t1 VALUES (1); \! ls $PG_HOME/data/log \! tail $PG_HOME/data/log/ # ========================================== 1.2 tpcc优化 echo " shared_buffers = 200GB work_mem = 1GB maintenance_work_mem = 4GB effective_cache_size = 500GB wal_buffers = 1GB checkpoint_timeout = 55min " >> $PG_HOME/data/postgresql.conf show shared_buffers; show work_mem; show maintenance_work_mem; show effective_cache_size; show wal_buffers; show checkpoint_timeout; 1.3 安装pgaudit # 1 下载源码 wget https://codeload.github.com/pgaudit/pgaudit/tar.gz/refs/tags/1.6.2 -O pgaudit-1.6.2.tar.gz tar -zxvf pgaudit-1.6.2.tar.gz # 2 编译 cd pgaudit-1.6.2 make install USE_PGXS=1 PG_CONFIG=$PG_HOME/bin/pg_config # 3 验证编译成功 ll $PG_HOME/share/extension cat $PG_HOME/data/postgresql.conf | grep shared_preload_libraries # 4 开启日志功能 echo "logging_collector = on" >> $PG_HOME/data/postgresql.conf echo "log_statement = all" >> $PG_HOME/data/postgresql.conf # 5 开启 pgaudit echo "shared_preload_libraries = 'pgaudit'" >> $PG_HOME/data/postgresql.conf echo " pgaudit.log = 'ALL'" >> $PG_HOME/data/postgresql.conf -- 1 安装pgaudit CREATE EXTENSION pgaudit; -- 2 查看配置参数 SHOW pgaudit.log; -- ALL -- READ: SELECT -- WRITE: INSERT, UPDATE, DELETE -- ROLE -- DDL -- FUNCTION -- MISC -- MISC_SET SHOW pgaudit.role; SHOW pgaudit.log_level; -- 查看审计文件 SHOW log_directory; SHOW log_filename; 审计策略:客户 优先3.0 ...

May 23, 2025 · 3 min · 514 words · Me

数据库安全 3 安全审计

摘要:从5个方面,介绍openGauss审计特性:背景、原理、使用、设计、实现 1 审计的背景 1.1 审计的原理 在使用数据库存取数据的大部分场景中,数据库具有以下特点: 对象多:一个数据库集群中有多个database对象,1个database对象中有多个schema对象,1个schema对象中有多个table、index等对象 用户多:一个数据库中,有多个用户,每个用户可访问的数据库对象不同 应用多:多个应用将数据存储在同一数据库集群中,并同时访问数据库集群 操作多:数据库提供丰富的功能,包括DDL、DML、DCL、运维等 运行久:一个数据库集群,可能会保持数十年运行 审计的主要目的,使记录数据运行过程中发生了哪些事件。审计的3要素是: 主体:一般指数据库用户 客体:一般指数据库对象,包括:集群、用户、连接、数据对象(database、schema、table、index、function等) 操作:主体对客体的操作,比如某个用户访问了某个表 1.2 审计的目的 审计具有以下重要意义: 攻击检测:通过检查审计日志,可判断是否发生网络安全攻击事件 例行维护:通过检查审计日志,可跟踪对某个对象的访问信息 故障检测:当数据库出现故障是,协助快速定位问题 合法合规:《网络安全法》等法律法规与表中中,要求应用具备审计功能 … 1.3 审计的功能 审计功能包含以下3个部分: 设置审计范围:通过数据库配置参数,或者数据库语法,定义哪些对象需要被审计 设置审计存储:通过数据库配置参数,定义审计日志如何存储 生成审计日志:数据库运行过程中,访问某个对象时,记录访问信息 管理审计日志:查询,删除,归档审计日志 1.4 oracle审计 oracle审计的发展: - oracle 8i及更早:支持传统审计 - oracle 12c:新增支持统一审计 - oracle 23ai:不支持传统审计,仅支持统一审计 oracle统一审计的使用: -- 1 创建审计策略 CREATE AUDIT POLICY ap1 PRIVILEGES CREATE TABLE, ALTER USER -- privilege 子句,记录所有使用CreateTable, AlterUser权限的操作 ACTIONS SELECT,INSERT,UPDATE ON t1 -- aciton 子句,记录所有对表t1执行SELECT,INSERT,UPDATE的操作 ROLES r1; -- role 子句,记录所有使用r1角色的操作 -- 2 启用审计策略 AUDIT POLICY ap1; -- 3 查看审计日志 SELECT * FROM UNIFIED_AUDIT_TRAIL; -- DBA_COMMON_AUDIT_TRAIL, DBA_AUDIT_SESSION, DBA_AUDIT_OBJECT, DBA_FGA_AUDIT_TRAIL SELECT * FROM DBA_AUDIT_TRAIL; os_username | username | userhost | terminal | timestamp | owner | obj_name | action | action_name | ------------+----------+----------+----------+-----------+-------+----------+--------+-------------+ | new_owner | new_name | obj_privilege | sys_privilege | admin_option | grantee | audit_option | ses_actions | +----------+----------+---------------+---------------+--------------+---------+--------------+-------------+ logoff_time | logoff_lread | logoff_pwrite | logoff_dlock | comment_text | sessionid | entryid | statementid | returncode | +-----------+--------------+---------------+--------------+--------------+-----------+---------+-------------+------------+ | priv_used | client_id | econtext_id | session_cpu | extended_timestamp | proxy_sessionid | global_uid | instance_number | +-----------+-----------+-------------+-------------+--------------------+-----------------+------------+-----------------+ os_process | transactionid | scn | sql_bind | sql_text | obj_edition_name | dbid | rls_info | current_user | +----------+---------------+-----+----------+----------+------------------+------+----------+--------------+ 其中,可设置的权限、操作等范围如下: ...

January 22, 2025 · 13 min · 2643 words · Me

海量 5 用例 G100审计重构

1 正常场景 CREATE USER u1 PASSWORD 'u1.password'; set role u1 password 'u1.password'; -- ddl DROP TABLE t1; DROP FUNCTION f1; CREATE TABLE t1(c1 INT, c2 TEXT); -- dml INSERT INTO t1 VALUES (1, 'aaa'), (2, 'bbb'); UPDATE t1 SET c2 = 'aba' WHERE c1 = 1; SELECT * FROM t1; DELETE FROM t1 WHERE c1 = 2; -- func CREATE FUNCTION f1() RETURNS INT AS $$ SELECT count(*)::INT FROM t1 $$ LANGUAGE sql; SELECT f1(); -- trans BEGIN; SELECT * FROM t1; COMMIT; DROP TABLE t1; DROP FUNCTION f1; reset role; select * from pg_audit_log; 2 异常场景 CREATE USER u1 PASSWORD 'u1.password'; CREATE TABLE st1(c1 INT, c2 TEXT); set role u1 password 'u1.password'; -- doest't exist SELECT * FROM nt1; -- permission deny SELECT * FROM st1; reset role; select * from pg_audit_log;

October 16, 2025 · 1 min · 133 words · Me

海量 5 设计 G100审计

G100审计功能重构 1 功能简述 在需求文档中,已详细介绍需求背景,此处不在重复介绍。 G100 309之前版本,审计特性存在较多问题,因此,在本版本,将重新设计与实现审计特性,解决功能、性能、易用性、可维护性、可扩展性等问题,使审计特性达到大规模商用的标准。 2 实现方案 一、审计架构 审计特性,核心子功能如下: 配置审计:通过GUC参数,配置审计参数:日志目录、目录大小、日志文件淘汰策略等 设置范围:通过SQL语法,设置审计策略,控制哪些事件需审计。在策略中,可按用户、操作、对象、操作结果等过滤事件 收集事件:在代码关键节点,收集事件 过滤事件:根据审计策略,过滤无需审计的事件 生成日志:提取事件关键信息,生成日志 传输日志:工作线程,通过共享内存,传输日志给审计线程 存储日志:审计线程,组织日志,并将其存储至文件中。文件存放在单独的日志目录 查询日志:通过内置FUNCTION,在线查询日志,通过TOOL,离线查询日志 其中,设置范围、过滤事件子功能相对独立,可单独设计与实现,所以,拆分到另一个的设计文档中。 审计特性整体架构图如下: 二、工作流程 收集事件的主体、操作、客体等信息时,因为需收集操作结果,即操作成功或失败,所以,很多场景中,收集事件需分为2个阶段: 执行操作前:收集事件基本信息,包括操作类型等 执行操作后:收集事件的操作结果。对于出现ERROR的场景,则在异常处理函数中收集操作结果。 在所有事件中,DML语句的事件稍复杂一点,此处主要以该类语句为例,梳理整体执行流程: 三、详细流程 阶段1 配置审计(进程启动) 首先,用户通过GUC参数,配置审计文件管理等功能。然后,在系统启动阶段,审计模块将根据配置,初始化的各类关键资源,包括: 日志文件:日志存储目录,初始日志文件等 审计内存:日志缓存区,内存上下文等 审计线程:信号处理函数等 事件收集节点:hook函数注册等 详细启动过程如下: main # 1. 启动vastbase进程 knl_instance_init MemoryContextInit PostmasterMain # 2. 启动postmaster线程 SelectConfigFiles # 3. 加载GUC参数 checkDataDir 'audit_dir_init' # 4. 创建审计日志文件目录 'audit_hook_init' # 5. 注册审计回调函数:身份认证等 load_hba reset_shared CreateSharedMemoryAndSemaphores # (日志缓冲区不是共享内存,后文阶段6详细介绍) GlobalSysDBCache::Init CreateLocalSysDBCache InitRoleIdHashTable 'audit_comm_init' # 6. 初始化审计内存上下文、日志缓存区,创建审计日志文件 'initialize_util_thread(AUDIT_WRITER)' # 7. 启动audit-writer 线程,持续读取日志缓冲区,等待接收与存储日志 initialize_thread .. # ===== audit-writer 线程 ============== GaussDbThreadMain InitShmemAccess InitAuxiliaryProcess CreateSharedMemoryAndSemaphores GaussDBAuxiliaryThreadMain BaseInit 'adt_writer_main' # ===== audit-writer 线程 ============== ServerLoop for (;;) comm_select ConnCreate # 9. 接收客户端连接 BackendStartup initialize_util_thread(WORKER) initialize_thread .. # ===== postgres 线程 ============== GaussDbThreadMain knl_thread_init InitializeGUCOptions CreateLocalSysDBCache 'audit_hook_init' # 10. 注册事件收集回调函数:计划执行、函数执行等回调点 BackendInitialize BackendRun PostgresMain # ===== postgres 线程 ============== 'initialize_util_thread(AUDIT_WRITER)' # 11. 检查audit-writer 线程状态与自动重启 阶段2 设置范围 向用户提供SQL接口,用于创建审计策略。(见另一个设计文档) ...

September 1, 2025 · 7 min · 1365 words · Me

海量 5 需求 G100审计

1 简介 1.1 目的 审计特性: 功能:收集数据库内的关键事件,例如启动集群、创建对象、查询数据等,根据事件生成与存储审计日志,向用户提供审计日志查询接口。 必要:从客户角度,使用审计特性,主要目的包括:合法合规、安全监控、事故调查等。从内核角度,为满足信创要求,数据库需达到CC标准,在CC标准中,对审计功能提出多项要求。 问题:G100审计特性存在多处设计缺陷,导致功能问题多、性能低、易用性差、可维护性差、可扩展性差等。到目前为止,其中累计识别50+缺陷,仍具有30+未识别缺陷。 历史:openGauss早期版本,华为以色列团队开发审计特性,交付标准为基本功能可用,与商用标准差距大。G100早期版本,由openGauss引入审计特性。在之后版本,G100进行多轮迭代。 本需求的目标是重构审计特性,解决功能、性能、易用性、可维护性、可扩展性等问题,使审计特性达到大规模商用的标准。 1.2 适用范围 G100 3.0.8 psu5以及之后版本 1.3 术语定义、首字母缩写词和缩略语 暂无 1.3 参考资料 原始需求:https://www.tapd.cn/tapd_fe/60475194/story/detail/1160475194001083526 国标查询下载网站: https://openstd.samr.gov.cn/bzgk/gb/index CC标准 《GB/T 20009-2019 信息安全技术 数据库管理系统安全评估准则》 《GB/T 20273-2019 信息安全技术 数据库管理系统安全技术要求》 信创标准 《SJ/T 11939-2024 安全可靠 集中式事务型数据库技术要求》 《T/AIA 016—2023信创产品测评 通用要求》 等保标准 《GB/T 25070-2019》信息安全技术 网络安全等级保护安全设计技术要求》 数据库政府采购标准:https://jx.mof.gov.cn/xxgk/zhengcefagui/202401/t20240105_3925117.htm 标准原文:微盘:https://drive.weixin.qq.com/s?k=AHUAfwdSAA87Z01xB G100审计特性:https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/2f4fb0e4adcc49f8b19dd4710f2a6549 G100审计历史客户需求:https://www.tapd.cn/tapd_fe/60475194/story/list?sort_name=created&order=&useScene=storyList&groupType=&conf_id=1160475194001046742&queryToken=fe85cdfc29d23bba423905c15d72d127&page=1 Oracle审计特性:https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/part_6.html 开源组件pgaudit:https://www.modb.pro/db/105894 需求分析与整理文档:语雀:https://www.yuque.com/u57264336/oav5h4/tkhcgdilcbpuqm09 2 G100审计功能重构 2.1 功能简述 一、需求背景:审计特性 审计目的:记录数据库内的各种事件,事件包括: 启动、恢复、切换、停止集群 登录、注销账号 创建、修改、删除数据库对象,包括:DATABASE、SCHEMA、TABLE等 插入、更新、删除、查询关系表 … 描述事件:每个事件中,有3个关键要素:<主体><操作><客体> 主体:一般是数据库用户 客体:集群、账号、DATABASE、SCHEMA、TABLE、FUNCTION等 操作:不同的客体,涉及的操作不一样。比如,对于TABLE,操作有:CREATE, INSERT, SELECT等。 审计日志:针对每个事件,收集与主体、操作、客体有关的信息,封装为1条审计日志。通常,1条审计日志中,包括的信息如下: 主体相关:用户名、客户端IP、会话ID等 操作相关:操作的类型、操作的时间、触发操作的SQL语句等 客体相关:客体类型、客体名称、客体属于哪个database、客体属于哪个schema 审计特性:为实现审计功能,在数据库内核中,需实现以下功能: 配置范围:对用户提供接口,配置需审计的事件范围 收集事件:在内核关键代码节点,发现事件,例如:登录用户、创建对象、查询数据等,收集主体、操作、客体相关信息 生成日志:按统一格式组织事件信息,生成审计日志 存储日志:将审计日志存储至磁盘 查询日志:对用户提供接口,查询日志 二、需求背景:G100审计特性(旧版本) G100早期版本,引入openGauss审计特性,但是,该特性存在较多问题,包括: ...

August 27, 2025 · 17 min · 3432 words · Me

海量 5 方案 G100审计重构

1 审计特性介绍 1.1 核心功能 1.2 整体架构(308.3) 1.3 工作流程(308.3) 1.4 文件组织 2 使用审计特性 2.1 配置审计特性 2.2 启动数据库 2.3 生成审计日志 2.4 查询审计日志 2.5 异常管理 3 审计特性变更点 3.1 问题分析 2.2 重构目标 2.3 问题分析(当前版本) 一、存储日志慢 二、检索日志慢 三、文件问题多 2.4 重构方案 一、存储日志重构 二、检索日志 2.5 重构开销 2.6 重构影响 2.7 性能测试 3 审计特性详细设计 3.1 架构设计 一、整体架构 二、工作流程 三、文件组织 3.2 详细设计 一、配置审计特性 二、审计文件管理 三、 启动数据库 四、生成审计日志 五、存储审计日志 六、审计日志一致性 七、归并审计日志 八、查询审计日志 4 审计后续重构计划 摘要 介绍审计特性,分析性能问题,提出优化方案,评审优化方案,规划其他计划 1 审计特性介绍 1.1 核心功能 审计特性:记录数据库内的各种事件,事件包括: ...

April 23, 2025 · 5 min · 994 words · Me

海量 9 用例 E100审计

1 adt_scope_ddl /* ============================= Operate create alter drop truncate prepare dealocate abort begin release savepoint analyze checkpoint commit commit prepared end rollback rollback prepare prepare prepare transcation rollback to savepoint savepoint start transaction call execute close explain cluster comment copy discard do declare move fetch grant revoke import listen notify unlisten load lock reassign refresh reindex reset set set constraints set role set session authorization set transcation show values Object: system user role group database table space schema table temp table forgien table index view materialized view sequence function procedure trigger aggregate larger object domain type cast conversion collation language rule forgien data wrapper server user mapping publication subscription privileges policy statistics routine text search configuration text search dictionary text search parser text search template operator operator class operator family access method extension -- ============================= */ -- fdw \c atlasdb CREATE EXTENSION postgres_fdw; CREATE USER u1 PASSWORD 'u1.password'; CREATE SERVER s1 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '172.16.100.134', port '5432', dbname 'fdb1'); GRANT ALL ON FOREIGN SERVER s1 TO u1; set role u1; CREATE FOREIGN TABLE t1 (c1 INT) SERVER s1 OPTIONS (schema_name 'public', table_name 'ft1'); CREATE USER MAPPING FOR u1 SERVER s1 OPTIONS (user 'fu1', password 'fu1.password'); -- common CREATE TABLE tbl(c1 INT, c2 TEXT); INSERT INTO tbl VALUES(generate_series(1, 100), 'bbbbbbbbb'); -- cursor | declare,fetch,move,close | (must in transaction block) BEGIN; DECLARE cu1 CURSOR FOR SELECT * FROM tbl; -- consider it as a cache for select result FETCH 3 FROM cu1; FETCH 3 FROM cu1; MOVE FORWARD 2 FROM cu1; CLOSE cu1; COMMIT; -- channel | listen,unlisten,notify -- session 1 LISTEN ch1; -- session 2 --> session 1, session 1 receive and cache message NOTIFY ch1, 'hello'; SELECT pg_notify('ch1', 'hello' || 'a'); UNLISTEN ch1; -- table | create,alter(rename,move),drop,lock,insert,update,select,delete CREATE TABLE tb1(c1 INT); ALTER TABLE tb1 ADD COLUMN c3(INT); ALTER TABLE tb1 RENAME COLUMN c3 TO c2; BEGIN; LOCK TABLE tb1 IN ACCESS EXCLUSIVE MODE; COMMIT; DROP TABLE tb1; -- materialized view CREATE MATERIALIZED VIEW mv1 AS SELECT * FROM tbl; -- dictionary & configuration | CREATE TEXT SEARCH DICTIONARY tsd1 ( TEMPLATE = snowball, language = english ); ALTER TEXT SEARCH DICTIONARY tsd1 (stopwords = english); CREATE TEXT SEARCH CONFIGURATION tsc1 (copy = english); ALTER TEXT SEARCH CONFIGURATION tsc1 ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH tsd1, simple; SELECT to_tsvector('tsc1', 'abc bb cc bb'); DROP TEXT SEARCH CONFIGURATION tsc1; DROP TEXT SEARCH DICTIONARY tsd1; -- domain | create,alter,drop CREATE DOMAIN do1 AS TEXT CONSTRAINT c1 CHECK ( VALUE ~ '^[0-9]+$' ) DEFAULT '3'; -- consider a group of 'check / not null / default' for column ALTER DOMAIN do1 ADD CONSTRAINT c2 CHECK (LEFT(VALUE, 1) < '5'); CREATE TABLE t1(c1 do1); INSERT INTO t1 VALUES ('12'); INSERT INTO t1 VALUES ('89'); INSERT INTO t1 VALUES (default); DROP TABLE t1; DROP DOMAIN do1; -- conversion | create | (need define c code) -- CREATE FUNCTION f1(integer, cstring, integer, cstring) RETURNS integer AS 'latin1_utf8', 'latin1_to_utf8' LANGUAGE C STRICT; -- CREATE CONVERSION co1 FOR 'LATIN1' TO 'UTF8' FROM f1; -- SELECT CONVERT('\xe4\xf6\xfc'::bytea, 'latin1_utf8_cnv'); -- DROP CONVERSION co1; -- DROP FUNCTION f1; -- user CREATE USER u1 PASSWORD 'u1.password'; CREATE USER u2 PASSWORD 'u2.password'; CREATE USER u3 PASSWORD 'u2.password'; ALTER USER u1 PASSWORD 'u1.newpass'; DROP USER u1; DROP USER IF EXISTS u1,u2,u3,u4; -- type CREATE TYPE int_2 AS (a INT, b INT); -- synonym (only oracle) CREATE TABLE t1 (c1 INT); CREATE SYNONYM s1 FOR t1; CREATE PUBLIC SYNONYM ps1 FOR t1; SELECT * FROM s1; SELECT * FROM ps1; DROP SYNONYM s1; DROP SYNONYM ps1; -- aggregate CREATE FUNCTION f_add_a_int(state bigint[], val int) RETURNS bigint[] LANGUAGE sql AS $$ SELECT ARRAY[state[1] + val, state[2] + 1] $$; CREATE FUNCTION f_avg_final(state bigint[]) RETURNS numeric LANGUAGE sql AS $$ SELECT state[1]::numeric / state[2] $$; CREATE AGGREGATE a_int_avg(int) ( SFUNC = f_add_a_int, STYPE = bigint[], FINALFUNC = f_avg_final, INITCOND = '{0,0}' ); SELECT a_int_avg(v) FROM generate_series(1,6) v; DROP AGGREGATE a_int_avg(int); DROP FUNCTION f_add_a_int; DROP FUNCTION f_avg_final; 2 adt_scope_dcl 3 adt_scope_dml 4 adt_scope_dql 5 adt_scope_tcl 6 adt_scope_func 7 adt_scope_mng 8 adt_scope_misc

July 25, 2025 · 4 min · 666 words · Me

海量 9 设计 E100审计

1 E100审计功能 1.1 功能简述 【审计功能】 审计是重要的安全特性,核心功能是收集数据库内的事件,例如:登录用户、创建对象、查询数据等,根据事件生成与审计日志,存储审计日志,向用户提供日志查询接口。使用方式请看需求文档。 【审计架构】 审计整体架构如下图所示:(“线程“替换为“进程”,原图不小心弄丢了,不好修改了,将就看) 【审计流程】 1.2 实现方案 一、启动审计进程 1. 启动postmaster进程 # PostmasterMain 2. 加载GUC参数 # SelectConfigFiles 2.1 '---加载审计GUC---' 3. 创建共享内存和信号量 # reset_shared -> CreateSharedMemoryAndSemaphores 3.1 计算共享内存总大小 '计算审计共享内存大小:根据GUC配置' 3.2 创建共享内存 # PGSharedMemoryCreate 3.3 创建LwLock # CreateLWLocks 3.4 初始化wal-buffer共享内存 # XLOGShmemInit 3.5 初始化share-buffer共享内存 # InitBufferPool 3.6 '如果开启审计:初始化审计共享内存:划分共享内存,包括audit-buffer' 4. 启动sys-log进程 # SysLogger_Start 5. '如果开启审计:初始化审计模块' 5.1 '日志目录:检验与创建审计日志目录' 5.2 '日志文件:每次重启,使用新的日志文件,方便用户单个删除日志文件' 5.3 '内存上下文:创建审计全局内存上下文' 5.4 '审计缓存区:初始化audit-buffer' 5.5 '审计文件:初始化审计文件(并发write, read, delete日志)' 5.6 '回调函数:在执行DDL、计划、函数等关键函数中,注册生成审计事件、日志的回调函数' # 后面详细介绍 6. '如果开启审计:启动审计进程' 6.1 '信号:注册信号处理函数:sighup, sigquit, sigusr1' 6.2 '显示:设置ps命令显示的进程信息' 6.3 主循环 6.4 '等待事件:关键是timeout' 6.5 '存储日志:读取audit-buffer中待落盘的日志,并存储' # 后面详细介绍 6.6 '调整速率:按照每次落盘数据的长度,动态调整timeout' 连续多次为0,timeout依次变为1ms, 100ms, 1s 单次落盘长度大于16m,timeout=0 7. '主循环' # ServerLoop 7.1 接收客户端连接 # select 7.2 创建postgres进程 # BackendStartup -> BackendRun -> PostgresMain 7.3 检查与重启sys-log进程 # SysLogger_Start 7.4 '检查与重启审计进程' 7.5 检查与重启checkpointer进程 # StartCheckpointer 7.6 检查与重启wal-writer进程 # StartWalWriter 二、收集审计事件 目前,只有以下2类进程,会生成审计事件: ...

July 22, 2025 · 5 min · 944 words · Me

海量 9 需求 E100审计

1 简介 1.1 目的 审计是重要的安全特性,功能是收集数据库内的事件,例如创建对象、查询数据等,根据事件生成与存储审计日志,并向用户提供查询审计日志的接口。 在303.7版本,E100首次引入审计特性,本文介绍E100审计特性的对外接口、功能约束、使用方式等信息。 1.2 适用范围 E100,303.7及之后的版本 1.3 术语定义、首字母缩写词和缩略语 无 1.3 参考资料 G100审计特性:https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/2f4fb0e4adcc49f8b19dd4710f2a6549 Oracle审计特性:https://docs.oracle.com/en/database/oracle/oracle-database/23/dbseg/part_6.html 开源组件pgaudit:https://www.modb.pro/db/105894 G100审计重构方案:https://doc.weixin.qq.com/doc/w3_AdwAfAa7AFkCNFLkO0AXJSUK7CICd?scode=AHUAfwdSAA8DKRU1G1AdwAfAa7AFk&version=4.1.38.6011&platform=win pg 14完整语法:https://www.postgresql.org/docs/14/sql-commands.html 2 E100审计特性 2.1 功能简述 【审计特性】 审计特性,主要功能是记录数据库内的各种事件,并向用户提供查询事件的接口。事件包括: 启动、恢复、切换、停止集群 登录、注销账号 创建、修改、删除数据库对象,包括:DATABASE、SCHEMA、TABLE等 插入、更新、删除、查询关系表 … 【审计事件】 数据库内发生的事件,都可描述为<主体><操作><客体> 主体:一般是数据库用户 客体:集群、账号、数据对象等 操作:针对不同客体,操作类型不一样。比如,对于TABLE,操作类型有:CREATE, INSERT, SELECT等。 【审计日志】 发生事件时,审计特性会收集事件中的信息,将事件封装审计日志,审计日志中的关键内容包括: 主体信息:用户名 操作信息:操作类型、操作时间、操作的SQL语句等 客体信息:客体类型、客体名称、客体属于哪个database、客体属于哪个schema 【审计流程】 使用审计特性时,主要包括以下几个流程: 配置审计功能:用户提前配置审计范围,即配置哪些事件需被审计。 生成审计日志:用户操作数据库时,产生审计事件,例如创建表、删除表等。内核收集事件信息,生成审计日志。 存储审计日志:内核存储审计日志至磁盘。 查询审计日志:用户查询审计日志,内核从磁盘读取审计日志。 删除审计日志 一个简单示例如下图所示: -- 1. 配置审计功能:确定哪些事件需审计 -- 2. 生成审计日志:用户执行SQL,产生事件<用户><创建><表>,根据事件生成日志 CREATE TABLE t1 (c1 INT, c2 TEXT); -- 3. 存储审计日志:内核自动存储日志 -- 4. 查询审计日志 SELECT * FROM pg_audit_log(); -- 预期输出(横向输出) -[ RECORD 1 ]--------------------------------- scope | subject | u1 -- 主体信息:用户名 optype | create -- 操作信息:create操作 optime | 2025-07-18 18:15:17.400009+08 -- 操作时间 opresult | object | table -- 客体信息:客体类型 objdb | postgres -- 客体信息:客体属于哪个database objnsp | public -- 客体信息:客体属于哪个schema objname | t1 -- 客体信息:客体名称 opxid | optid | pid | sql | create table t1(c1 int); -- 触发操作的SQL extra | 【友商对比】 对比oracle、opengauss/g100、pgaudit ...

July 18, 2025 · 8 min · 1655 words · Me

海量 9 接口 E100审计

配置审计功能 通过GUC配置审计功能,新增GUC如下: 编号 参数名 默认值 取值范围 功能 1 enable_audit off on, off 控制是否开启审计功能 2 aduit_directory 空 任意绝对路径 审计日志存储目录,确保数据库用户有权访问。如果取值为空,则默认存储于”数据目录/vb_audit”下 3 audit_directory_size 64M [64M, -] 审计日志目录最大空间,如果文件目录达到限制时,最旧的日志文件将被新文件覆盖 4 audit_scope ddl all, ddl, insert, update, select, delete, function 审计范围。可设置多个范围,示例:”ddl, update, delete” 5 audit_buffer_size 16M [1M, 1G] 内存中,审计日志缓冲区大小 6 audit_detail basic,event,sql basic,event, sql 控制审计日志详细程度 7 audit_unclassfied on 启动审计功能 设置审计参数后,重启数据库,内核关键变化如下: 申请共享内存:工作线程生成日志后,将日志写入共享内存,该内存为审计日志缓冲区,缓冲区大小由GUC参数audit_buffer_size控制 新增进程:新增1个线程,负责将审计缓存区中的日志,存储至文件 生成审计日志 执行SQL语句时,如果SQL语句在审计范围内,内核一般会生成1条审计日志,如果SQL语句较复杂,语句中多个子操作会生成多条审计日志。 审计日志中,记录的内容如下: 日志字段 示例 解释 主体类型 user 目前,主体类型只支持用户类型 主体名称 u1 执行操作的用户,即执行SQL前,与数据库建立连接的用户 操作类型 create 针对不同类型的对象,操作不同,例如,针对表有create, insert, select, ..等操作 操作时间 2025-05-01 12:00:01 678956 格式:年-月-日 时-分-秒 微秒 操作XID 20000 事务ID 操作LSN 0/170F5F0 该日志对应的SQL语句,最新生成的XLOG的写入位置 对象类型 table 数据库对象类型,包括database, schema, table, view, … 对象名称 t1 数据库对象名称 对象数据库 db1 对象属于哪个database 对象命名空间 sch1 对象属于哪个schema SQL语句 CREATE TABLE t1(c1 INT, c2 TEXT) 执行操作的原始SQL语句 存储审计日志 在审计目录下,审计文件设计如下: 命名:格式为:adt_年_月日_时分_秒_微秒.alog,文件名中包含文件创建时间 示例: ...

June 17, 2025 · 3 min · 571 words · Me
心情不好的时候可以点一下 🐱
×
🤖 Doubao AI ×
Hi! 我是你的技术助手。关于代码、架构或 Bug,随时问我!🚀