Spec-Zone.ru › MySQL 5.7

6.4.6.3 Использование брандмауэра MySQL Enterprise

Перед использованием брандмауэра MySQL Enterprise, установите его в соответствии с инструкциями в разделе 6.4.6.2 «Установка или удаление брандмауэра MySQL Enterprise». Кроме того, брандмауэр MySQL Enterprise не работает совместно с кэшем запросов; отключите кэш запросов, если он включён (см. раздел 8.10.3.3 «Настройка кэша запросов»).

В этом разделе описывается, как настроить брандмауэр MySQL Enterprise с помощью SQL-команд. В качестве альтернативы, MySQL Workbench 6.3.4 или более поздней версии предоставляет графический интерфейс для управления брандмауэром. См. .

  • Включение или отключение брандмауэра

  • Назначение привилегий брандмауэра

  • Концепции брандмауэра

  • Регистрация профилей учетных записей брандмауэра

  • Мониторинг брандмауэра

Включение или отключение брандмауэра

Для включения или отключения брандмауэра, установите системную переменную mysql_firewall_mode. По умолчанию эта переменная включена при установке брандмауэра. Для явного управления начальным состоянием брандмауэра, вы можете установить переменную при запуске сервера. Например, для включения брандмауэра в файле опций, используйте следующие строки:

[mysqld]
mysql_firewall_mode=ON

После изменения my.cnf, перезапустите сервер, чтобы новое значение вступило в силу.

Также возможно отключить или включить брандмауэр во время работы:

SET GLOBAL mysql_firewall_mode = OFF;
SET GLOBAL mysql_firewall_mode = ON;
Назначение привилегий брандмауэра

После установки брандмауэра, предоставьте соответствующие привилегии учетной записи MySQL или учетным записям, которые будут использоваться для его администрирования:

  • Предоставьте привилегию EXECUTE для хранимых процедур брандмауэра в базе данных системы mysql. Они могут вызывать административные функции, поэтому доступ к хранимым процедурам также требует привилегий, необходимых для этих функций.

  • Предоставьте привилегию SUPER, чтобы административные функции брандмауэра могли быть выполнены.

Концепции брандмауэра

Сервер MySQL позволяет клиентам подключаться и получать от них SQL-запросы для выполнения. Если брандмауэр включен, сервер передает ему каждый входящий запрос, который не приводит к немедленному синтаксическому ошибке. В зависимости от того, принимает ли брандмауэр запрос, сервер выполняет его или возвращает ошибку клиенту. В этом разделе описывается, как брандмауэр выполняет задачу принятия или отклонения запросов.

  • Профили брандмауэра

  • Сопоставление запросов брандмауэром

  • Режимы работы профилей

Профили брандмауэра

Брандмауэр использует реестр профилей, которые определяют, разрешить ли выполнение запроса. Профили имеют следующие атрибуты:

  • Список разрешенных запросов. Список разрешенных запросов — это набор правил, определяющих, какие запросы приемлемы для профиля.

  • Текущий режим работы. Режим позволяет использовать профиль различными способами. Например, профиль может быть помещен в режим обучения для создания списка разрешенных запросов; список разрешенных запросов может использоваться для ограничения выполнения запросов или обнаружения вторжений; профиль может быть полностью отключен.

  • Область применения. Область применения указывает, к каким подключениям клиентов применяется профиль.

    Брандмауэр поддерживает профили на основе учетных записей, так что каждый профиль соответствует конкретной учетной записи клиента (комбинации имени пользователя и имени хоста клиента). Например, вы можете зарегистрировать один профиль учетной записи, для которого список разрешенных запросов применяется к подключениям, исходящим из admin@localhost, и другой профиль учетной записи, для которого список разрешенных запросов применяется к подключениям, исходящим из myapp@apphost.example.com.

Изначально профили отсутствуют, поэтому по умолчанию брандмауэр принимает все запросы и не влияет на то, какие запросы могут выполнять учетные записи MySQL. Для применения защитных возможностей брандмауэра требуется явное действие:

  • Зарегистрировать один или несколько профилей в брандмауэре.

  • Обучить брандмауэр, создав список разрешенных запросов для каждого профиля; другими словами, типы запросов, которые профиль разрешает выполнять клиентам.

  • Поместить обученные профили в защитный режим, чтобы укрепить MySQL от выполнения несанкционированных запросов:

    • MySQL связывает каждую сессию клиента со специфичной комбинацией имени пользователя и имени хоста. Эта комбинация — это учетная запись сессии.

    • Для каждого подключения клиента брандмауэр использует учетную запись сессии для определения профиля, который применяется к обработке входящих запросов от клиента.

      Брандмауэр принимает только запросы, разрешенные списком разрешенных запросов соответствующего профиля.

Защита на основе профилей, предоставляемая брандмауэром, позволяет реализовать такие стратегии:

  • Если приложение имеет уникальные требования к защите, настройте его на использование учетной записи, не используемой для других целей, и создайте профиль для этой учетной записи.

  • Если связанные приложения имеют общие требования к защите, настройте их все на использование одной и той же учетной записи (и, таким образом, одного и того же профиля учетной записи).

Сопоставление запросов брандмауэром

Сопоставление запросов, выполняемое брандмауэром, не использует SQL-запросы, полученные от клиентов. Вместо этого сервер преобразует входящие запросы в нормализованную форму дайджеста, и работа брандмауэра использует эти дайджесты. Преимущество нормализации запросов заключается в том, что она позволяет группировать похожие запросы и распознавать их с использованием одного шаблона. Например, эти запросы отличаются друг от друга:

SELECT first_name, last_name FROM customer WHERE customer_id = 1;
select first_name, last_name from customer where customer_id = 99;
SELECT first_name, last_name FROM customer WHERE customer_id = 143;

Но все они имеют одинаковую нормализованную форму дайджеста:

SELECT `first_name` , `last_name` FROM `customer` WHERE `customer_id` = ?

Используя нормализацию, списки разрешенных запросов брандмауэра могут хранить дайджесты, каждый из которых соответствует многим различным запросам, полученным от клиентов. Дополнительную информацию о нормализации и дайджестах см. в разделе 25.10, «Performance Schema Statement Digests».

Предупреждение

Установка системной переменной max_digest_length в ноль отключает создание дайджестов, что также отключает функции сервера, которые требуют дайджестов, такие как брандмауэр MySQL Enterprise.

Режимы работы профилей

Каждый профиль, зарегистрированный в брандмауэре, имеет свой собственный режим работы, выбранный из этих значений:

  • OFF: Этот режим отключает профиль. Брандмауэр считает его неактивным и игнорирует его.

  • RECORDING: Это режим обучения брандмауэра. Входящие запросы от клиента, соответствующие профилю, считаются приемлемыми для профиля и становятся частью его “отпечатка.” Брандмауэр записывает нормализованную форму дайджеста каждого запроса, чтобы изучить допустимые шаблоны запросов для профиля. Каждый шаблон является правилом, а объединение правил — это список разрешенных запросов профиля.

  • PROTECTING: В этом режиме профиль разрешает или запрещает выполнение запроса. Брандмауэр сопоставляет входящие запросы со списком разрешенных запросов профиля, принимая только соответствующие запросы и отклоняя запросы, которые не соответствуют. После обучения профиля в режиме RECORDING переключите его на режим PROTECTING, чтобы укрепить MySQL от доступа с помощью запросов, которые отличаются от списка разрешенных запросов. Если системная переменная mysql_firewall_trace включена, брандмауэр также записывает отклоненные запросы в журнал ошибок.

  • DETECTING: Этот режим обнаруживает, но не блокирует вторжения (запросы, которые являются подозрительными, потому что они не соответствуют ничему в списке разрешенных запросов профиля). В режиме DETECTING брандмауэр записывает подозрительные запросы в журнал ошибок, но принимает их без отказа в доступе.

Когда профилю присваивается любое из указанных значений режима, брандмауэр сохраняет режим в профиле. Операции по настройке режима брандмауэра также допускают значение режима RESET, но это значение не сохраняется: установка профиля в режим RESET приводит к удалению всех правил для профиля и установке его режима на OFF.

Примечание

Сообщения, записанные в журнал ошибок в режиме DETECTING или из-за того, что mysql_firewall_trace включена, записываются как Примечания, которые представляют собой информационные сообщения. Чтобы убедиться, что такие сообщения появляются в журнале ошибок и не отбрасываются, установите системную переменную log_error_verbosity в значение 3.

Как уже упоминалось, MySQL связывает каждую сессию клиента со специфичной комбинацией имени пользователя и имени хоста, известной как учетная запись сессии. Брандмауэр сопоставляет учетную запись сессии с зарегистрированными профилями, чтобы определить, какой профиль применяется к обработке входящих запросов от сессии:

  • Брандмауэр игнорирует неактивные профили (профили с режимом OFF).

  • Учетная запись сессии соответствует активному профилю учетной записи с тем же пользователем и хостом, если такой есть. Таких профилей учетных записей может быть не более одного.

После сопоставления учетной записи сессии с зарегистрированными профилями брандмауэр обрабатывает каждый входящий запрос следующим образом:

  • Если соответствующего профиля нет, брандмауэр не накладывает никаких ограничений и принимает запрос.

  • Если соответствующий профиль существует, его режим определяет обработку запроса:

    • В режиме RECORDING брандмауэр добавляет запрос в правила списка разрешенных запросов профиля и принимает его.

    • В режиме PROTECTING брандмауэр сравнивает запрос с правилами в списке разрешенных запросов профиля. Брандмауэр принимает запрос, если есть соответствие, и отклоняет его в противном случае. Если системная переменная mysql_firewall_trace включена, брандмауэр также записывает отклоненные запросы в журнал ошибок.

    • В режиме DETECTING брандмауэр обнаруживает вторжения без отказа в доступе. Брандмауэр принимает запрос, но также сопоставляет его со списком разрешенных запросов профиля, как и в режиме PROTECTING. Если запрос является подозрительным (несоответствующим), брандмауэр записывает его в журнал ошибок.

Регистрация профилей учетных записей брандмауэра

MySQL Enterprise Firewall позволяет регистрировать профили, соответствующие отдельным учетным записям. Чтобы использовать профиль учетной записи брандмауэра для защиты MySQL от входящих запросов от заданной учетной записи, выполните следующие шаги:

  1. Зарегистрируйте профиль учетной записи и переведите его в режим RECORDING.

  2. Подключитесь к серверу MySQL, используя эту учетную запись, и выполните запросы, которые необходимо запомнить. Это обучит профиль учетной записи и установит правила, формирующие белый список профиля.

  3. Переключите профиль учетной записи в режим PROTECTING. Когда клиент подключается к серверу, используя эту учетную запись, белый список профиля учетной записи ограничивает выполнение запросов.

  4. Если необходимо дополнительное обучение, снова переключите профиль учетной записи в режим RECORDING, обновите его белый список новыми шаблонами запросов, а затем переключите его обратно в режим PROTECTING.

Соблюдайте следующие рекомендации для ссылок на учетные записи, связанные с брандмауэром:

  • Обратите внимание на контекст, в котором используются ссылки на учетные записи. Чтобы указать учетную запись для операций брандмауэра, укажите ее в виде строки, заключенной в одинарные кавычки ('user_name@host_name'). Это отличается от обычной конвенции MySQL для таких запросов, как CREATE USER и GRANT, для которых вы указываете части имени пользователя и хоста имени учетной записи отдельно ('user_name'@'host_name').

    Требование именования учетных записей в виде строки, заключенной в одинарные кавычки, для операций брандмауэра означает, что вы не можете использовать учетные записи, содержащие символы @ в имени пользователя.

  • Брандмауэр оценивает запросы относительно учетных записей, представленных фактическими именами пользователей и хостов, прошедшими проверку подлинности сервером. При регистрации учетных записей в профилях не используйте подстановочные знаки или сетевые маски:

    • Предположим, что существует учетная запись с именем me@%.example.org, и клиент использует ее для подключения к серверу с хоста abc.example.org.

    • Имя учетной записи содержит подстановочный знак %, но сервер проверяет подлинность клиента как имеющего имя пользователя me и имя хоста abc.example.com, и именно это видит брандмауэр.

    • Следовательно, имя учетной записи, которое следует использовать для операций брандмауэра, — это me@abc.example.org, а не me@%.example.org.

Следующая процедура показывает, как зарегистрировать профиль учетной записи в брандмауэре, обучить брандмауэр распознавать допустимые запросы для этого профиля (его белый список) и использовать профиль для защиты MySQL от выполнения недопустимых запросов учетной записью. В примере предполагается использование учетной записи fwuser@localhost приложением, которое обращается к таблицам в базе данных sakila (доступна по адресу https://dev.mysql.com/doc/index-other.html).

Используйте административную учетную запись MySQL для выполнения шагов в этой процедуре, за исключением тех шагов, которые предназначены для выполнения учетной записью fwuser@localhost, соответствующей профилю учетной записи, зарегистрированному в брандмауэре. Для запросов, выполняемых с использованием этой учетной записи, базой данных по умолчанию должна быть sakila. (Вы можете использовать другую базу данных, соответствующим образом изменив инструкции.)

  1. При необходимости создайте учетную запись для выполнения запросов (выберите подходящий пароль) и предоставьте ей права доступа к базе данных sakila:

    CREATE USER 'fwuser'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON sakila.* TO 'fwuser'@'localhost';
    
  2. Используйте хранимую процедуру sp_set_firewall_mode() для регистрации профиля учетной записи в брандмауэре и перевода профиля в режим RECORDING (обучение):

    CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'RECORDING');
    
  3. Чтобы обучить зарегистрированный профиль учетной записи, подключитесь к серверу как fwuser с хоста сервера, чтобы брандмауэр видел учетную запись сессии fwuser@localhost. Затем используйте учетную запись для выполнения некоторых запросов, которые следует считать допустимыми для профиля. Например:

    SELECT first_name, last_name FROM customer WHERE customer_id = 1;
    UPDATE rental SET return_date = NOW() WHERE rental_id = 1;
    SELECT get_customer_balance(1, NOW());
    

    Поскольку профиль находится в режиме RECORDING, брандмауэр записывает нормализованную форму дайджеста запросов в виде правил в белый список профиля.

    Примечание

    Пока профиль учетной записи fwuser@localhost не получит запросы в режиме RECORDING, его белый список пуст, что эквивалентно “запретить все.” Ни один запрос не может соответствовать пустому белому списку, что имеет следующие последствия:

    • Профиль учетной записи не может быть переключен в режим PROTECTING. Он отклонит каждый запрос, фактически запретив учетной записи выполнять любой запрос.

    • Профиль учетной записи может быть переключен в режим DETECTING. В этом случае профиль принимает каждый запрос, но регистрирует его как подозрительный.

  4. На этом этапе информация о профиле учетной записи кэшируется. Чтобы увидеть эту информацию, запросите таблицы брандмауэра INFORMATION_SCHEMA:

    mysql> SELECT MODE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS
           WHERE USERHOST = 'fwuser@localhost';
    +-----------+
    | MODE      |
    +-----------+
    | RECORDING |
    +-----------+
    mysql> SELECT RULE FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_WHITELIST
           WHERE USERHOST = 'fwuser@localhost';
    +----------------------------------------------------------------------------+
    | RULE                                                                       |
    +----------------------------------------------------------------------------+
    | SELECT `first_name` , `last_name` FROM `customer` WHERE `customer_id` = ?  |
    | SELECT `get_customer_balance` ( ? , NOW ( ) )                              |
    | UPDATE `rental` SET `return_date` = NOW ( ) WHERE `rental_id` = ?          |
    | SELECT @@`version_comment` LIMIT ?                                         |
    +----------------------------------------------------------------------------+
    
    Примечание

    Правило @@version_comment поступает из запроса, автоматически отправляемого клиентом mysql при подключении к серверу.

    Важно

    Обучите брандмауэр в условиях, соответствующих использованию приложения. Например, для определения характеристик и возможностей сервера данный коннектор MySQL может отправлять запросы на сервер в начале каждого сеанса. Если приложение обычно используется через этот коннектор, обучите брандмауэр также с использованием этого коннектора. Это позволит этим начальным запросам стать частью белого списка для профиля учетной записи, связанного с приложением.

  5. Вызовите sp_set_firewall_mode() еще раз, на этот раз переключив профиль учетной записи в режим PROTECTING:

    CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'PROTECTING');
    
    Важно

    Переключение профиля учетной записи из режима RECORDING синхронизирует его кэшированные данные с системными таблицами базы данных mysql, которые обеспечивают постоянное базовое хранилище. Если вы не переключаете режим для профиля, который записывается, кэшированные данные не записываются в постоянное хранилище и теряются при перезапуске сервера.

  6. Протестируйте профиль учетной записи, используя учетную запись для выполнения некоторых допустимых и недопустимых запросов. Брандмауэр сопоставляет каждый запрос от учетной записи с белым списком профиля и принимает или отклоняет его:

    • Этот запрос не идентичен обучающему запросу, но производит тот же нормализованный запрос, что и один из них, поэтому брандмауэр принимает его:

      mysql> SELECT first_name, last_name FROM customer WHERE customer_id = '48';
      +------------+-----------+
      | first_name | last_name |
      +------------+-----------+
      | ANN        | EVANS     |
      +------------+-----------+
      
    • Эти запросы ничему не соответствуют в белом списке, поэтому брандмауэр отклоняет каждый из них с ошибкой:

      mysql> SELECT first_name, last_name FROM customer WHERE customer_id = 1 OR TRUE;
      ERROR 1045 (28000): Statement was blocked by Firewall
      mysql> SHOW TABLES LIKE 'customer%';
      ERROR 1045 (28000): Statement was blocked by Firewall
      mysql> TRUNCATE TABLE mysql.slow_log;
      ERROR 1045 (28000): Statement was blocked by Firewall
      
    • Если системная переменная mysql_firewall_trace включена, брандмауэр также записывает отклоненные запросы в журнал ошибок. Например:

      [Note] Plugin MYSQL_FIREWALL reported:
      'ACCESS DENIED for fwuser@localhost. Reason: No match in whitelist.
      Statement: TRUNCATE TABLE `mysql` . `slow_log` '
      

      Эти сообщения журнала могут быть полезны для определения источника атак, если это необходимо.

Теперь профиль учетной записи брандмауэра обучен для учетной записи fwuser@localhost. Когда клиенты подключаются, используя эту учетную запись, и пытаются выполнить запросы, профиль защищает MySQL от запросов, не соответствующих белому списку профиля.

Можно обнаруживать вторжения, регистрируя несоответствующие запросы как подозрительные, не отказывая в доступе. Сначала переведите профиль учетной записи в режим DETECTING:

CALL mysql.sp_set_firewall_mode('fwuser@localhost', 'DETECTING');

Затем, используя учетную запись, выполните запрос, который не соответствует белому списку профиля учетной записи. В режиме DETECTING брандмауэр разрешает выполнение несоответствующего запроса:

mysql> SHOW TABLES LIKE 'customer%';
+------------------------------+
| Tables_in_sakila (customer%) |
+------------------------------+
| customer                     |
| customer_list                |
+------------------------------+

Кроме того, брандмауэр записывает сообщение в журнал ошибок:

[Note] Plugin MYSQL_FIREWALL reported:
'SUSPICIOUS STATEMENT from 'fwuser@localhost'. Reason: No match in whitelist.
Statement: SHOW TABLES LIKE ? '

Чтобы отключить профиль учетной записи, измените его режим на OFF:

CALL mysql.sp_set_firewall_mode(user, 'OFF');

Чтобы забыть все обучение для профиля и отключить его, сбросьте его:

CALL mysql.sp_set_firewall_mode(user, 'RESET');

Операция сброса приводит к тому, что брандмауэр удаляет все правила для профиля и устанавливает его режим в OFF.

Мониторинг брандмауэра

Чтобы оценить активность брандмауэра, проверьте его переменные состояния. Например, после выполнения процедуры, показанной ранее, для обучения и защиты учетной записи fwuser@localhost, переменные выглядят следующим образом:

mysql> SHOW GLOBAL STATUS LIKE 'Firewall%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Firewall_access_denied     | 3     |
| Firewall_access_granted    | 4     |
| Firewall_access_suspicious | 1     |
| Firewall_cached_entries    | 4     |
+----------------------------+-------+

Переменные указывают количество отклоненных, принятых, зарегистрированных как подозрительные и добавленных в кэш запросов соответственно. Значение Firewall_access_granted равно 4 из-за запроса @@version_comment, отправленного клиентом mysql каждый из трех раз, когда вы подключались, используя зарегистрированную учетную запись, плюс запрос SHOW TABLES, который не был заблокирован в режиме DETECTING.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/firewall-usage.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API