Маскировка данных ProxySQL для нескольких столбцов
Я хочу замаскировать конфиденциальную информацию в нескольких столбцах таблицы с именем 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);
Вот результат запроса после добавления двух правил:
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?
1 ответ
С помощью flagIN
, flagOUT
, а также 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, "\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, и если NOT NULL, запрос будет помечен с указанным флагом в flagOUT. Если flagOUT отличается от flagIN, запрос выйдет из текущей цепочки и войдет в новую цепочку правил, имеющую flagIN в качестве нового входного флага. Если flagOUT совпадает с flagIN, запрос будет переоценен снова по первому правилу с указанным flagIN. Это происходит до тех пор, пока не будет найдено больше подходящих правил, или для параметра apply установлено значение 1 (что означает, что это последнее правило, которое будет применено)