1

我想屏蔽my_table使用 ProxySQL 命名的表中多个列的敏感信息。

我已按照本教程column_name使用以下方法成功屏蔽了表中命名的单个列mysql_query_rules

/* only show the first character in column_name */
INSERT INTO mysql_query_rules (rule_id,active,username,schemaname,match_pattern,re_modifiers,replace_pattern,apply)
          VALUES (1,1,'developer','my_table','(\(?)(`?\w+`?\.)?\`?column_name\`?(\)?)([ ,\n])','caseless,global', 
                "\1CONCAT(LEFT(\2column_name,1),REPEAT('X',CHAR_LENGTH(column_name)-1))\3 column_name\4",1);

但是,当我添加第二条规则来屏蔽表中调用second_column_name的另一列时,proxysql 无法屏蔽第二列。这是第二条规则:

/* masking the last 3 characters in second_column_name */
INSERT INTO mysql_query_rules (rule_id,active,username,schemaname,match_pattern,re_modifiers,replace_pattern,apply)
          VALUES (2,1,'developer','my_table','(\(?)(`?\w+`?\.)?\`?second_column_name\`?(\)?)([ ,\n])','caseless,global', 
                "\1CONCAT(LEFT(\2second_column_name,CHAR_LENGTH(second_column_name)-3),REPEAT('X',3))\3 second_column_name\4",1);

添加2条规则后的查询结果如下:

SELECT column_name FROM my_table;返回一个蒙面的column_name.

SELECT second_column_name FROM my_table;返回一个蒙面的second_column_name.

SELECT column_name, second_column_name FROM my_table;返回带column_name掩码但未second_column_name掩码的数据。

SELECT second_column_name, column_name FROM my_table;还返回带column_name掩码的数据,但未second_column_name掩码。

这是否意味着 1 个查询只能与 1 个规则匹配?

如何使用 ProxySQL 屏蔽多列中的数据?

4

1 回答 1

1

使用flagINflagOUTapply允许我屏蔽多列上的数据。

这是我的决赛mysql_query_rules

/* only show the first character in column_name */
INSERT INTO mysql_query_rules (rule_id,active,username,schemaname,flagIN,match_pattern,re_modifiers,flagOUT,replace_pattern,apply)
          VALUES (1,1,'developer','my_db',0,'(\(?)(`?\w+`?\.)?\`?column_name\`?(\)?)([ ,\n])','caseless,global',6,    "\1CONCAT(LEFT(\2column_name,1),REPEAT('X',CHAR_LENGTH(column_name)-1))\3 column_name\4",0);
/* masking the last 3 characters in second_column_name */
INSERT INTO mysql_query_rules (rule_id,active,username,schemaname,flagIN,match_pattern,re_modifiers,flagOUT,replace_pattern,apply)
          VALUES (2,1,'developer','my_db',6,'(\(?)(`?\w+`?\.)?\`?second_column_name\`?(\)?)([ ,\n])','caseless,global',NULL,
                "\1CONCAT(LEFT(\2second_column_name,CHAR_LENGTH(second_column_name)-3),REPEAT('X',3))\3 second_column_name\4",1);

3个变量的含义如下:

  • flagIN, flagOUT, apply- 这些允许我们创建一个接一个地应用的“规则链”。输入标志值设置为 0,开始时只考虑 flagIN=0 的规则。当为特定查询找到匹配规则时,会评估 flagOUT,如果不是 NULL,则查询将使用 flagOUT 中的指定标志进行标记。如果 flagOUT 与 flagIN 不同,则查询将退出当前链并输入以 flagIN 作为新输入标志的新规则链。如果 flagOUT 与 flagIN 匹配,则将针对具有所述 flagIN 的第一条规则再次重新评估查询。直到没有更多匹配规则或 apply 设置为 1 (这意味着这是要应用的最后一个规则)才会发生这种情况
于 2019-03-18T05:27:52.810 回答