多列的 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);
三个变量的含义如下:
flagIN
、flagOUT
、apply
- 这些允许我们创建 "chains of rules"
一个接一个地应用。输入标志值设置为
0,并且在开始时只考虑 flagIN=0 的规则。什么时候
为特定查询找到匹配规则,评估 flagOUT
如果 NOT NULL 查询将被标记为指定的标志
标记输出。如果 flagOUT 不同于 flagIN ,查询将退出
当前链并进入一个新的以 flagIN 为规则的链
新的输入标志。如果 flagOUT 匹配 flagIN,则查询将是
使用所述 flagIN 根据第一条规则再次重新评估。这个
发生直到没有更多的匹配规则,或者 apply 设置为 1
(这意味着这是要应用的最后一条规则)
我想使用 ProxySQL 屏蔽名为 my_table
的 table 中多列的敏感信息。
我已经按照此 tutorial 使用以下 mysql_query_rules
:
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);
三个变量的含义如下:
flagIN
、flagOUT
、apply
- 这些允许我们创建 "chains of rules" 一个接一个地应用。输入标志值设置为 0,并且在开始时只考虑 flagIN=0 的规则。什么时候 为特定查询找到匹配规则,评估 flagOUT 如果 NOT NULL 查询将被标记为指定的标志 标记输出。如果 flagOUT 不同于 flagIN ,查询将退出 当前链并进入一个新的以 flagIN 为规则的链 新的输入标志。如果 flagOUT 匹配 flagIN,则查询将是 使用所述 flagIN 根据第一条规则再次重新评估。这个 发生直到没有更多的匹配规则,或者 apply 设置为 1 (这意味着这是要应用的最后一条规则)