Halo Tech

Halo Database安全功能-SQL防火墙

    在当今时代,数据已成为各行各业的核心资产,数据安全已成为保障行业经济持续发展的底线屏障,而数据库作为数据存储的核心载体,是数据安全防护体系中最关键、最核心的防线。

    Halo Database作为一款企业级的大型通用数据库管理系统,在数据库安全性方向为用户提供了全方位的防护体系,高安全性也让Halo Database成为现代企业的首选,下面来主要介绍Halo Database安全功能-SQL防火墙。

    SQL防火墙作为数据库Halo Database安全体系的 "前端守门人",是专门针对SQL语句交互设计的动态防护机制,其核心价值在于通过对数据库访问的 SQL 查询进行实时监控、检测与拦截,从入口处阻断恶意操作。

以下是Halo Database SQL防火墙功能的测试实践演示:

    Halo Database SQL防火墙功能参数sql_firewall_mode可以设置4个值:

    disabled   # 关闭SQL防火墙。

    learning   # 学习模式,防火墙会记录用户的SQL查询,作为用户常用查询的预期白名单,此时防火墙打开不做校验,这个过程建议持续一段较长的时间,尽量让防火墙学习到所有可能执行的SQL。

    permissive # 此模式下,防火墙会对用户的SQL进行判断,如果用户的SQL不在白名单中,仍然会执行该SQL,但是会给用户一个报警,告知用户这条SQL不符合白名单记录的业务规则。

    enforcing  # 此模式下,防火墙会对用户的SQL进行判断。如果用户的SQL不在白名单中,防火墙会拒绝该SQL的执行并告知用户这是一个错误。

1.disabled模式(默认模式)

    登录数据库,查看当前SQL防火墙参数配置

psqlshow sql_firewall_mode; 
Image

    创建测试表和插入测试数据

create table sqlfirewall_test_allow (  uid integer primary key,  uname text not null);insert into sqlfirewall_test_allow values (1,'sqlfirewalltest1');insert into sqlfirewall_test_allow values (2,'sqlfirewalltest2');insert into sqlfirewall_test_allow values (3,'sqlfirewalltest3');insert into sqlfirewall_test_allow values (4,'sqlfirewalltest4');insert into sqlfirewall_test_allow values (5,'sqlfirewalltest5');insert into sqlfirewall_test_allow values (6,'sqlfirewalltest6');insert into sqlfirewall_test_allow values (7,'sqlfirewalltest7');
create table sqlfirewall_test_reject (  uid integer primary key,  uname text not null);insert into sqlfirewall_test_reject values (1,'sqlfirewalltest1');insert into sqlfirewall_test_reject values (2,'sqlfirewalltest2');insert into sqlfirewall_test_reject values (3,'sqlfirewalltest3');insert into sqlfirewall_test_reject values (4,'sqlfirewalltest4');insert into sqlfirewall_test_reject values (5,'sqlfirewalltest5');insert into sqlfirewall_test_reject values (6,'sqlfirewalltest6');insert into sqlfirewall_test_reject values (7,'sqlfirewalltest7');
Image

    执行测试SQL语句

select * from sqlfirewall_test_allow  where uid =1 and uname='sqlfirewalltest1';delete from sqlfirewall_test_allow where uid = 1;update sqlfirewall_test_allow set uid = 300 where uid=3;
Image

    在disabled模式以上SQL语句执行均可正常执行,无任何限制。

2.learning模式

    打开防火墙learning模式

    编辑Halo参数文件

vi /data/halo/postgresql.conf

    设置以下参数

sql_firewall_mode='learning'

    重启数据库

pg_ctl restart

    登录数据库,查看当前SQL防火墙参数配置

psqlshow sql_firewall_mode; 
Image

    模拟用户日常业务执行SQL

select * from sqlfirewall_test_allow  where uid =2 and uname='sqlfirewalltest2';delete from sqlfirewall_test_allow where uid = 4;update sqlfirewall_test_allow set uid =301 where uid=5;
Image

    查看用户常用查询的预期白名单中的SQL

select * from sql_firewall.sql_firewall_statements;
Image

    在learning模式以上SQL语句执行均可正常执行,无任何限制,并记录SQL白名单。

3.permissive模式

    打开防火墙permissive模式

vi /data/halo/postgresql.conf

    设置以下参数

sql_firewall_mode='permissive'

    重启数据库

pg_ctl restart

    登录数据库,查看当前SQL防火墙参数配置

psqlshow sql_firewall_mode;
Image

    执行测试SQL,测试SQL防火墙permissive模式是否生效

    执行在白名单内的SQL,可以正常执行。

select * from sqlfirewall_test_allow  where uid =2 and uname='sqlfirewalltest2';
Image

    执行在白名单外的SQL,仍然会执行该SQL,但是会给用户一个报警,告知用户这条SQL不符合白名单记录的业务规则

select * from sqlfirewall_test_allow  where uid =1 or uname='sqlfirewalltest1';delete from sqlfirewall_test_allow where uname like '%sqlfirewalltest1%';
Image

    在permissive模式以上SQL语句执行均可正常执行,无任何限制,但在非白名单内的SQL将有告警提示。

4.enforcing模式

    打开防火墙enforcing模式

vi /data/halo/postgresql.conf

    设置以下参数

sql_firewall_mode='enforcing'

    重启数据库

pg_ctl restart

    登录数据库,查看当前SQL防火墙参数配置

psqlshow sql_firewall_mode; 
Image

    测试执行在白名单的SQL均可正常执行。

select * from sqlfirewall_test_allow  where uid =2 and uname='sqlfirewalltest2';delete from sqlfirewall_test_allow where uid = 4;update sqlfirewall_test_allow set uid =301 where uid=5;
Image

    测试非白名单的SQL,在白名单外的SQL均无法执行。

select * from sqlfirewall_test_reject  where uid =1 or uname='sqlfirewalltest1 or uid > 3';update sqlfirewall_test_reject set uname='test';delete from sqlfirewall_test_reject;drop table sqlfirewall_test_reject;
Image

    在enforcing模式以上SQL语句在白名单内的执行均可正常执行,在非白名单内的SQL均被防火墙拦截无法执行。

5.白名单管理

    白名单移除

    查看当前设置白名单

select * from sql_firewall.sql_firewall_statements;
Image

    将sql_firewall_mode改为disabled

Image

    将hash_value值为-1344290182252713742对应的白名单SQL删除

delete from sql_firewall.sql_firewall_statements where hash_value= -1344290182252713742;
Image

    将sql_firewall_mode改为enforcing

Image

    再执行之前在SQL白名单的语句,语句报错无法执行,被SQL防火墙拦截。

update sqlfirewall_test_allow set uid =301 where uid=5;
Image

    白名单添加

    查看当前设置白名单

select * from sql_firewall.sql_firewall_statements;
Image

    将sql_firewall_mode改为disabled

Image

    将之前移除的SQL加入白名单

insert into sql_firewall.sql_firewall_statements (hash_value,query) values (‘-1344290182252713742,' update sqlfirewall_test_allow set uid =$1 where uid=$2;');
Image

    将sql_firewall_mode改为enforcing

Image

    再次执行之前被SQL防火墙拦截的测试SQL,发现已经可以正常执行。

update sqlfirewall_test_allow set uid =301 where uid=5;
Image

    好了,关于Halo Database安全功能-SQL防火墙的测试和演示分享就到这里,期待与您一起共同探索Halo Database更多的功能。