一、数据库审计
数据库安全对数据库系统来说至关重要。GBase8c 将用户对数据库的所有操作写入审计日志。
1.1 关于审计功能
1、审计总开关 audit_enabled 支持动态加载。在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。默认值为 on ,表示开启审计功能。
2、除了审计总开关,各个审计项也有对应的开关。只有开关开启,对应的审计功能才能生效。
3、各审计项的开关支持动态加载。在数据库运行期间修改审计开关的值,不需要重启数据库便可生效。
数据库审计项 | 描述 |
---|---|
用户登录、注销审计 | 参数:audit_login_logout ,默认值为 7 ,表示开启用户登录、退出的审计功能。 设置为0 表示关闭用户登录、退出的审计功能。 不推荐设置除0和7之外的值 。 |
数据库启动、停止、恢复和切换审计 | 参数:audit_database_process ,默认值为 1 ,表示开启数据库启动、停止、恢复和切换的审计功能。 |
用户锁定和解锁审计 | 参数:audit_user_locked ,默认值为 1 ,表示开启审计用户锁定和解锁功能。 |
用户访问越权审计 | 参数:audit_user_violation ,默认值为 0 ,表示关闭用户越权操作审计功能。 |
授权和回收权限审计 | 参数:audit_grant_revoke ,默认值为 1 ,表示开启审计用户权限授予和回收功能。 |
对用户操作进行全量审计 | 参数:full_audit_users ,默认值为 空字符串 ,表示采用默认配置,未配置全量审计用户。 |
不需要审计的客户端名称及IP地址 | 参数:no_audit_client ,默认值为 空字符串 ,表示采用默认配置,未将客户端及IP加入审计黑名单。 |
数据库对象的CREATE,ALTER,DROP操作审计 | 参数:audit_system_object ,默认值为 67121159 ,表示只对DATABASE、SCHEMA、USER、DATA SOURCE这四类数据库对象的CREATE、ALTER、DROP操作进行审计。 |
具体表的INSERT、UPDATE和DELETE操作审计 | 参数:audit_dml_state ,默认值为 0 ,表示关闭具体表的DML操作(SELECT除外)审计功能。 |
SELECT操作审计 | 参数:audit_dml_state_select ,默认值为 0 ,表示关闭SELECT操作审计功能。 |
COPY审计 | 参数:audit_copy_exec ,默认值为 1 ,表示开启copy操作审计功能。 |
存储过程和自定义函数的执行审计 | 参数:audit_function_exec ,默认值为 0 ,表示不记录存储过程和自定义函数的执行审计日志。 |
执行白名单内的系统函数审计 | 参数:audit_system_function_exec ,默认值为 0 ,表示不记录执行系统函数的审计日志。 |
SET审计 | 参数:audit_set_parameter ,默认值为 0 ,表示关闭SET审计功能。 |
事务ID记录 | 参数:audit_xid_info ,默认值为 0 ,表示关闭审计日志记录事务ID功能。 |
1.2 审计功能开启
[root@c1 ~]# # 1、以用户gbase登录数据库节点、连接gbase数据库
[root@c1 ~]# su - gbase
[gbase@c1 ~]$ gsql -r -d gbase -p 15400
gsql (single_node GBase8cV5 S5.0.0B17 build 32f8156d)
Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help.gbase=# -- 2、检查审计总开关audit_enabled状态
gbase=# -- 用show命令显示审计总开关audit_enabled的值
gbase=# show audit_enabled;audit_enabled
---------------off
(1 row)gbase=# -- 3、如果显示为off,代表未开启审计,执行‘\q’命令退出数据库
gbase=# \q[gbase@c1 ~]$ # 4、执行以下命令开启审计
[gbase@c1 ~]$ gs_guc set -N all -I all -c "audit_enabled=on"
The gs_guc run with the following arguments: [gs_guc -N all -I all -c audit_enabled=on set ].
Begin to perform the total nodes: 1.
Popen count is 1, Popen success count is 1, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 1, Command success count is 1, Command failure count is 0.Total instances: 1. Failed instances: 0.
ALL: Success to perform gs_guc!
1.3 配置具体的审计项
1、只有开启审计功能,用户的操作才会被记录到审计文件中。
2、各审计项的默认参数都符合安全标准,可以根据需要开启其他审计功能,但会对性能有一定影响。
1.3.1 开启对数据库所有对象的增删改操作的审计开关
[gbase@c1 ~]$ gs_guc reload -N all -I all -c "audit_system_object=12295"-- 其中 audit_system_object 代表对数据库所有对象的增删改操作的审计开关,12295为该审计开关的值。
1.3.2 开启用户访问越权审计
[gbase@c1 ~]$ gs_guc reload -N all -I all -c "audit_user_violation=1"-- 其中audit_user_violation代表审计项开关,
取值范围: 整型,0(关闭)、1(开启)。
1.3.3 开启具体表的INSERT、UPDATE和DELETE操作审计
[gbase@c1 ~]$ gs_guc reload -N all -I all -c "audit_dml_state=1"
-- 其中audit_dml_state参数取值范围:整型,0、1。
0表示关闭具体表的DML操作(SELECT除外)审计功能。
1表示开启具体表的DML操作(SELECT除外)审计功能。
其他审计配置项的设置方法类似。根据参数值设置即可,但会对性能有一定影响
二、查看审计结果
前置条件:
1、审计功能总开关已开启。需要审计的审计项开关已开启。
2、数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询时段内有审计结果产生。
3、数据库各个节点审计日志单独记录。
4、只有拥有 Sysadmin 属性的用户才可以查看审计记录。
审计查询命令是数据库提供的 SQL 函数pg_query_audit
。
pg_query_audit(timestamptz startime,timestamptz endtime,audit_log)
其中,参数startime
和endtime
分别表示审计记录的开始时间和结束时间,audit_log
表示所查看的审计日志信息所在的物理文件路径,当不指定audit_log时,默认查看连接当前实例的审计日志信息
。
登录查询审计记录
gbase=# select * from pg_query_audit('2024-03-01 00:00:00','2024-03-02 24:00:00');
SELECT * FROM pg_query_audit(NOW() - INTERVAL '1 day',NOW());
三、维护审计日志
3.1 审计日志相关配置参数
配置项 | 含义 | 默认值 |
---|---|---|
audit_directory | 审计文件的存储目录 | $GAUSSLOG/gbase/pg_audit |
audit_resource_policy | 审计日志的保存策略 | on(表示使用空间配置策略);off (表示使用时间配置策略) |
audit_space_limit | 审计文件占用的磁盘空间总量 | 1GB |
audit_file_remain_time | 审计日志文件的最小保存时间 | 90 |
audit_file_remain_threshold | 审计目录下审计文件的最大数量 | 1048576 |
审计日志删除命令为数据库提供的 SQL 函数`pg_delete_audit`。
pg_delete_audit(timestamp startime,timestamp endtime)
其中,参数 startime 和 endtime 分别表示审计记录的开始时间和结束时间。
3.2 记录审计内容的方式
方式 | 优点 | 缺点 |
---|---|---|
记录到表中 | 不需要用户维护审计日志 | 由于表是数据库的对象,如果一个数据库用户具有一定的权限,就能够访问到审计表。如果该用户非法操作审计表,审计记录的准确性难以得到保证。 |
记录到OS文件中 | 比较安全,即使一个帐户可以访问数据库,但不一定有访问OS这个文件的权限 | 需要用户维护审计日志 |
从数据库安全角度出发,采用记录到 OS 文件的方式来保存审计结果,保证了审计结果的可靠性。
3.3 审计日志的维护
3.3.1 设置自动删除审计日志
审计文件占用的磁盘空间或者审计文件的个数超过指定的最大值时,系统将删除最早的审计文件,并记录审计文件删除信息到审计日志中。审计文件占用的磁盘空间大小默认值为1024MB
,可以根据磁盘空间大小重新设置参数。
[root@c1 ~]$ # 1、以用户gbase登录数据库节点、连接gbase数据库
[root@c1 ~]$ su - gbase[gbase@c1 ~]$ gsql -d postgres -p 15400gbase=# -- 2、配置审计文件占用磁盘空间的大小(audit_space_limit)
gbase=# -- 查看已配置的参数
gbase=# SHOW audit_space_limit;audit_space_limit
-------------------1GB
(1 row)
gbase=# -- 4、配置审计文件个数的最大值(audit_file_remain_threshold)
gbase=# -- 查看已配置的参数
gbase=# SHOW audit_file_remain_threshold;audit_file_remain_threshold
-----------------------------1048576
(1 row)gbase=# -- 如果显示结果不为1GB(1024MB),执行“\q”命令退出数据库gbase=# \q[gbase@c1 ~]$ # 3、设置 audit_space_limit 参数成默认值1024MB
[gbase@c1 ~]$ gs_guc reload -N all -I all -c "audit_space_limit=1024MB"
[gbase@c1 ~]$ # 如果显示结果不为 1048576,执行“\q”命令退出数据库
[gbase@c1 ~]$ # 5、设置 audit_file_remain_threshold 参数值成默认值 1048576
[gbase@c1 ~]$ gs_guc reload -N all -I all -c "audit_file_remain_threshold=1048576"
3.3.2 手动备份审计文件
当审计文件占用的磁盘空间或者审计文件的个数超过配置文件指定的值时
,系统将会自动删除较早的审计文件
,因此需要周期性地对比较重要的审计日志进行保存。
[gbase@c1 ~]$ # 1、使用show命令获得审计文件所在目录(audit_directory)
[gbase@c1 ~]$ gsql -d postgres -p 15400
gbase=# SHOW audit_directory;audit_directory
-----------------------------------------------------/dbdata/single_alone/log/omm/gbase/pg_audit/dn_6001
(1 row)gbase=# \q[gbase@c1 ~]$ # 2、将审计目录整个拷贝出来进行保存
[gbase@c1 ~]$ ls /dbdata/single_alone/log/omm/gbase/pg_audit/dn_6001
3.3.3 手动删除审计日志
当不再需要某时段的审计记录时,可以使用审计接口命令pg_delete_audit
进行手动删除。
[gbase@c1 ~]$ # 删除2023-06-18到2023-06-22之间的审计记录
gbase=# SELECT pg_delete_audit('2023-06-18 00:00:00','2023-06-22 23:59:59');pg_delete_audit
-----------------(1 row)gbase=# \q
3.3.4 配置时间策略审计管理
gbase=# -- 调整audit_resource_policy策略为off,即表示使用时间配置策略
gbase=# show audit_resource_policy;audit_resource_policy
-----------------------on
(1 row)gbase=# -- 调整 audit_file_remain_time 审计日志保存时间,即自动保留三个月的审计日志;
gbase=# show audit_file_remain_time ;audit_file_remain_time
------------------------90
(1 row)