多列的 ProxySQL 数据屏蔽

ProxySQL data masking for multiple columns

我想使用 ProxySQL 屏蔽名为 my_table 的 table 中多列的敏感信息。

我已经按照此 tutorial 使用以下 mysql_query_rules:

成功屏蔽了 table 中名为 column_name 的单个列
/* 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', 
                "CONCAT(LEFT(column_name,1),REPEAT('X',CHAR_LENGTH(column_name)-1)) column_name",1);

但是当我添加第二条规则来屏蔽 table 中另一个名为 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', 
                "CONCAT(LEFT(second_column_name,CHAR_LENGTH(second_column_name)-3),REPEAT('X',3)) second_column_name",1);

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

SELECT column_name FROM my_table; returns 蒙面 column_name.

SELECT second_column_name FROM my_table; returns 蒙面 second_column_name.

SELECT column_name, second_column_name FROM my_table; returns 数据 column_name 被屏蔽,但 second_column_name 未被屏蔽。

SELECT second_column_name, column_name FROM my_table; 也 returns 屏蔽了 column_name 的数据,但是 second_column_name 没有屏蔽。

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

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

使用 flagIN, flagOUT, and apply 可以屏蔽多列数据。

这是最后的 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,    "CONCAT(LEFT(column_name,1),REPEAT('X',CHAR_LENGTH(column_name)-1)) column_name",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,
                "CONCAT(LEFT(second_column_name,CHAR_LENGTH(second_column_name)-3),REPEAT('X',3)) second_column_name",1);

三个变量的含义如下:

  • flagINflagOUTapply - 这些允许我们创建 "chains of rules" 一个接一个地应用。输入标志值设置为 0,并且在开始时只考虑 flagIN=0 的规则。什么时候 为特定查询找到匹配规则,评估 flagOUT 如果 NOT NULL 查询将被标记为指定的标志 标记输出。如果 flagOUT 不同于 flagIN ,查询将退出 当前链并进入一个新的以 flagIN 为规则的链 新的输入标志。如果 flagOUT 匹配 flagIN,则查询将是 使用所述 flagIN 根据第一条规则再次重新评估。这个 发生直到没有更多的匹配规则,或者 apply 设置为 1 (这意味着这是要应用的最后一条规则)