海量 4 需求 scram-sha256

深信服支持pg scram-sha256需求 需求目标 本需求的根本目标时,当vastbase server要求使用sha256算法进行身份认证时,postgresql client能与vastbase server建立连接。 该需求目前仅合入深信服分支 需求分析 身份认证的详细流程有点复杂,此处简要概述为2个阶段: 标识:新建用户时,server计算并存储密码哈希值 鉴别:用户登录时,server向client发送计算密码哈希值的关键信息,client计算并向server发送密码哈希值,server校验其是否符合存储的值 vastbase和postgresql对比,server计算密码哈希值的算法不同,server向client发送关键信息也不同。为解决pg-client能够连接vb-server的问题,需解决问题如下: vb-server计算并存储与pg-server一致的密码哈希值 vb-server向pg-client发送密码哈希值关键信息时,需要pg-server一致 postgreql的标识与鉴别机制,符合标准RFC-5802,涉及的算法与协议,本文统一称为scram-sha256。vastbase涉及的算法与协议,本文统一称为sha256。 需求实现 密码存储:新建用户时,修改存储用户密码的值 修改前:guc参数password_encrypt_type,取值1时,vb-server存储密码的[sha256, md5]值;取值为2时,存储密码的[sha256]值 SELECT rolpassword FORM pgauthid; -- 示例:长度为209 rolpassword -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- sha256af99537f242c661a88acea99ac626a2cf8fe196ac5671db6f02ed6818b420cf84e7ada61d66602c6eb5bf4ced40911d3f51865959784ebc3b0d385ca4c08f3398f05e16268fe9acc95a2d662bf5033b15d53abd1f835c1a3f1e96343a5cbf800ecdfecefade 修改后:guc参数password_encrypt_type,取值1时,vb-server存储密码的[sha256, md5, scram-sha256]值;取值为2时,存储密码的[sha256, scram-sha256]值 SELECT rolpassword FORM pgauthid; -- 示例:长度342 (新增长度:133) rolpassword -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- sha256af99537f242c661a88acea99ac626a2cf8fe196ac5671db6f02ed6818b420cf84e7ada61d66602c6eb5bf4ced40911d3f51865959784ebc3b0d385ca4c08f3398f05e16268fe9acc95a2d662bf5033b15d53abd1f835c1a3f1e963SCRAM-SHA-256$4096:sp5V1hrLKzLsS4HtQgqTuA==$QO/UVdrXxIypzBEGqEuIWe96A80elghFQs25ZbdPsLg=:J4lPXmXPANtTMOkaHokMjmM19K1Di7fU6WRWuZ5VmS0= 认证协议:用户登录时,修改向客户端发送的密码哈希值关键信息 修改前: # 身份认证协议 1. client <-> server : tcp connect 2. client --> server : send [消息类型:0, 协议版本:3.51,连接参数:user_name, databse, ...] 3. server --> client : send [消息类型:R, 哈希算法:10, 系统表存储的密码的算法:2, 计算密码哈希关键信息:salt,token,iteration] 4. client <-> server : # 省略3次交互 修改后: ...

April 3, 2025 · 6 min · 1256 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

海量 6 设计 greenplum

1 需求分析 透明加密 主密钥 动态脱敏 和统一审计共用resource lable模块 全密态 密态等值 密态非等值 范围查询:OPE保序加密 模糊查询 内置函数 排序 .. 防篡改 分布式:有点麻烦,区块链记录在每个节点上 哈希函数:md5 1.1 透明加密 模块分析 密钥管理 设置主密钥 定义加密属性 表:普通表、临时表、分区表、toast表 索引 xlog 加密数据 加密算法:aes-256-ctr, sm4-ctr 备机加密 -- 创建主密钥 -- 设置表加密 CREATE TABLE t1 (c1 INT, c2 TEXT) WITH (enable_tde=on); -- 验证数据加密存储 INSERT INTO t1 VALUES (1, 'bbbcccddd'); 1.2 动态脱敏 -- 开启脱敏功能 gs_guc reload -D $GAUSSHOME/data -c "enable_security_policy=on" -- 创建表 CREATE TABLE t1 (c1 TEXT, c2 TEXT); INSERT INTO t1 VALUES ('bbccdd', 'bbccdd'); -- 创建用户 CREATE USER u1 PASSWORD 'u1.password'; CREATE USER u2 PASSWORD 'u2.password'; GRANT SELECT ON t1 TO u1; GRANT SELECT ON t1 TO u2; -- 创建资源标签(只对u1脱敏) CREATE RESOURCE LABEL l1 ADD COLUMN(t1.c1); CREATE MASKING POLICY m1 randommasking ON LABEL(l1) FILTER ON ROLES(u1); -- 验证脱敏:只有u1脱敏 SET ROLE u1 PASSWORD 'u1.password'; SELECT * FROM t1; RESET ROLE; SET ROLE u2 PASSWORD 'u2.password'; SELECT * FROM t1; RESET ROLE; -- 清理环境 DROP MASKING POLICY m1; DROP RESOURCE LABEL l1; DROP TABLE t1; DROP USER u1,u2; 1.3 全密态 模块分析 客户端 语法解析 语义分析 加密 服务端 .. 1.4 防篡改 hash算法:md5 2 greenplum yum install zstd libzstd-devel krb5-devel krb5-libs cyrus-sasl-gssapi libevent-devel libyaml-devel libxml2 libxml2-devel curl libcurl-devel yum install apr apr-devel apr-util apr-util-devel yum install expat-devel openldap-devel bzip2 bzip2-devel xerces-c xerces-c-devel python36-devel ln -s /usr/include/python2.7/Python.h /usr/include/Python.h # 报错就降级 yum downgrade expat-2.1.0-12.el7 mkdir install cd install # echo ''使用单引号可防止变量$PATH等展开 echo ' export GPHOME=`pwd`/install export BINARYLIBS=`pwd`/../third export GCC_PATH=$BINARYLIBS/buildtools/gcc10.3 export CC=$GCC_PATH/gcc/bin/gcc export CXX=$GCC_PATH/gcc/bin/g++ export LD_LIBRARY_PATH=$GCC_PATH/gcc/lib64:$GCC_PATH/isl/lib:$GCC_PATH/mpc/lib/:$GCC_PATH/mpfr/lib/:$GCC_PATH/gmp/lib/:$LD_LIBRARY_PATH export PATH=$GCC_PATH/gcc/bin:$PATH ' > genv # 建议把环境变量再在~/.bashrc中写一份,因为初始化集群时,需要ssh登录,以初始化segment节点 ./configure --with-python --with-libxml --with-gssapi --without-zlib --with-gpcc --prefix=$GPHOME make -sj 16 make install -sj 16 echo " ARRAY_NAME="Greenplum Cluster" SEG_PREFIX=gpseg #segment数据库前缀名 PORT_BASE=40000 #segment数据库起始端口号 declare -a DATA_DIRECTORY=(//home/shenkun/gp/install/segdata) #segments数据目录,有几个DATA_DIRECTORY, 每个节点上便会启动几个segment,本例为2个segment MASTER_HOSTNAME=master #master主机名 MASTER_DIRECTORY=/home/shenkun/gp/install/master #master数据目录 MASTER_PORT=5000 #master端口号,也是对外业务端口号 TRUSTED_SHELL=ssh CHECK_POINT_SEGMENTS=8 ENCODING=UNICODE DATABASE_NAME=gpdb MACHINE_LIST_FILE=/home/shenkun/gp/install/hostfile #集群配置文件,hostfile对应7中创建的文件名 " > gpcfg echo "master" > hostfile gpinitsystem -c gpcfg -a psql -p 5000 -d gpdb PGOPTIONS='-c gp_session_role=utility' psql -p 40000 -d gpdb # @ master exec_simple_query pg_parse_query pg_analyze_and_rewrite pg_plan_queries pg_plan_querie planner standard_planner subquery_planner cdbllize_adjust_top_path create_plan cdbpathtoplan_create_flow makeFlow cdbllize_decorate_subplans_with_motions PortalStart ExecutorStart standard_ExecutorStart CdbDispatchPlan # @ segment exec_mpp_query deserializeNode PortalStart PortalRun PortalDrop PortalRun PortalRunMulti ProcessQuery ExecutorStart ExecutorRun standard_ExecutorRun ExecutePlan ExecutorFinish ExecutorEnd PortalDrop

May 15, 2025 · 2 min · 338 words · Me

海量 8 需求 海康身份认证

本需求包含6个小需求: 身份认证:创建用户:CREATE/SET USER .. PASSWORD ..,密码可以只设置2类字符 身份认证:创建用户:CREATE/SET [角色] USER ..,角色支持指定SUPERUSER和NOSUPERUSER 身份认证:查看用户:SELECT .. FROM pg_user,普通用户可查询pg_user视图(仅pg兼容性) 身份认证:登录用户:SET ROLE new_user [PASSWORD ..],new_user是会话用户时,可以不指定PASSWORD 访问控制:Database权限:普通用户可访问template1数据库(仅pg兼容性) 访问控制:Schema权限:普通用户可在public下执行CREATE操作(仅pg兼容性) 描述 身份认证:创建用户 变更:用户密码可以只包含2类字符 -- password_polcy取值不同,密码需包含的字符种类数不同,为1时需3类,需2时需4类,为3时需2类 ALTER SYSTEM SET password_policy OT 3; -- 修改取值范围[0,2]为[0,3] CREATE USER u1 PASSWORD 'password1'; -- 此时,密码可以只含2类字符 ALTER USER old_user PASSWORd 'password1'; 身份认证:创建用户 变更:可以指定SUPERUSER角色 CREATE USER u1 SUPERUSER PASSWORD ..; -- 支持设置 SUPERUSER 角色 ALTER USER u1 NOSUPERUSER ..; -- 支持取消 SUPERUSER 角色 ALTER USER old_user SUPERUSER ..; 身份认证:查看用户 变更:普通用户可查询pg_user视图(仅pg兼容性) ...

June 30, 2025 · 7 min · 1446 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
心情不好的时候可以点一下 🐱
×
🤖 Doubao AI ×
Hi! 我是你的技术助手。关于代码、架构或 Bug,随时问我!🚀