数据库安全 4 访问控制

1 访问控制的背景 在使用数据库存取数据的大部分场景中,数据库具有以下特点: 对象多:一个数据库集群中有多个database对象,1个database对象中有多个schema对象,1个schema对象中有多个table、index等对象 用户多:一个数据库中,有多个用户,每个用户可访问的数据库对象不同 在该场景中,通过访问控制机制,可限制某个对象访问数据库对象的范围 2 访问控制的原理 访问控制的模型是:主体、客体、操作。本文不解释基本概念。 主体 USER 角色: SYSADMIN 系统管理员 CREATEROLE 安全管理员 AUDITADMIN 审计管理员 MONADMIN 监控管理员 OPRADMIN 运维管理员 POLADMIN 安全策略管理员 客体 DATABASE SCHEMA TABLESPACE TABLE COLUMN FUNCTION PROCEDURE SEQUENCE FOREIGN SERVER LANGUAGE 操作 客体 CREATE DATABASE, SCHEMA, TABLESPACE ALTER DATABASE, SCHEMA, TABLESPACE, TABLE, FUNCTION, PRODUCE, FOREIGN SERVER, DIRECOTRY, PACKAGE DROP DATABASE, SCHEMA, TABLESPACE, TABLE, FUNCTION, PRODUCE, FOREIGN SERVER, DIRECOTRY, PACKAGE TRUNCATE TABLE VACUUM TABLE INDEX TABLE TRIGGER TABLE SELECT TABLE, COLUMN, SEQUENCE INSERT TABLE, COLUMN UPDATE TTABLE, COLUMN, SEQUENCE DELETE TABLE TEMPORARY DATABASE EXECUTE FUNCTION, PROCEDURE, PACKAGE 语法: ...

February 5, 2025 · 6 min · 1187 words · Me

数据库安全 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

数据库安全 统一管理

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

WAL 加密模块设计

假设集群里已经存在表级透明加密模块,在此基础上设计一个高性能、高易用性的 WAL 加密模块。 WAL 加密的难点几乎不在"加密"本身,而在两件事:同一个 8KB 页会被反复重写,以及恢复路径要在拿不到 catalog 的时候就能解密。下面按设计决策的顺序展开。 1 威胁模型 先划清边界,因为它直接决定后面几个取舍。 要防的:磁盘 / 备份 / 归档介质被拖走;DBA 之外的运维人员直接读 pg_wal/;WAL 归档到对象存储。 不防的:有 root 权限的在线攻击者(内存里必然有明文)、旁路攻击。 1.1 为什么不用 dm-crypt 了事 如果只是防"介质丢失",块设备加密(LUKS/dm-crypt)性价比高得多。在数据库内核里做 WAL 加密,真正的理由只有三个: 密钥要由数据库自己管,不能落在 OS 层(密评 / 国测要求); 归档件要天然带密; 和已有的表级 TDE 共用一套密钥体系。 设计要始终对齐这三个理由,否则很容易做成一个又慢、又没多大意义的模块。 1.2 FPI 是必须堵的洞 既然表级 TDE 已经存在,那么 FPI(full page image)就是个必堵的泄漏点。 如果 TDE 是在 smgr 层做的(缓冲区里是明文、写盘时加密),那么 WAL 里的 FPI 记录的是明文页 —— 加密表的数据会原封不动地漏进 WAL。 只要集群里存在任何一张加密表,WAL 加密就必须强制开启,不能是两个独立开关。 实现上做成一个集群级的 data_encryption = on,或者至少让 CREATE ENCRYPTION POLICY 在 WAL 加密未开启时直接报错。这是易用性设计里最重要的一条:不要把一个"配错了就静默泄密"的组合留给用户。 ...

September 7, 2026 · 4 min · 684 words · Me

数据库安全 防篡改

CREATE SCHEMA s1 WITH BLOCKCHAIN; CREATE TABLE s1.t1(c1 INT, c2 TEXT); \d s1.t1 \d blockchain.s1_t1_hist INSERT INTO s1.t1 VALUES(1, 'aa'), (3, 'bb'), (7, 'cc'), (10, 'dd'); SELECT *,hash FROM s1.t1; SELECT * FROM blockchain.s1_t1_hist; # hahs_ins,hash_del,pre_hash SELECT * FROM gs_global_chain; # relnsp,relname,relhash,globalhash,txcommand SELECT ledger_hist_check('s1', 't1'); SELECT ledger_gchain_check('s1', 't1'); 分布式 CREATE SCHEMA s1 WITH BLOCKCHAIN; CREATE TABLE s1.t1(c1 INT, c2 TEXT); SELECT create_distributed_table('s1.t1', 'c1'); INSERT INTO s1.t1 VALUES(1, 'aa'), (2, 'bb'), (3, 'cc'), (7, 'dd'), (10, 'ee'); SELECT *,hash FROM s1.t1; SELECT * FROM blockchain.s1_t1_hist; -- hahs_ins,hash_del,pre_hash, 其中,pre_hash没用上,无作用 SELECT * FROM gs_global_chain; -- relnsp,relname,relhash,globalhash,txcommand SELECT * FROM ledger_hist('s1', 't1'); SELECT * FROM ledger_gchain(); SELECT ledger_hist_check('s1', 't1'); SELECT ledger_hist_archive('s1', 't1'); SELECT ledger_hist_repair('s1', 't1'); SELECT ledger_gchain_check('s1', 't1'); SELECT ledger_gchain_archive(); SELECT ledger_gchain_repair('s1', 't1'); 集中式 CREATE SCHEMA s1 WITH BLOCKCHAIN; CREATE TABLE s1.t1(c1 INT, c2 TEXT); INSERT INTO s1.t1 VALUES(1, 'aa'), (2, 'bb'), (3, 'cc'), (7, 'dd'), (10, 'ee'); SELECT *,hash FROM s1.t1; SELECT * FROM blockchain.s1_t1_hist; SELECT * FROM gs_global_chain; SELECT ledger_hist_check('s1', 't1'); SELECT ledger_hist_archive('s1', 't1'); SELECT ledger_hist_repair('s1', 't1'); SELECT ledger_gchain_check('s1', 't1'); SELECT ledger_gchain_archive(); SELECT ledger_gchain_repair('s1', 't1'); -- 下面2个函数,不用适配,别动代码,告诉我当前表现 -- SELECT * FROM ledger_hist('s1', 't1'); -- SELECT * FROM ledger_gchain(); CREATE SCHEMA s1 WITH BLOCKCHAIN; CREATE TABLE s1.t1(c1 INT, c2 TEXT); ...

July 29, 2026 · 2 min · 327 words · Me

高质量专项 全密态机密计算

目录 目录 1 架构 1.1 整体架构 2 流程 2.1 整体流程 3 设计 3.1 驱动加密 3.2 机密计算 一、技术调研 二、方案对比 4 接口 5 实现 1 架构 1.1 整体架构 全密态数据库是一种由数据库提供的安全特性,指数据库在处理数据的过程中,确保数据在传输、计算、存储等全生命周期阶段,于任何不可信的介质或环境中,始终处于加密状态。不可信环境包括:网络、内存、磁盘等。以常见的拓扑模型为例,在使用数据库的过程中,威胁面较广: 全密态数据库中,对于传输、存储安全,采用驱动加密方案。应用向数据库发送数据时,先在驱动中加密数据,再发送数据密文。应用从数据库接收数据时,先接收数据密文,再在驱动中解密数据。数据在网络、磁盘、服务端内存中,均处于加密状态。基本架构如下图所示: 全密态数据库中,对于计算安全,采用机密计算方案。驱动加密方案,解决传输、存储安全,但是,数据库端无法在密文上计算。为解决计算问题,业界有两种方案: 基于密码学算法的密文计算方案:通过密码学算法,让数据库在直接在密文上进行计算,例如保序加密、可搜索加密、同态加密等 基于硬件隔离的机密计算方案:在CPU、内存中,划分逻辑独立的可信执行环境,让数据库在可信执行环境中解密数据密文,进行计算。 在充分对比安全性、功能完备性、性能、实现难度等特点,选择机密计算方案。结合驱动加密方案、机密计算方案,全密态数据库整体架构如下图所示: 全密态数据库中,对于加密模型,采用多级密钥方案。数据由数据密钥加密,密钥由主密钥加密,主密钥由根密钥加密。在驱动加密模块中,只能获取数据密钥,无法获取主密钥。在更安全的加密方案中,驱动加密模块无法获取数据密钥,由硬件加密机加密。在数据库端,仅存储密钥信息,无法获取密钥。全密态数据库加密模型如下图所示: 2 流程 2.1 整体流程 使用全密态数据库时,用户需定义主密钥、数据密钥、加密表,在执行存储、查询数据时,全密态数据库自动完成加密、解密、计算等操作。完整的使用流程如图所示: 3 设计 3.1 驱动加密 3.2 机密计算 一、技术调研 纯软路线 同态加密 软硬路线 x86 cpu sgx:硬件 tdx:硬件 固件 me:出厂自带 软件 sgx driver amd cpu sev:Secure Encrypted Virtualization,CPU扩展电路,为每台虚拟机分配内存密钥,运行时加密整段内存。需BIOS开启。 sev-snp/sev-es 固件 psp 软件 kvm sev arm cpu trust-zone:每个核新增总线, 固件 arm trusted fimware 软件 op-tee tee: https://github.com/OP-TEE/build ...

January 19, 2026 · 1 min · 84 words · Me

数据库安全 传输加密

非国密 生成证书 数据库服务端:配置证书、配置传输加密算法 数据库客户端:配置证书 # 检查openssl版本 which openssl # 确保使用的是vastbase发布包中的openssl,而非操作系统中的openssl cp $GAUSSHOME/share/sslcert/gsql/openssl.cnf ./ export OPENSSL_CONF=`pwd`/openssl.cnf # 创建文件 mkdir cert cd cert mkdir ./demoCA ./demoCA/newcerts ./demoCA/private chmod 700 ./demoCA/private echo '01'>./demoCA/serial touch ./demoCA/index.txt # ca openssl genrsa -out ./demoCA/private/cakey.pem 2048 openssl req -new -key ./demoCA/private/cakey.pem -out ./demoCA/private/ca_cert_req.pem -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root" openssl x509 -req -in ./demoCA/private/ca_cert_req.pem -days 7300 -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem # server openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server" openssl x509 -req -in server.csr -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out server.crt # client openssl genrsa -out client.key 2048 openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client" openssl x509 -req -in client.csr -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out client.crt # 查看内容 openssl x509 -in client.crt -text # 设置权限 chmod 600 client.key chmod 600 client.crt chmod 600 server.key chmod 600 server.crt chmod 600 ./demoCA/cacert.pem export CERT=`pwd` echo ' export CERT=`pwd` export PGSSLMODE=verify-ca export PGSSLROOTCERT=$CERT/demoCA/cacert.pem export PGSSLKEY=$CERT/client.key export PGSSLCERT=$CERT/client.crt ' > client_env source client_env # 设置服务端参数 gs_guc set -D $GAUSSHOME/data -c "ssl=on" gs_guc set -D $GAUSSHOME/data -c "ssl_ciphers = 'ALL'" gs_guc set -D $GAUSSHOME/data -c "ssl_ca_file = '$CERT/demoCA/cacert.pem'" gs_guc set -D $GAUSSHOME/data -c "ssl_key_file='$CERT/server.key'" gs_guc set -D $GAUSSHOME/data -c "ssl_cert_file='$CERT/server.crt'" # 重启数据库 vsql -d postgres -c " CREATE USER u1 PASSWORD 'u1.password' " # 连接数据库:需加-h参数 vsql -h localhost -d postgres -U u1 -W 'u1.password' -r rm -f client.* server.* gs_guc set -D $GAUSSHOME/data -c "ssl_ciphers = 'ECDHE-ECDSA-SM4-CBC-SM3'" openssl ecparam -name SM2 -genkey -out ./demoCA/private/cakey.pem openssl req -new -key ./demoCA/private/cakey.pem -out ./demoCA/private/ca_cert_req.pem -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root" openssl x509 -req -in ./demoCA/private/ca_cert_req.pem -days 7300 -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem # server openssl ecparam -name SM2 -genkey -out server.key openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server" openssl x509 -req -in server.csr -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out server.crt # client openssl ecparam -name SM2 -genkey -out client.key openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client" openssl x509 -req -in client.csr -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAcreateserial -out client.crt chmod 600 client.key client.crt server.key server.crt ./demoCA/cacert.pem openssl x509 -in client.crt -text 国密 mkdir cert cd cert openssl version # OpenSSL 1.1.1s Tassl 2.1.2 1 Nov 2022 cp ../tassl/install/openssl.cnf ./ chmod +w ./openssl.cnf echo ' [ gm_ca_cert ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = critical,CA:true keyUsage = critical, cRLSign, keyCertSign [ gm_sign_cert ] basicConstraints = CA:FALSE keyUsage = critical, digitalSignature, nonRepudiation [ gm_enc_cert ] basicConstraints = CA:FALSE keyUsage = critical, keyEncipherment, dataEncipherment, keyAgreement' >> ./openssl.cnf mkdir ./demoCA ./demoCA/newcerts ./demoCA/private chmod 700 ./demoCA/private echo '01'>./demoCA/serial touch ./demoCA/index.txt # ca openssl ecparam -name SM2 -genkey -out ./demoCA/private/cakey.pem openssl req -config openssl.cnf -new -key ./demoCA/private/cakey.pem -sm3 -out ./demoCA/private/ca_cert_req.pem -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=root" openssl x509 -req -extfile openssl.cnf -extensions gm_ca_cert -in ./demoCA/private/ca_cert_req.pem -sm3 -days 7300 -signkey ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem # server openssl ecparam -name SM2 -genkey -out server.key openssl ec -in server.key -passout pass:gauss@123 -sm4 -out server.key openssl req -config openssl.cnf -new -key server.key -passin pass:gauss@123 -sm3 -out server.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server" openssl x509 -req -extfile openssl.cnf -extensions gm_sign_cert -in server.csr -sm3 -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out server.crt # server.enc openssl ecparam -name SM2 -genkey -out server_enc.key openssl ec -in server_enc.key -passout pass:gauss@123 -sm4 -out server_enc.key openssl req -config openssl.cnf -new -key server_enc.key -passin pass:gauss@123 -sm3 -out server_enc.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=server" openssl x509 -req -extfile openssl.cnf -extensions gm_enc_cert -in server_enc.csr -sm3 -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out server_enc.crt gs_guc encrypt -M server -D ./ -K gauss@123 # client openssl ecparam -name SM2 -genkey -out client.key openssl ec -in client.key -passout pass:gauss@123 -sm4 -out client.key openssl req -config openssl.cnf -new -key client.key -passin pass:gauss@123 -sm3 -out client.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client" openssl x509 -req -extfile openssl.cnf -extensions gm_sign_cert -in client.csr -sm3 -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out client.crt # client.enc openssl ecparam -name SM2 -genkey -out client_enc.key openssl ec -in client_enc.key -passout pass:gauss@123 -sm4 -out client_enc.key openssl req -config openssl.cnf -new -key client_enc.key -passin pass:gauss@123 -sm3 -out client_enc.csr -subj "/C=CN/ST=Beijing/O=huawei/OU=gauss/CN=client" openssl x509 -req -extfile openssl.cnf -extensions gm_enc_cert -in client_enc.csr -sm3 -days 3650 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -passin pass:gauss@123 -CAcreateserial -out client_enc.crt gs_guc encrypt -M client -D ./ -K gauss@123 # openssl x509 -in client.crt -text export CERT=`pwd` echo ' export CERT=`pwd` export PGSSLMODE=verify-ca export PGSSLTLCP=1 export PGSSLROOTCERT=$CERT/demoCA/cacert.pem export PGSSLKEY=$CERT/client.key export PGSSLCERT=$CERT/client.crt export PGSSLENCKEY=$CERT/client_enc.key export PGSSLENCCERT=$CERT/client_enc.crt ' > client_env source client_env # 设置服务端参数 gs_guc set -D $GAUSSHOME/data/single_node -c "ssl=on" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_ciphers = 'ALL'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_use_tlcp=on" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_ca_file = '$CERT/demoCA/cacert.pem'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_key_file='$CERT/server.key'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_cert_file='$CERT/server.crt'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_enc_key_file='$CERT/server_enc.key'" gs_guc set -D $GAUSSHOME/data/single_node -c "ssl_enc_cert_file='$CERT/server_enc.crt'" # 重启数据库

May 21, 2025 · 4 min · 762 words · Me

数据库安全 全密态

PQconnectStart makeEmptyPGconn connectOptions1 parse_connection_string fillPGconn conninfo_getval("enable_ce") # 解析 'enable_ce' connectDBStart PQconnectPoll if CONNECTION_NEEDED: # 建立TCP连接 connect elif CONNECTION_MADE: # 发送连接参数 pqBuildStartupPacket3 build_startup_packet pqPacketSend elif CONNECTION_AWAITING_RESPONSE # 进行身份认证 pg_fe_sendauth PQexec PQexecStart PQsendQuery Processor::run_pre_query # 加密SQL语句中的数据 Parser::Parse run_pre_statement run_pre_insert_statement CachedColumnManager::get_cached_columns RawValues::get_raw_values_from_insert_statement ValuesProcessor::process_values process_inside_value # 加密 StatementData::replace_raw_values pqPutMsgStart pqPuts pqPutMsgEnd pqFlush PQexecFinish PQgetResult parseInput pqParseInput3 pqGetc pqGetInt case 'D' getAnotherTuple pqRowProcessor ValuesProcessor::deprocess_value # 解密服务端返回的数据 pqGets case 'Z' Processor::run_post_query pqReadData

May 20, 2025 · 1 min · 66 words · Me

数据库安全 重构审计

1 审计的背景 1.1 审计的原理 在使用数据库存取数据的大部分场景中,数据库具有以下特点: 对象多:一个数据库集群中有多个database对象,1个database对象中有多个schema对象,1个schema对象中有多个table、index等对象 用户多:一个数据库中,有多个用户,每个用户可访问的数据库对象不同 应用多:多个应用将数据存储在同一数据库集群中,并同时访问数据库集群 操作多:数据库提供丰富的功能,包括DDL、DML、DCL、运维等 运行久:一个数据库集群,可能会保持数十年运行 审计的主要目的,使记录数据运行过程中发生了哪些事件。审计的3要素是: 主体:一般指数据库用户 客体:一般指数据库对象,包括:集群、数据对象(database、schema、table、index、function等)、用户等 操作:主体对客体的操作,比如某个用户访问了某个表 1.2 审计的目的 审计具有以下重要意义: 合法合规:《网络安全法》等法律法规与表中中,要求应用通过《等保测评》等标准,标准中要求应用具备审计功能 故障检测:当数据库出现故障时,协助快速定位问题 攻击检测:通过检查审计日志,可判断是否发生网络安全攻击事件 例行维护:通过检查审计日志,可跟踪对某个对象的访问信息 … 等保测评要求标准(GB/T 28448)中,对审计的要求如下: 审计范围 全面性 细粒度:登录、访问、修改、删除等 审计内容 用户行为:登录、登出、权限变更 数据访问:敏感数据查询、插入、更新、删除等 异常行为:登录失败、非法访问 审计记录 详细性:时间戳、用户标识、操作类型、操作结果、IP地址等 不可篡改:真实性、完整性 存储安全:未经授权的访问和修改 审计管理 审计策略:审计的目标、范围、内容和频率 审计分析:定期分析审计记录 审计报告 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权限的操作,oracle 12c中,支持256种权限 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; -- 查看关键日志 SELECT * FROM DBA_AUDIT_TRAIL; -- 其他:DBA_COMMON_AUDIT_TRAIL, DBA_AUDIT_SESSION, DBA_AUDIT_OBJECT, DBA_FGA_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 | +----------+---------------+-----+----------+----------+------------------+------+----------+--------------+ 其中,可设置的权限、操作等范围如下: ...

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