数据库安全 5 全密态

0 基础调研 一、运算符 二、数据类型 1 架构设计 工作计划 Table 1: Scan Nodes Table 2: Join Nodes Table 3: Processing Nodes Table 4: Set & Control Nodes 单独说明:Table Function Materialization(表函数物化计算) 2 驱动加密 - 实现 2.1 新增类型ciphera 2.2 新增系统表pg_key 2.3 新增语法DATA KEY 2.4 新增系统表pg_sec_class 2.4 新增语法ENCRYPT 2.5 新增公共语法解析libgram 2.6 libpq重写INSERT 2.7 libpq重写SELECT结果 2.8 新增支持int类型 3 机密计算 - 实现 3.1 简单计划 3.2 支持范围 一、数据类型 二、操作符与函数 3.2 新增libcalc 3.2 新增ta_calc/ca_calc 3.3 内核新增ciphera函数 3.4 内核新增ciphera运算符 3.5 内核make_op识别机密计算 3.6 index_scan算子 3.6 优化 ca/ta通信 4 测试用例 等值查询 范围查询 模糊查询 附录:专利 附录:AI 代码要求: 附录:参考文献 0 基础调研 一、运算符 运算符 以int4为例:select proname from pg_catalog.pg_proc where proname like '%int4%' order by proname; 一、比较运算符函数 ...

June 24, 2026 · 13 min · 2649 words · Me

数据库安全 9 透明加密

1 透明加密背景 在另一篇博客中,已经讨论了几个话题: 数据泄露风险 加密方案对比 透明加密基本原理 因此,本篇博客直接进入主题,介绍openGauss透明加密特性。 2 透明加密使用 2.1 开启透明加密 2.2 定义加密表 CREATE TABLE t1 (c1 INT, c2 TEXT) WITH (enable_tde=on); 2.3 验证数据加密 3 透明加密设计 4 透明加密原理 1 概述 1.1 模块 heapam -> buffer -> smgr -> page 1 概述 1.1 功能 用户创建表时,通过SQL语句指定表是否加密 数据库将数据页写入磁盘时,判断如果数据页属于加密表,对数据先加密在存储 数据库从磁盘读取数据页时,判断如果数据页已被加密,读取后马上解密 1.2 适配点 初始化page 存储page 读取page 生成xlog记录:考虑初始化pagee 重放xlog记录:考虑初始化page 1.3 kun tde 2 调用关系 2.1 初始化数据页 PageInit PageInit(Page page, Size pageSize, Size specialSize) heap_xlog_insert() heap_xlog_multi_insert() heap_xlog_update() heap_xlog_visible() raw_heap_insert() PageGetTempPageCopySpecial() fill_seq_with_data() seq_redo() brin_page_init() lazy_scan_heap() GinInitPage() GISTInitBuffer() _hash_pageinit() _bt_pageinit() SpGistInitPage() vm_readbuf() vm_extend() XLogRecordPageWithFreeSpace() fsm_readbuf() fsm_extend() image 2.2 写入数据页 smgrextend 调用栈: ...

January 21, 2025 · 3 min · 483 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

数据库安全 统一管理

2 使用方法 2.1 设置安全策略 表级 CREATE TABLE t1 (c1 INT, c2 TEXT); -- 1 身份认证 -- 2 安全传输 -- 3 安全审计 CREATE SECURITY POLICY ad1 ON t1 USE (type='security audit', scope='create, insert, update'); -- 4 访问控制 CREATE SECURITY POLICY ac1 ON t1 USE (type='access control', group='user1, user2, user3'); -- 5 数据发现 -- 6 数据防篡改 CREATE SECURITY POLICY lga ON t1 USE (type='ledger'); -- 7 加密函数 -- 8 透明加密 CREATE SECURITY POLICY se1 ON t1 USE (type='storage encrypt', key='key1'); -- 9 数据脱敏 CREATE SECURITY POLICY ms1 ON t1 USE (type='mask', type='money'); -- 10 全密态加密 CREATE SECURITY POLICY ce1 ON t1 USE (type='client encrypt', key='key1'); -- 11 机密计算 列级 ...

January 25, 2025 · 1 min · 122 words · Me

PostgreSQL 5-1 libpq

简介 postgresql 简单架构 application driver(jdbc/libpq/..) server +-----------------------------------------------+-----------------------------------------+--------- | PQconnect(host, port, user, name) | do something .. | PQexec("create table t1(c1 int, c2 text)") | | PQexecStart() | PQsendQuery() | pqPutMsgStart('Q') | pqPutnchar("$sql") | pqPutMsgEnd() | pqFlush() | | SocketBackend() | pq_parse_input() | 'Q': exec_simple_query() | PQexec("insert into t1 values(1,'a'),(2,'b')")| | PQexec("select * from t1") | .. | .. | exec_simple_query() | libpq的功能 连接管理 协议编码 数据收发 连接管理 application driver(jdbc/libpq/..) server +-------------------------------------------+-----------------------------------------+--------- | connect(host, port, user, name) 协议编码 消息通用格式 ...

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