Перейти к основному содержимому
Версия: 2.0.x

Управление чёрным списком

В некоторых случаях администраторам необходимо запретить определённые шаблоны SQL, чтобы избежать сбоев cluster или неожиданных высоконагруженных запросов. Чёрный список применяется только к операторам SELECT, операторам INSERT (начиная с версии 3.1) и операторам CTAS (начиная с версии 3.4).

Selena позволяет пользователям добавлять, просматривать и удалять чёрные списки SQL.

Синтаксис

Включите чёрный список SQL с помощью enable_sql_blacklist. По умолчанию значение False (выключено).

admin set frontend config ("enable_sql_blacklist" = "true")

Пользователь с правами администратора (ADMIN_PRIV) может управлять чёрными списками, выполняя следующие команды:

ADD SQLBLACKLIST "<sql>"
DELETE SQLBLACKLIST <sql_index_number>
SHOW SQLBLACKLIST
  • Когда enable_sql_blacklist имеет значение true, каждый SQL-запрос должен быть проверен по sqlblacklist. Если он совпадает, пользователь будет уведомлён, что SQL находится в чёрном списке. В противном случае SQL будет выполнен нормально. Сообщение может быть следующим, когда SQL находится в чёрном списке:

ERROR 1064 (HY000): Access denied; sql 'select count (*) from test_all_type_select_2556' is in blacklist

Добавление в чёрный список

ADD SQLBLACKLIST "<sql>"

sql - это регулярное выражение для определённого типа SQL.

подсказка

В настоящее время Selena поддерживает добавление операторов SELECT в чёрный список SQL.

Поскольку сам SQL содержит общие символы (, ), *, ., которые могут быть перепутаны с семантикой регулярных выражений, нам нужно их различать с помощью escape-символов. Учитывая, что ( и ) используются очень часто в SQL, для них не нужно использовать escape-символы. Другие специальные символы требуют использования escape-символа \ в качестве префикса. Например:

  • Запретить count(\*):
ADD SQLBLACKLIST "select count(\\*) from .+"
  • Запретить count(distinct):
ADD SQLBLACKLIST "select count(distinct .+) from .+"
  • Запретить order by limit x, y, 1 <= x <=7, 5 <=y <=7:
ADD SQLBLACKLIST "select id_int from test_all_type_select1 order by id_int limit [1-7], [5-7]"
  • Запретить сложный SQL:
ADD SQLBLACKLIST "select id_int \\* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select (id_int \\* 9 \\- 8) \\/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable"
  • Запретить все операторы INSERT INTO:
ADD SQLBLACKLIST "(?i)^insert\\s+into\\s+.*";
  • Запретить все операторы INSERT INTO ... VALUES:
ADD SQLBLACKLIST "(?i)^insert\\s+into\\s+.*values\\s*\\(";
  • Запретить все операторы INSERT INTO ... VALUES, кроме тех, которые направлены на системное представление _statistics_.column_statistics:
ADD SQLBLACKLIST "(?i)^insert\\s+into\\s+(?!column_statistics\\b).*values\\s*\\(";

Просмотр чёрного списка

SHOW SQLBLACKLIST

Формат результата: Index | Forbidden SQL

Например:

mysql> show sqlblacklist;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Index | Forbidden SQL |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | select count\(\*\) from .+ |
| 2 | select id_int \* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select \(id_int \* 9 \- 8\) \/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable |
| 3 | select id_int from test_all_type_select1 order by id_int limit [1-7], [5-7] |
| 4 | select count\(distinct .+\) from .+ |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

SQL, показанный в Forbidden SQL, экранирован для всех семантических символов SQL.

Удаление из чёрного списка

DELETE SQLBLACKLIST <sql_index_number>

<sql_index_number> - это список идентификаторов SQL, разделённых запятой (,).

Например, удалим SQL №3 и №4 в приведённом выше чёрном списке:

delete sqlblacklist  3, 4;

Тогда оставшийся sqlblacklist будет следующим:

mysql> show sqlblacklist;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Index | Forbidden SQL |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | select count\(\*\) from .+ |
| 2 | select id_int \* 4, id_tinyint, id_varchar from test_all_type_nullable except select id_int, id_tinyint, id_varchar from test_basic except select \(id_int \* 9 \- 8\) \/ 2, id_tinyint, id_varchar from test_all_type_nullable2 except select id_int, id_tinyint, id_varchar from test_basic_nullable |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+