目录
审计日志概述
数据库安全对数据库系统来说至关重要。PanweiDB 将用户对数据库的所有操作写入审计日志。数据库安全管理员可以利用这些日志信息,重现导致数据库现状的一系列事件,找出非法操作的用户、时间和内容等。
关于审计功能,用户需要了解以下几点内容:
- 审计开关 audit_enabled,默认值为 off,表示关闭审计功能。关闭审计时,默认对数据库启停、用户删除及修改、修改系统参数这三类行为进行审计,并生成审计日志。
- 审计总开关 audit_enabled 及各审计项的开关支持动态加载。在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。
- 当审计开启,即 audit_enabled=on 时,记录的审计日志根据具体的审计策略确定。
- 审计日志空间告警可通过设置 pw_audit_space_alarm_threshold 参数实现,取值范围为[0,1),最多可精确到小数点后 2 位,其中 0 表示不设置告警阈值(默认值)。例如:pw_audit_space_alarm_threshold=0.85,表示当审计日志存储空间达到 85%时,打印告警信息。可通过pg_audit_logsize_warning()函数查询告警情况,当返回值为 "1"时表示已超过阈值。
- 未开启三权分立,即enable_separation_of_duty=off时,只有初始用户 和系统管理员(pwadmin)可以查看审计日志,其他用户不具备查看审计日 志的权限。
- 开启三权分立,即参数enable_separation_of_duty=on时,只有审计管 理员(pwaudit)具备查看审计日志权限,系统管理员(pwadmin)、安全保密 管理员(pwsso)和普通用户不具备查看审计日志权限
数据库审计流程:
审计日志配置
审计设置
审计项 | 描述 |
用户登录、注销 | 参数:audit_login_logout 默认值为7,表示开启用户登录、退出的审计功能。设置为0表示关闭用户登录、退出的审计功能。不推荐设置除0和7之外的值。 |
数据库启动、停止、恢复和切换 | 参数:audit_database_process 默认值为1,表示开启数据库启动、停止、恢复和切换的审计功能。 |
用户锁定和解锁 | 参数:audit_user_locked 默认值为1,表示开启审计用户锁定和解锁功能。 |
用户访问越权 | 参数:audit_user_violation 默认值为0,表示关闭用户越权操作审计功能。 |
授权和回收权限 | 参数:audit_grant_revoke 默认值为1,表示开启审计用户权限授予和回收功能。 |
数据库对象的CREATE,ALTER,DROP操作 | 参数:audit_system_object默认值为67121159,表示只对DATABASE、SCHEMA、USER、DATASOURCE这四类数据库对象的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,表示不记录存储过程和自定义函数的执行审计日志。 |
SET审计 | 参数:audit_set_parameter默认值为0,表示关闭set审计功能 |
事务ID记录 | 参数:audit_xid_info默认值为0,表示关闭审计日志记录事务ID功能。 |
审计设置-实验
步骤1 以操作系统用户omm登录数据库主节点。步骤2 使用如下命令连接数据库。
步骤3 检查审计总开关状态。
1. 用show命令显示审计总开关audit_enabled的值。
postgres=# SHOW audit_enabled;
2. 执行如下命令开启审计功能,参数设置立即生效。
gs_guc set -N all -I all -c "audit_enabled=on"
步骤4 配置具体的审计项。
以开启对数据库所有对象的增删改操作的审计开关为例,其他配置项的修改方法与此相同,修改配置项的方法如下所示:
gs_guc reload -N all -I all -c "audit_system_object=12295"
其中audit_system_object代表审计项开关,12295为该审计开关的值。
用户审计
磐维支持按用户身份选择审计的功能,通过设置audit_user参数来判断是否允许对当前用户进行审计。
参数名称 | 参数类型 | 默认值 | 参数值示例 |
audit_user | 字符串 | ‘*’ | ‘pwadmin,pwaudit,pwsso’ |
- 默认值:‘*’,表示对所有用户都审计,参数值为空时等同于默认值。
- 三权分立开启时,audit_user参数由审计管理员设置,其他用户无权限修改
审计日志查看
前提条件
- 审计功能总开关已开启。
- 需要审计的审计项开关已开启。
- 数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证 在查询时段内有审计结果产生。 数据库各个节点审计日志单独记录。
- 只有拥有 AUDITADMIN 属性的用户才可以查看审计记录。
查看审计结果函数
审计查询命令是数据库提供的 sql 函数 pg_query_audit,其原型为:
pg_query_audit(timestamptz startime,timestamptz endtime,audit_log)
参数 startime 和 endtime 分别表示审计记录的开始时间和结束时间, audit_log 表示所查看的审计日志信息所 在的物理文件路径,当不指定 audit_log 时,默认查看连接当前实例的审计日志信息。
pg_query_audit函数的返回字段如下所述:
名称 | 类型 | 描述 |
time | timestampwithtimezone | 操作时间 |
type | text | 操作类型 |
result | text | 操作结果 |
userid | oid | 用户id |
username | text | 执行操作的用户名 |
database | text | 数据库名称 |
Client_conninfo | text | 客户端连接信息 |
Object_name | text | 操作对象信息 |
Detail_info | text | 执行操作详细信息 |
node_name | text | 节点名称 |
thread_id | text | 线程id |
local_port | text | 本地端口 |
remote_port | text | 远程端口 |
查看审计结果示例:
步骤1 以操作系统用户omm登录数据库主节点。
步骤2 查询审计记录。
postgres=# select * from pg_query_audit(‘2024-03-04 08:00:00',’2024-03-04 17:00:00’);
查询结果如下:
time | type | result | userid | username | database | client_conninfo | object_name | detail_info | node_name | thread_id | local_port | remote_port
2024-03-04 08:00:08+08 | login_success | ok | 10 | omm | postgres | gsql@::1 | postgres | login db(postgres) success,the current user is:omm | dn_6001_6002_6003 | 140477687527168@668131208211425 | 17778 | 46946
说明:该条记录表明,用户omm在time字段标识的时间点登录数据库postgres。其中client_conninfo字段在 log_hostname启动且IP连接时,字符@后显示反向DNS查找得到的主机名。
审计日志维护
审计日志相关配置参数
配置项 | 含义 | 默认值 |
audit_directory | 审计文件的存储目录。 | $PGDATA/pg_audit |
audit_resource_policy | 审计日志的保存策略。 | on(表示使用空间配置策略) |
audit_space_limit | 审计文件占用的磁盘空间 总量。 | 1GB |
audit_file_remain_time | 审计日志文件的最小保存 时间。 | 90 |
audit_file_remain_threshold | 审计目录下审计文件的最大数量。 | 1048576 |
审计日志保存方式:
目前常用的记录审计内容的方式有两种:记录到数据库的表中、记录到OS文件中。从数据库安全角度出发,PanWeiDB采用记录到OS文件的方式来保存审计 结果,保证了审计结果的可靠性。
审计日志保存方式比较:
方式 | 优点 | 缺点 |
记录到表中 | 不需要用户维护审计日志。 | 由于表是数据库的对象,如果一个数 据库用户具有一定的权限,就能够访 问到审计表。如果该用户非法操作审 计表,审计记录的准确性难以得到保 证 |
记录到OS 文件中 | 比较安全,即使一个帐户可以 访问数据库,但不一定有访问 OS这个文件的权限。 | 需要用户维护审计日志。 |
维护审计日志-实验
步骤1 登录主节点数据库,选择日志维护方式进行维护。
设置自动删除审计日志: 审计文件占用的磁盘空间或者审计文件的个数超过指定的最大值时,系统将删除最早的审计 文件,并记录审计文件删除信息到审计日志中。
审计文件占用的磁盘空间大小默认值为1024MB,用户可以根据磁盘空间大小重新设置参数。
配置审计文件占用磁盘空间的大小(audit_space_limit):
a. 查看已配置的参数。
postgres=# SHOW audit_space_limit;
audit_space_limit
------------------
1GB
如果显示结果不为1GB(1024MB),执行“\q”命令退出数据库。
b. 建议执行如下命令设置成默认值1024MB。
gs_guc reload -N all -I all -c "audit_space_limit=1024MB"
配置审计文件个数的最大值audit_file_remain_threshold:
a. 查看已配置的参数。
postgres=# show audit_file_remain_threshold;
audit_file_remain_threshold
----------------------------
1048576
(1 row)如果显示结果不为1048576,执行“\q”命令退出数据库。
b. 建议执行如下命令设置成默认值1048576。
[omm@node1 ~]$ gs_guc reload -N all -I all -c "audit_file_remain_threshold=1048576";
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
手动备份审计文件:
当审计文件占用的磁盘空间或者审计文件的个数超过配置文件指定的值时,系统将会自动删除较早的审计文件,因此建议用户周期性地对比较重要的审计日志进行保存。
a. 使用show命令获得审计文件所在目录(audit_directory)。
postgres=# SHOW audit_directory;
b. 将审计目录整个拷贝出来进行保存。
手动删除审计日志:
当不再需要某时段的审计记录时,可以使用审计接口命令pg_delete_audit进行手动删除。
以删除2024/9/20到2024/9/21之间的审计记录为例:
postgres=# SELECT pg_delete_audit(‘2024-09-20 00:00:00‘,’2024-09-21 23:59:59’);
自动删除审计日志:
审计文件占用的磁盘空间或者审计文件的个数超过指定的最大值时,系统将删除最早的审计文件,并记录审计文件删除信息到审计日志中。自动删除触发由audit_resource_policy、audit_space_limit、audit_file_remain_threshold参数共同控制
设置统一审计策略
背景信息
传统审计会产生大量的审计日志,且不支持定制化的访问对象和访问来源配置,不方便数据库安全管理员对审计日志的分析。而统一审计策略支持绑定资源标签、配置数据来源输出审计日志,可以提升安全管理员对数据库监控的效率。
操作步骤
1、执行以下命令开启统一审计开关,并重启数据库生效。
pw_guc set-D $PGDATA-c "enable_security_policy=on“
2、操作系统 root 用户进行 rsyslog 配置。
- 在操作系统后台服务配置文件/etc/rsyslog.conf 中添加:
local0.* /var/log/localmessage
- 重启 rsyslog 服务使配置生效。
sudo systemctl restart rsyslo
3、安全策略管理员登录数据库,配置资源标签。
- 初始化资源。
CREATE TABLE table_security_auditing(id int,name char(10));
Create user user001 password 'xxxxx’;
create user user002 password 'xxxxx’;
grant all privileges to user001
- 新建资源标签。
CREATE RESOURCE LABEL rl_security_auditing ADD TABLE(table_security_auditing);
- 创建审计策略,审计用户user001在资源标签rl_security_auditing 上的DDL、DML操作。
CREATE AUDIT POLICY audit_security_priall PRIVILEGES all on LABEL(rl_secu rity_auditing) FILTER ON ROLES(user001);
CREATE AUDIT POLIC Yaudit_security_accall ACCESS all on LABEL(rl_security _auditing) FILTER ON ROLES(user001);
4、使用用户user001登录数据库,执行如下操作,触发审计策略。
- DML
insert into table_security_auditing values(1,'22');
update table_security_auditing set name=234123 where id=1;
delete from table_security_auditing where id=1;
truncate tabletable_security_auditing;
- DDL
GRANT INSERT ON TABLE table_security_auditing TO user002;
revoke insert on table table_security_auditing from user002;
5、使用操作系统root用户查看审计日志/var/log/localmessage。
6、如不需要继续对特定资源进行审计,可移除审计策略。
drop audit policy audit_security_priall;
drop audit policy audit_security_accall;
统一审计日志字段说明
以如上 TRUNCATE 操作触发的审计日志为例,字段说明如下:
|时间戳|主机名|事件类型|用户名|触发客户端|客户端 IP|操作类型|策略 ID|列名称|执行结果|
注意:在使用 DATABASELINK 功能的场景下,客户端发起的 DATABASELINK 请求,实际的发送方是服务端,发送端 ip 地址等相关的属性将是服务端的值。
审计日志自动转存
功能描述
PanWeiDB 支持当审计日志空间满后审计日志自动转存备份的功能。当审计日志空间满且未开启停写策略(audit_stop_policy=off)时,自动将最早的审计文件转存,即将其从审计目录转移至转存目录。
注意事项
- 对于不同的数据库实例,建议不要将审计日志转存目录配置为相同的目录, 否则会造成转存审计日志数据混乱。
审计日志相关配置参数和内置函数
配置项 | 配置项类别 | 含义 |
audit_dump_directory | 配置参数 | 用于设置审计日志自动转储目录。默认为空,设置路径应为绝对路径,否则报错 |
pg_query_audit_dump() | 内置函数 | 用于查询转存日志。 |
pg_query_audit_info() | 内置函数 | 用于查询存储审计日志空间信息 |
设置审计日志转存目录
alter system set audit_dump_directory='audit_dump_dir’
注意:audit_dump_dir 为用户自定义的转存审计日志的目录。转存目录需要为绝对路径,否则报错。
转存目录在其他数据库实例目录下时,转存目录下无审计日志文件。
查询转存日志
select detail_info,type from pg_query_audit_dump(now()-1,now())
查询审计日志空间信息
select *from pg_query_audit_info()
审计日志自动转存-实验
操作步骤
前提条件:
1、开启审计参数,修改单个审计日志、审计空间大小。
alter system set audit_enabled=on;
alter system set audit_rotation_size=1024;
alter system set audit_space_limit=4096;
2、开启 dml 操作审计。
alter system set audit_dml_state=1
开启审计日志自动转存:
1、查看停写策略、转存目录。
show audit_stop_policy;
show audit_dump_directory
说明:设置审计日志自动转储之前应该关闭停写策略。
2、设置转存目录。
- 创建转存目录,且omm用户有读写权限
mkdir /home/test/pg_audit
- 进入数据库客户端设置转存目录参数值,并重启数据库生效。
alter system set audit_dump_directory='/home/test/pg_audit’;
- 连接进入gsql客户端工具后查看转存目录值。
Show audit_dump_directory;
查询结果为:
/home/panweidb/pg_audit
3、查看第一条审计信息。
select * from pg_query_audit_dump(‘2024-12-31',now()) limit 1
4、查看转存目录空间信息。
select * from pg_query_audit_info();