【我和openGauss的故事】openGauss 5.0版本审计特性实践应用
审计背景
openGauss 5.0 高安全新特性
支持用户级别审计设置
支持用户级别审计日志,对指定用户的所有SQL语句记录审计日志;
支持按客户端信息配置审计开关,对指定的客户端APP及IP不记录审计日志;
支持对风险较高的系统函数调用记录审计日志
openGauss5给我们带我们带来很多惊喜的功能,包括内核能力增强、高性能、高智能、高可用、高安全、资源池化等等,其中笔者注意到 高安全的功能特性增强了很多。也许有些读者对审计的功能不重视,但是一款真正的企业级的数据库,如果没有审计功能一切无法谈起,下面由笔者给各位剖析。
openGauss 5.0版本定位是一个OLTP数据库,作为交易型数据库,它必须有严谨的各种机制保障交易安全。客户端发起的数据操作事关交易,可以分为交易前、交易中、交易后的阶段。
交易前,在正式事务处理之前,首先把客户端的数据操作保存下来,不同的产品有不同的表达,一般会写到WAL日志上。这样当发生宕机或者不可控的断电事故,数据库重新上线的时候 ,可以从日志里面找到相关信息进行回放,正式交易。
交易中主要由ACID的机制去保障客户的交易完成,这时候客户持续生成一个redo日志,交易的具体细节分成多个环节,每一个环节都会写入到redo日志,根据进行会实现倒退回滚或者重复尝试,每一个事务都会分配到唯一的事务ID。交易策略一般分为悲观策略和乐观策略,悲观策略会把每一个环节考虑到最糟糕的地步,它会不断尝试提交,不断与其它并发的事务竞争、协调,保证它是唯一的。而乐观策略会跳过多个环境 ,到了最后提交,它再与其事务协商。
交易后交易完成后,数据是永久真实保存到数据库里面,不可以回退,但是数据有可能会有不可抗拒性丢失的风险。因此会有一主多备或异地容灾两地三中心的解决方案。即使发生自然界不可挡的灾难,也能保存另外一份完整的数据。
最关键的是交易进行中的策略,一般业务会采用悲观策略模式,但是这样还是不够的。要把一个事情做好,事前要预防,事中要控制,事后要进行审计。
数据库审计
网络搜索数据库审计内容分为五块,分别是多层业务关联审计、细粒度数据库审计、精准化行为回溯、全方位风险控制、职权分离
多层业务关联审计,通过应用层访问和数据库操作请求进行多层业务关联审计,实现访问者信息的完全追溯,包括:操作发生的URL、客户端的IP地址、请求报文等信息,通过多层业务关联审计能更精确地定位事件发生前后所有层面的访问及操作请求,使管理人员对用户的行为一目了然,真正做到数据库操作行为可监控,违规操作可追溯。
细粒度数据库审计,通过对不同数据库的SQL语义分析,提取出SQL中相关的要素(用户、SQL操作、表、字段、视图、索引、过程、函数等),实时监控来自各个层面的所有数据库活动,包括应用系统发起的数据库操作请求、来自数据库客户端的操作请求、远程登录服务器后的操作请求等,以及通过远程命令行执行的SQL命令,并对违规的操作进行阻断。系统不仅对数据库操作请求进行实时审计,还对数据库返回结果进行完整的还原和审计,同时可以根据返回结果设置审计规则。
精准化行为回溯,一旦发生安全事件,系统可提供基于数据库对象的完全自定义的审计查询及审计数据展现功能,彻底摆脱数据库的黑盒状态。
全方位风险控制,灵活的策略定制:根据登录用户、源IP地址、数据库对象(分为数据库用户、表、字段)、操作时间、SQL操作命令、返回的记录数或受影响的行数、关联表数量、SQL执行结果、SQL执行时长、报文内容等的灵活组合来定义客户所关心的重要事件和风险事件。多形式的实时报警:当检测到可疑操作或违反审计规则的操作时,系统可以通过监控中心报警、短信报警、邮件报警、Syslog报警等方式通知数据库管理员。
职权分离根据相关标准和规范,应对工作人员进行职责和系统设置权限划分。
真实的操作过程回放对用户关心的操作可以回放整个相关过程,让审计员可以看到真实输入及屏幕显示内容。对于远程操作,能实现对精细操作内容的检索,如删除表、执行文件命令、数据搜索等。
数据库审计系统的主要功能,如下
1.实时监测并智能地分析、还原各种数据库操作过程。
2.根据规则设定及时阻断违规操作,保护重要的数据库表和视图。
3.实现对数据库系统漏洞、登录账号、登录工具和数据操作过程的跟踪,发现对数据库系统的异常使用。
4.对登录用户、数据库表名、字段名及关键字等内容进行多种条件组合的规则设定,形成灵活的审计策略。
openGauss 5.0审计实践
系统环境
审计参数
默认安装好的openGauss5就已经启用审计功能,即audit_enabled参数是ON
如果没有启用,可以通过 以下命令
gs\_guc set -N all -I all -c "audit\_enabled=on"
查看所有审计相关的参数
openGauss=# select name,setting,context,source from
pg\_settings where name like '%aud%';
name | setting | context | source
\-----------------------------+-----------------------------------+------------+--------------------
audit\_copy\_exec | 1 | sighup | default
audit\_data\_format | binary | postmaster | default
audit\_database\_process | 1 | sighup | default
audit\_directory | /var/log/omm/omm/pg\_audit/dn\_6001 | postmaster | configuration file
audit\_dml\_state | 0 | sighup | default
audit\_dml\_state\_select | 0 | sighup | default
audit\_enabled | on | sighup | configuration file
audit\_file\_remain\_threshold | 1048576 | sighup | default
audit\_file\_remain\_time | 90 | sighup | default
audit\_function\_exec | 0 | sighup | default
audit\_grant\_revoke | 1 | sighup | default
audit\_login\_logout | 7 | sighup | default
audit\_resource\_policy | on | sighup | default
audit\_rotation\_interval | 1440 | sighup | default
audit\_rotation\_size | 10240 | sighup | default
audit\_set\_parameter | 0 | sighup | default
audit\_space\_limit | 1048576 | sighup | default
audit\_system\_function\_exec | 0 | sighup | default
audit\_system\_object | 67121159 | sighup | default
audit\_thread\_num | 1 | postmaster | default
audit\_user\_locked | 1 | sighup | default
audit\_user\_violation | 0 | sighup | default
audit\_xid\_info | 0 | sighup | default
full\_audit\_users | | sighup | default
no\_audit\_client | | sighup | default
(25 rows)
其中关键审计参数如下
其它更详细的参数可见 https://www.bookstack.cn/read/opengauss-5.0.0-zh/3401c885167f0a98.md
查看审计内容
openGauss审计查询命令是数据库提供的sql函数pg_query_audit
,审计日志默认保存在 audit_directory目录下。
pg_query_audit的使用方法,输入 开始时间和结束时间,最后是audit_log
其中,参数startime
和endtime
分别表示审计记录的开始时间和结束时间,audit_log
表示所查看的审计日志信息所在的物理文件路径,
openGauss=# show audit\_directory;
audit\_directory
\-----------------------------------
/var/log/omm/omm/pg\_audit/dn\_6001
(1 row)
查看指定用户henley1,7月10日到7月22日的审计活动,就会从audit_directory里面读取日志
openGauss=# select * from pg_query_audit('2023-07-10 08:00:00','2023-07-22 23:00:00') where username='henley1';
time | type | result | userid | username | database | client\_conninfo | object\_nam
e |
detail\_info
| node\_name | thread\_id | local\_port |
remote\_port
\------------------------+-------------------+--------+--------+----------+----------+-------------------------+-------------
\----+-----------------------------------------------------------------------------------------------------------------------
\----------------------------------------------------------------------------------------------------------------------------
\---------------------------------------------------------------+-----------+---------------------------------+------------+-
\------------
2023-07-12 06:01:31-04 | login\_failed | failed | 16387 | henley1 | postgres | dn\_6001@192.168.178.130 | postgres
| login db(postgres)failed with no password, SSL=on
| dn\_6001 | 140489724458752@742471291523271 | 5432 |
35394
2023-07-12 06:01:57-04 | login\_success | ok | 16387 | henley1 | postgres | gsql@192.168.178.130 | postgres
| login db(postgres) success,the current user is:henley1, SSL=on
| dn\_6001 | 140489724458752@742471317817769 | 5432 |
35400
2023-07-12 06:01:57-04 | dml\_action\_select | ok | 16387 | henley1 | postgres | gsql@192.168.178.130 | pg\_settings
实战审计
用户未授权登陆审计
当前henley5的状态
openGauss=# select \* from pg\_query\_audit('2023-07-10 08:00:00','2023-07-22 23:00:00') where username='henley5';
time | type | result | userid | username | database | client\_conninfo | object\_name | detail\_info | node\_name | thread\_id |
local\_port | remote\_port
\------+------+--------+--------+----------+----------+-----------------+-------------+-------------+-----------+-----------+
\------------+-------------
(0 rows)
模仿henley5登录server130,此刻henley5尚未创建
\[omm@server130 ~\]$ gsql -h 192.168.178.130 -d postgres -U henley5 -p 5432
Password for user henley5:
gsql: FATAL: Invalid username/password,login denied.
FATAL: Invalid username/password,login denied.
回头查询henley5的状态,发现审核日记有所记录。
创建用户名henley8,并成功登录,再通过后台审计查看发现成功登录,用户正常登录被审计下来。
CREATE USER henley8 PASSWORD 'Agmcc#1234';
\[omm@server130 ~\]$ gsql -h 192.168.178.130 -d postgres
-U henley8 -p 5432
Password for user henley8:
gsql ((openGauss 5.0.0 build a07d57c3)
compiled at 2023-03-29 03:07:56 commit 0 last mr )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.
总结,尚未具有正式帐号的行为被审计下来,同样具有权限后的行为也是可以被 登录下来。
用户对象操作使用审计
进入 /opt/huawei/install/data 目录
运行以下命令对 henley8进行审核
[omm@server130 data\]$ gs\_guc reload -Z datanode -D dn/
-c "full_audit_users='henley8'"
The gs\_guc run with the following arguments:
\[gs\_guc -Z datanode -D dn/ -c full\_audit\_users='henley8' reload \].
expected instance path: \[dn/postgresql.conf\]
gs\_guc reload: full\_audit\_users='henley8': \[dn/postgresql.conf\]
server signaled
Total instances: 1. Failed instances: 0.
Success to perform gs\_guc!
确保henley8已经得到审计
连续以henley8的身份运行以下DML命令操作
openGauss=> insert into t11 values(1000);
INSERT 0 1
openGauss=> select \* from t11;
id
\------
1000
(1 row)
openGauss=> update t11 set id=50 where id=1000;
UPDATE 1
openGauss=> select \* from t11 ;
id
\----
50
(1 row)
继续检查,select * from pg_query_audit(‘2023-07-10 08:00:00’,‘2023-07-22 23:00:00’) where username=‘henley8’; 发现DML的命令都可以得到审计。
展望
openGauss的审计功能非常精彩 ,期望openGauss在审计功能上百尺竿头,更进一步。
文章转载自公众号:openGauss