Gaussdb安全审计
一、概念
数据库审计是对数据库操作进行记录、监控和审查的技术手段,其核心是追踪谁、在何时、对什么数据、执行了何种操作。审计记录通常会详细保存用户标识、操作时间、SQL语句、操作对象(如表、行)和结果(如是否成功)等关键信息。其主要目的在于满足合规要求、实现安全监控、进行事后追溯分析和威慑违规操作,是保障数据安全与问责的核心防线。
二、基本操作
1、查看审计是否打开
show audit_enabled;
select name,setting from pg_settings where name=‘audit_enabled’;
2、查看日志存储最大空间
select name,setting from pg_settings where name=‘audit_space_limit’;
3、查看过去一天所有产生审计日志的总数,当前时间要求使用now()
select count(* ) from pg_query_audit(now()-1,now());
4、查看过去一天user1这个用户登录postgres数据库,当前是要要求使用now()
select * from pg_query_audit(now()-1,now())
where type=‘login_success’ and username = ‘user1’ and database=‘postgres’;
5、删除’2025-09-20 00:00:00’到’2025-09-21 23:59:59’时间段的审计记录
select pg_delete_audit(‘2025-09-20 00:00:00’,‘2025-09-21 23:59:59’);
6、删除数据库test,级联删除用户user1
drop database test;
drop user user1 cascade;
三、示例一
1、创建用户user1
create user user1 password ‘Test@123’;
2、给用户授予查看审计权限,同时可以创建审计策略
alter user user1 auditadmin poladmin;
3、切换至user1,创建审计策略adt1,对数据库执行create操作创建
– 切换用户(DAS在右上角切换)
\c 数据库名 用户名
\c postgres user1
– 切换到实例管理界面的参数管理模块,修改alter system set enable_security_policy=on
– 创建审计
create audit policy adt1 privileges create;
4、创建审计策略adt2,数据库执行select操作创建审计策略
create audit policy adt2 access select;
5、修改adt1,对ip地址为’10.20.30.40’进行审计
alter audit policy adt1 modify(filter on ip(‘10.20.30.40’));
6、创建表
create table tb1(c1 int,c2 varchar(50));
7、创建审计策略adt3,仅审计记录用户root,在执行针对表tb1资源进行select、insert、delete操作数据库创建审计策略
create resource label label3 add table(tb1);
create audit policy adt3 access select on label(label3),insert on label(label3),delete on label(label3) filter on roles(root);
8、关闭adt1审计策略
alter audit policy adt1 disable;
9、删除以上创建的审计策略,级联删除用户user1
drop audit policy adt1,adt2,adt3;
drop resource label label3;
drop user user1 cascade;
四、示例二
1、创建user3用户,密码’test@123’
create user user3 password ‘test@123’;
2、给用户授予查看审计权限
alter user user3 with auditadmin;
3、登录postgres,创建统一审计策略adt1,对所有数据库执行create审计操作
– 切换到实例管理界面的参数管理模块,修改enable_security_policy为on;
– 1. 查看当前状态
SHOW enable_security_policy;
– 2. 设置为on
– 当前会话
SET enable_security_policy = on;
– 系统级别永久
ALTER SYSTEM SET enable_security_policy = on;
– 3. 重新加载配置文件,使更改生效(无需重启)
SELECT pg_reload_conf();
– 4. 再次验证设置是否成功
SHOW enable_security_policy;
– 创建统一审计策略
create audit policy adt1 privileges create;
4、登录postgres,创建审计策略adt2,对所有数据库执行select审计操作
create audit policy adt2 access select;
5、登录postgres,创建表tb1,创建审计策略adt3,仅审计记录用户root,在执行针对表tb1资源进行的select、insert、delete操作数据库创建审计策略
create table tb1(c1 int);
create resource label tb1_label add table(tb1);
create audit policy adt3 access select on label(tb1_label),insert on label(tb1_label),delete on label(tb1_label) filter on roles(root);
6、为统一审计对象策略adt1,添加描述 ‘audit policy for tb1’
alter audit policy adt1 comments ‘audit policy for tb1’;
7、修改adt1,使之对IP地址为 ‘10.20.30.40’ 的场景生效
alter audit policy adt1 modify(filter on ip(‘10.20.30.40’));
8、禁用统一审计策略adt1
alter audit policy adt1 disable;
9、删除策略adt1、adt2、adt3和相应的资源标签,级联删除用户user1
drop audit policy adt1,adt2,adt3;
drop resource label tb1_label;
drop user user1 cascade;
五、行级访问控制
示例一:create table all_data(role varchar(50),name varchar(50),age int);
1、打开all_data表的行访问控制策略开关
alter table all_data enable row level security;
2、创建行级访问控制策略,当前用户只能查看用户自身的数据
create row level security policy all_data_rls on all_data using(role = current_user);
3、删除策略
drop row level security policy all_data_rls on all_data;
4、关闭行级访问策略
alter table all_data disable row level security;
示例二:create table bank_card(b_number nchar(30) primary key,b_type nchar(20),b_c_id int not null);
1、创建用户crecard_mger、savcard_mger,密码均为“Test@123”
create user crecard_mger password ‘Test@123’;
create user savcard_mger password ‘Test@123’;
2、给创建的两个用户授予bank_card表的读取权限
grant usage on schema root to crecard_mger,savcard_mger;
grant select on bank_card to crecard_mger,savcard_mger;
3、打开bank_card表的行级别访问控制开关
alter table bank_card enable row level security;
4、创建行级访问控制策略bank_card_rls,要求crecard_mger用户只能查看信用卡信息,savcard_mger用户只能查看储蓄卡信息
create row level security policy bank_card_rls on bank_card to crecard_mger,savcard_mger using(b_type = case when current_user=‘crecard_mger’ then ‘信用卡’ when current_user=‘savcard_mger’ then ‘储蓄卡’ else ‘’ end);
5、切换到crecard_mger用户查看bank_card表内容
\c postgres crecard_mger
select * from root.bank_card;
6、使用root用户删除行级控制策略bank_card_rls,并关闭表的行级访问控制开关
\c - root
drop row level security policy bank_card_rls on bank_card;
alter table bank_card disable row level security;
六、动态数据脱敏
show enable_security_policy;
gs_guc reload -Z coordinator -N all -I all -c “enable_security_policy=on”
1、创建dev_mask和bob_mask用户
create user dev_mask password ‘Test@123’;
create user bob_mask password ‘Test@123’;
2、创建表tb_for_masking,字段信息包括(col1 text,col2 text,col3 text)
create table tb_for_masking(col1 text,col2 text,col3 text);
3、为col1设置脱敏策略,使用maskall对col1列进行数据脱敏
create resource label mask_lb1 add column(tb_for_masking.col1);
create masking policy maskpol1 maskall on label(mask_lb1);
4、为maskpol1脱敏策略添加描述信息"masking policy for tb_for_masking.col1"
alter masking policy maskpol1 comments ‘masking policy for tb_for_masking.col1’;
5、为maskpol1脱敏策略在原基础上新增对col2列做随机脱敏,脱敏函数使用randommasking
create resource label mask_lb2 add column(tb_for_masking.col2);
alter masking policy maskpol1 add randommasking on label(mask_lb2);
6、修改maskpol1移除在col2列上的randommasking脱敏方式
alter masking policy maskpol1 remove randommasking on label(mask_lb2);
7、修改maskpol1修改一项脱敏方式,将在col1列上的maskall脱敏策略改为randommasking脱敏
alter masking policy maskpol1 modify randommasking on label(mask_lb1);
8、修改脱敏策略maskpol1使之仅对用户dev_mask和bob_mask,客户工具为psql和gsql,IP地址为’10.20.30.40’,‘127.0.0.0/24’ 场景生效
alter masking policy maskpol1 modify(filter on roles(dev_mask,bob_mask),app(psql,gsql),IP(‘10.20.30.40’,‘127.0.0.0/24’));
9、修改脱敏策略maskpol1,使之对所有用户场景生效
alter masking policy maskpol1 drop filter;
10、禁用脱敏策略
alter masking policy maskpol1 disable;
- 点赞
- 收藏
- 关注作者
评论(0)