安全
SQL防火墙
管理平台提供的SQL防火墙功能可为用户拦截高危SQL、误操作SQL等,提升系统安全性。
同时防火墙提供观测功能,可在开启新规则前,通过开启观测状态,判断新规则对业务的影响程度。开启观测状态后,计算节点不会对SQL进行拦截,但会进行记录,双击观测状态图标,可跳转至SQL命中记录页面。
-
SQL防火墙功能目前只支持开启管理平台提供的可拦截SQL模板,暂不支持自定义SQL
-
可单个或批量启用、关闭拦截规则,启用或关闭都需要动态加载后才能生效。生效后在计算节点中执行已拦截的SQL会提示“ERROR 10029 (HY000): You are using SQL_Firewall, this sql isn’t allowed”
-
目前管理平台提供40条可拦截SQL模板,对具体拦截过的SQL可在“事件->审计日志->安全防护”中查看
-
SQL防火墙功能中增加一条拦截规则,支持对where子句中不带分片字段的SQL语句进行拦截,提升系统查询效率
-
开启观测状态后,图标会变为蓝色。对正在启用状态的规则,开启观测状态,会自动关闭规则,动态加载后生效。
-
观测状态下,命中的SQL记录,可双击规则左侧的2images-586 图标,跳转至命中记录页面,该页面记录当前规则命中SQL的逻辑库、SQL语句摘要、命中次数、最新命中时间、最新执行的客户端IP、最新执行的用户。
管理平台在安全->SQL防火墙对应显示“ 不允许where条件不带分片字段”SQL防火墙规则,如下图:
该规则默认关闭,打开后,状态更新为拦截中,需动态加载生效,如下图:
观测状态默认关闭,点击观测图标后,状态更新为观测中,图标变为蓝色,需动态加载生效,如下图:
双击蓝色图标,跳转至新页面,显示该规则下所有命中的SQL及对应信息。
若该规则拦截中,则在计算节点服务端执行的所有where条件未带分片字段(子表为关联字段)的SQL且操作的表为水平分片表或子表时都会拦截。
示例:
创建水平分片表teacher,分片字段为id,当该规则拦截中,where条件不带分片字段如下图:
同时事件->审计日志->安全防护界面可以看到相关拦截日志:
SQL防火墙功能中增加10条新的拦截规则,分别如下:
create_no_pri_index_disallow不允许无主键的表创建,默认为开启状态
创建表test无主键,如下图:
join_sql_limit_N不允许单条SQL内的JOIN次数超过限制次数的语句执行(子查询拆分后可能也会存在内部join),默认为3,及规则显示为join_sql_limit_3,可对次数进行编辑
表左连接4次,如下图:
set_logical_operators_disallow不允许SET子句的右值含有逻辑运算符,SET子句包含INSERT、UPDATE、INSERT … ON DUPLICATE KEY UPDATE
表执行UPDATE,SET语句采用AND逻辑运算符,如下图:
no_column_compare_disallow不允许where条件中不包含表内字段比较的语句执行
表WHERE条件中不包含表内字段,如下图:
select_where_always_false_disallow不允许WHERE条件永假的SELECT
表执行SELECT,WHERE条件为永假,如下图:
update_where_always_false_disallow不允许WHERE条件永假的UPDATE
表执行UPDATE,WHERE条件为永假,如下图:
delete_where_always_false_disallow不允许WHERE条件永假的DELETE
表执行DELETE,WHERE条件为永假,如下图:
create_table_as_select_disallow不允许执行CREATE TABLE [AS]…SELECT语句
表采用CREATE AS SELECT语法建表,如下图:
drop_pri_index_disallow不允许删除主键
表删除主键时会被拦截,如下图:
删除主键字段时,也会拦截,如下图:
若有唯一的主键,drop primary key,必须跟随add column primary key,或者add primary key;
若有drop唯一的主键字段,alter table drop column,必须跟随add column primary key,或者add primary key
max_limit_offset_1m不允许limit偏移量超过限制行数的语句执行,单位m百万行,默认限制的偏移量数为100万,可对数字进行编辑,单位为百万。
表偏移量设置为1m时,两种语法都可限制,如下图:
表偏移量设置为2m时,如下图:
SQL防火墙功能中增加一条拦截规则:no_inplace_ddl_disallow不允许非inplace模式的DDL语句执行,推荐替换为onlineDDL。
开启相应防火墙时,支持inplace模式的DDL未采用inplace模式会被拦截,如下图: