Маскировка данных 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 (что означает, что это последнее правило, которое будет применено)
Другие вопросы по тегам