指定 SQL 审核生效的目标数据库表,支持 db.* 的通配符形式。
SQL 阻断审核规则,支持 json 和 table 两种读取方式(通过设置参数 quark.sql.inspection.read.method
进行指定),下面向您依次介绍这两种方式对应的规则信息编写方式。
JOSN 规则文件
SQL 规则文件的后缀名必须为 .rule,并使用 JSON 语言进行书写。每个 JSON 规则文件只包含一条规则,文件中包含一个 content
即为一条完整的规则,content 内可包含多个具体审核规则且互为 and 关系。
审核参数
在编写 JSON 审核规则文件时,每个文件中需要包含以下审核参数。
参数名称 | 取值范围 | 说明 | 必需项 |
---|---|---|---|
type |
select/global/field |
用于区分 SQL 审核规则类型。本参数用于界定该 json 文件是否为规则文件。 |
是 |
database |
数据库集合 |
|
是 |
user |
用户集合 |
指定该 SQL 审核规则生效的目标用户,“*” 通配符指定所有用户,空集 “[]”不匹配任何用户, |
是 |
content |
具体的规则集合 |
审核规则的具体内容,具体规则类型对应支持的审核规则,请参考 SQL 审核规则进行书写 。 本参数用于界定 json 文件是否为规则文件。 |
是 |
Database 与 Column 书写格式
-
database
字段支持多种写法如下写法一:"database": [ "db1.t1", "db1.t2" "db2.*" ]
复制写法二:"database": { "db1": [ "t1", "t2", "t3" ], "db2": [ "*" ] }
复制 -
field 规则类型中,
column
参数支持以下两种写法:写法一:"column": [ "db1.t1.col1", "db1.t1.col2" "db1.t2.col3" "db1.t3.*", "db2.*.*" ]
复制写法二:"column": { "db1": { "t1": [ "col1", "col2" ], "t2": [ "col3" ], "t3": [ "*" ] }, "db2": [ "*" ] }
复制
书写示例
示例 1:
{ "type": "select", "user": [ "user1", "user2" ], "database": { "db1": [ "tableName1", "tableName2" ], "db2": ["*"] }, "content": { "where": { "exist": true, "matchType": "any", "function": [ "like", "between", "in" ] }, "limit": { "exist": true, "limit": 10, "offset": 10 }, "groupby": { "exist": true }, "sortby": { "exist": true }, "orderby": { "exist": true } } }
复制
-
type
:指定需要阻断的具体规则类型,此处为 select。 -
user
:指定该规则生效的目标用户为 user1、user2。 -
database
:指定该规则生效的目标表为 db1.tableName1、db1.tableName2 以及 db2 中的所有表 -
content
:定义具体的 SQL 审核规则,包含对 SQL 语句中不同部分的审核条件。具体规则请参考 SQL 规范审核规则当查询 SQL 语句中同时匹配以下全部规则时,则阻止该 SQL 语句,
-
WHERE 条件中包含 like、between 或 in 函数
-
LIMIT 值大于或等于 10,或者 OFFSET 值大于或等于 10
-
语句中包含 Group BY
-
语句中包含 Sort By
-
语句中包含 Order By
-
-
以上规则将会阻止以下 SQL 语句执行。
SELECT * FROM db1.tableName1 WHERE name LIKE '%pattern%' UNION ALL SELECT * FROM db1.tableName2 WHERE salary BETWEEN 50000 AND 100000 SORT BY salary UNION ALL SELECT * FROM db1.tableName3 GROUP BY position ORDER BY salary DESC LIMIT 15 OFFSET 12;
复制
示例 2:
{ "type": "field", "user": [ "user1", "user2" ], "database": ["*"], "content": { "select": { "column": [ "a", "b", "c" ] }, "join": { "column": [ "a", "b", "c" ] } } }
复制
-
type
:指定 SQL 审核规则的规则类型,此处为 field。 -
user
:指定该规则生效的目标用户为 user1、user2。 -
database
:指定该规则生效的目标数据库为所有数据库。 -
content
:定义具体的 SQL 字段审核规则及目标 column 字段对象。包含对 SQL 语句中不同部分的审核条件。具体规则请参考 SQL 字段审核规则当查询 SQL 语句中同时匹配以下全部规则时,则阻止该 SQL 语句
-
SELECT 查询的目标列存在列 a、b、c;
-
JOIN 关联条件中包含列 a、b、c。
-
-
以上规则将会阻止以下 SQL 语句执行。
SELECT * FROM table1 JOIN table2 ON table1.b = table2.b;
复制
规则审核表
若您选择 table 作为 SQL 阻断审核规则的读取方式,那么您需要向对应的规则表中插入对应的规则数据。审核规则表默认通过 DBLink 存储在元数据库中 system_dblink
,仅支持使用 INSERT INTO … SELECT
插入。下面向您介绍规则审核表结构。
基本参数表
sql_inspection_common 存放一个 SQL 审核规则的基本信息,
字段名称 | 类型 | 字段说明 | 是否非空 |
---|---|---|---|
name |
string |
规则名称,不可重复 |
非空 |
type |
string |
规则类型,如 select/global/field 等 |
非空 |
user |
string |
用户名,逗号分割,使用 * 表示全员匹配,含逗号用户名使用单引号标注 示例:anonymous,123,'1,2' |
非空 |
database |
string |
指定 SQL 审核规则生效的目标数据库表,使用 database.table 的格式存储,逗号分隔。 示例:db1.t1,db2.* |
非空 |
comment |
string |
存放备注信息 |
规则细节表
sql_inspection_rule 表中存放具体的 SQL 审核规则信息,相同 base 值的数据共同组成一个 SQL 规则的具体审核规则,且互为 and 关系。
字段名称 | 类型 | 字段说明 | 非空字段 |
---|---|---|---|
base |
string |
外键,指向对应规则的在基本参数表 |
非空 |
keyword |
string |
关键字,如 where/limit/groupby 等 |
非空 |
key |
string |
子规则 key |
非空 |
value |
string |
子规则 value |