Маскировка данных ProxySQL для нескольких столбцов - PullRequest
0 голосов
/ 18 марта 2019

Я хочу замаскировать конфиденциальную информацию о нескольких столбцах в таблице с именем 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 запрос может соответствовать только одному правилу?

Как я могу маскировать данные в нескольких столбцах с помощью ProxySQL?

1 Ответ

0 голосов
/ 18 марта 2019

Использование 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);

Значения трех переменных следующие:

  • flagIN, flagOUT, apply - они позволяют нам создавать «цепочки правил»которые применяются один за другим.Значение входного флага установлено в 0, и в начале рассматриваются только правила с flagIN = 0.Когда для определенного запроса найдено соответствующее правило, оценивается flagOUT, и если NOT NULL, запрос будет помечен с указанным флагом в flagOUT.Если flagOUT отличается от flagIN, запрос выйдет из текущей цепочки и войдет в новую цепочку правил, имеющую flagIN в качестве нового входного флага.Если flagOUT совпадает с flagIN, запрос будет переоценен снова по первому правилу с указанным flagIN.Это происходит до тех пор, пока не будет найдено больше подходящих правил, или если для свойства apply установлено значение 1 (это означает, что это последнее правило, которое будет применено)
...