Vastbase SSL安全传输

1 基于SSL证书实现身份认证 在应用与数据库传输数据时,为避免攻击者对数据进行窃听、篡改、伪造、重放等攻击,Vastbae支持采用SSL协议保障数据机密性与完整性。在SSL协议协商密钥的过程中,应用与数据库需通过证书验证对方身份,同时,该证书也可作为登入数据库的身份凭证。 此处介绍生成证书,并基于证书配置SSL协议,同时基于证书实现身份认证,操作流程可分为以下3个阶段: 一、生成私钥与证书 二、数据库端配置证书与私钥 三、应用端配置证书与私钥 一、生成私钥与证书 此处介绍基于openssl工具,生成自签名证书的流程 创建存放私钥与证书的文件夹 mkdir cadir cd cadir mkdir ./demoCA ./demoCA/newcerts ./demoCA/private echo '01'>./demoCA/serial touch ./demoCA/index.txt 配置openssl工具 从Vastbase安装包中,获取openssl工具以及openss配置文件。假设Vastbae安装包存放在$GAUSSHOME目录。 cp $GAUSSHOME/bin/openssl ./ export PATH=`pwd`:$PATH which openssl # 确保openssl来源于Vastbase安装包,避免因版本不同造成证书不可用 openssl version cp $GAUSSHOME/share/sslcert/gsql/openssl.cnf ./ export OPENSSL_CONF=`pwd`/openssl.cnf 创建CA私钥、CA证书 openssl ecparam -genkey -name SM2 -out demoCA/private/cakey.pem openssl req -new -config openssl.cnf -key demoCA/private/cakey.pem -subj /C=CN/ST=BJ/L=HaiDian/O=VAST/OU=SEC/CN=CA -out cacert.req openssl ca -selfsign -config openssl.cnf -batch -keyfile demoCA/private/cakey.pem -in cacert.req -out demoCA/cacert.pem 创建数据库私钥、数据库证书 ...

August 28, 2025 · 6 min · 1153 words · Me

e100

./configure --prefix=$PG_HOME --enable_debug --with-openssl --enable-cassert make -sj 6 && make install alias pmake='make -sj 6 && make install -sj' alias pinit='rm -rf $PG_HOME/data && initdb -D $PG_HOME/data' alias pstart='pg_ctl start -D $PG_HOME/data -l logfile' alias pstop='pg_ctl stop -D $PG_HOME/data -l logfile'

July 29, 2025 · 1 min · 41 words · Me

pg_dump

1 使用方式 vsql -d vastbase -r CREATE USER u1 PASSWORD 'u1.password'; CREATE USER u2 SYSADMIN PASSWORD 'u2.password'; CREATE USER u3 SUPERUSER PASSWORD 'u3.password'; SELECT rolname,rolsuper,rolsystemadmin FROM pg_authid ORDER BY rolname; vsql -d vastbase -c "SELECT rolname,rolsuper,rolsystemadmin FROM pg_authid ORDER BY rolname;" # 导出 vb_dumpall --roles-only -f ./u.sql # 清理 vsql -d vastbase -c " DROP USER IF EXISTS u1,u2,u3; " # 恢复 vsql -d vastbase -f ./u.sql vsql -d vastbase -c "SELECT rolname,rolsuper,rolsystemadmin FROM pg_authid ORDER BY rolname;"

July 29, 2025 · 1 min · 78 words · Me

libpq

1 libpq编程 1.1 配置数据库 安装数据库 # 假设安装目录为 $PG_HOME 启动数据库 # 假设数据目录为 $PG_HOME/data 配置数据库 echo 'host all u1 0.0.0.0/0 md5' >> $PG_HOME/data/pg_hba.conf echo "listen_addresses='0.0.0.0'" >> $PG_HOME/data/postgresql.conf pg_ctl reload -D $PG_HOME/data 创建用户 psql -d postgres -c "create user u1 password 'u1.password';" # 验证一下 psql -h 127.0.0.1 -p 5432 -d postgres -U u1 -W 'u1.password' -c '\d' 1.2 编写libpq demo 生成源文件 touch pq.c # 复制 1.3 章节的源码 到 pq.c中 # 配置环境变量 export LD_LIBRARY_PATH=$PG_HOME/lib:$LD_LIBRARH_PATH 编译 gcc pq.c -o pq -I$PG_HOME/include -L$PG_HOME/lib -lpq 执行 ...

July 28, 2025 · 1 min · 204 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

jdbc

1 使用JDBC的流程 准备java环境 准备jdbc驱动 编写java代码 执行java代码 2 使用JDBC 2.1 准备java环境 安装java工具包 sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel 验证java安装成功 java -version # openjdk version "1.8.0_382" : 8表示java 8 执行java demo # 编写代码 echo ' public class Demo { public static void main(String[] args) { System.out.println("Hello World"); } } ' >> Demo.java # 编译代码 javac Demo.java # 执行 java Demo 2.2 准备jdbc驱动 touch jdbc cd jdbc mkdir jars cd jars wget https://jdbc.postgresql.org/download/postgresql-42.7.7.jar 目录架构: |-- jdbc |-- jars |-- postgresql-42.7.7.jar https://polydistortion.net/bc/index.html ...

July 24, 2025 · 1 min · 164 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

分享编写需求/设计文档的个人经验

1 简介 1.1 分享的主题 分享一些编写需求、设计文档经验 1.2 分享的背景 背景:我写的需求文档,(相对)还算详细,所以有此次分享 308.1,profile功能的需求文档:https://www.tapd.cn/60475194/markdown_wikis/show/#1160475194001007196 根因:前公司流程繁重,被迫养成这种习惯。 分享的内容:可分享的干货不多,我觉得,在写文档的过程中,大部分人想的很详细,只是没有编写到文档中,毕竟每个人都有自己的编写风格。所以,本文的重点,是介绍前公司流程与要求,并以我做过的需求为例,为大家提供一点参考。 分享人经历:交过10+个不算小的需求,完整写过10+次需求与设计文档,格式与海量的接近。 分享的局限:交付的需求,主要是安全方向,也涉及SQL、存储等多个模块,所以,本文主要以安全需求的角度写,其他模块的需求不一定适用。 1.3 前公司的流程 与海量相比,前公司的交付流程,几乎一样: 客户:提出需求 产品、项目、测试、架构等:审核需求 开发:撰写需求/设计文档 各角色:评审需求/设计文档 开发:编写代码 … 其中,在4.评审需求/设计文档环节,前公司区别较大: 一、评审人员多 编号 角色 评审人 目的 1 开发 安全组、SQL组、存储组、运维组、.. 避免影响其他模块,协助发现风险 2 测试 测试人、测试组长 学习新需求,识别测试重点 3 架构 架构设计 避免影响其他模块,确保后向兼容 4 资料 资料优化、资料审核 学习新需求 5 用例 用例审核 确保各种check可看护功能 6 其他 流程提升 - 二、评审通过难 组内评审 线上评审:上述所有角色会上评审,不过,一般很多人会议冲突,关键靠线下评审 线下评审(关键流程):各类角色共10+必选评审人,通过在线需求文档、设计文档了解需求,提出疑问,提出意见。开发分析解决后,找提出人确认意见,才算闭环。最后,所有必选评审人评审通过,才算完成流程。 在这种流程中,需求与设计文档,要满足很多要求: 普适:考虑到其他组开发、测试、资料等角色,不熟悉本领域的基础知识,所以,需要详细介绍相关原理,很多原理需要从头介绍 完整:要充分例举所有可能涉及风险,否则,评审人会认为未考虑到 举例:做了1个需求,可以为表设置加密属性,需要考虑:系统表、用户表(atore表、ustore表、分区表、临时表、toast表、unlogged表、segment表、hashbuckent表、物化视图…) 2 需求文档写作思路 2.1 分析过程 首先,客户提出需求,很多需求不够清晰。 示例: profile原始需求: 目前对于数据库用户的管理方式不够便捷,无法像Oracle为用户赋予一组安全策略。一些属性如密码有效期、密码过期天数、密码尝试次数等也只能全局设定,无法指定用户配置。 然后,以我的个人习惯,分析需求的流程如下: ...

July 15, 2025 · 2 min · 413 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,随时问我!🚀