Spec-Zone.ru › MySQL 8.4

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

Перед использованием брандмауэра MySQL Enterprise, установите его в соответствии с инструкциями, приведенными в разделе 8.4.7.2 «Установка или удаление брандмауэра MySQL Enterprise».

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

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

  • Планирование перезагрузки кэша брандмауэра

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

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

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

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

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

  • Миграция профилей учетных записей на профили групп

Включение или выключение брандмауэра

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

[mysqld]
mysql_firewall_mode=ON

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

В качестве альтернативы, для установки и сохранения настройки брандмауэра во время работы:

SET PERSIST mysql_firewall_mode = OFF;
SET PERSIST mysql_firewall_mode = ON;

SET PERSIST устанавливает значение для работающего экземпляра MySQL. Она также сохраняет значение, заставляя его переноситься в последующие перезагрузки сервера. Чтобы изменить значение для работающего экземпляра MySQL без переноса его в последующие перезагрузки, используйте ключевое слово GLOBAL вместо PERSIST. См. раздел 15.7.6.1, «SET Синтаксис для присваивания переменных».

Планирование перезагрузки кэша брандмауэра

Каждый раз, когда плагин серверной стороны MYSQL_FIREWALL инициализируется, он загружает данные из этих таблиц в свой внутренний кэш:

  • firewall_whitelist

  • firewall_group_allowlist

  • firewall_users

  • firewall_groups

  • firewall_membership

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

Чтобы запланировать регулярные перезагрузки кэша, сначала убедитесь, что компонент scheduler установлен и включен (см. раздел 7.5.5, «Компонент планировщика»). Для проверки состояния компонента:

SHOW VARIABLES LIKE 'component_scheduler%';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------|
| component_scheduler.enabled | On    |
+-----------------------------+-------+

При установке брандмауэра установите глобальную системную переменную mysql_firewall_reload_interval_seconds при запуске сервера на значение от 60 до значения макроса INT_MAX платформы, на которой размещен сервер. Значения от нуля до 60 (от 1 до 59) сбрасываются до 60. Например:

$> mysqld [server-options] --mysql-firewall-reload-interval-seconds=40
...
2023-08-31T17:46:35.043468Z 0 [Warning] [MY-015031] [Server] Plugin MYSQL_FIREWALL
reported: 'Invalid reload interval specified: 40. Valid values are 0 (off) or
greater than or equal to 60. Adjusting to 60.'
...

В качестве альтернативы, для установки и сохранения настройки брандмауэра при запуске, поместите перед именем переменной для чтения только для чтения ключевое слово PERSIST_ONLY или квалификатор @@PERSIST_ONLY.:

SET PERSIST_ONLY mysql_firewall_reload_interval_seconds = 120;
SET @@PERSIST_ONLY.mysql_firewall_reload_interval_seconds = 120;

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

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

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

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

  • Предоставьте привилегию FIREWALL_ADMIN любой учетной записи, которая должна иметь полный административный доступ к брандмауэру. (Некоторые административные функции брандмауэра могут быть вызваны учетными записями, которые имеют привилегию FIREWALL_ADMIN или устаревшую привилегию SUPER, как указано в описаниях отдельных функций.)

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

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

Примечание

Привилегии FIREWALL_EXEMPT, FIREWALL_ADMIN и FIREWALL_USER могут быть предоставлены только при установке брандмауэра, так как плагин MYSQL_FIREWALL определяет эти привилегии.

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

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

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

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

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

  • Обработка запросов брандмауэром при применении нескольких профилей

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

Из-за преимуществ групповых профилей перед учетными профилями и потому, что групповой профиль с одной учетной записью-членом логически эквивалентен учетному профилю для этой учетной записи, рекомендуется создавать все новые профили брандмауэра в качестве групповых профилей. Учетные профили устарели и могут быть удалены в будущих версиях 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` = ?

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

Обработка заявлений брандмауэра при применении нескольких профилей

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  2. Добавьте учетную запись участника в профиль группы.

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

  4. Добавьте в профиль группы любые другие учетные записи, которые должны быть участниками группы.

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

  6. Если необходимо дополнительное обучение, снова переключите профиль группы в режим 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 от выполнения недопустимых запросов, а также добавлять и удалять участников группы. В примере используется имя профиля группы fwgrp. Предполагается, что пример профиля предназначен для использования клиентами приложения, которое обращается к таблицам в базе данных sakila (доступно по адресу https://dev.mysql.com/doc/index-other.html).

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

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

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

    CALL mysql.sp_set_firewall_group_mode('fwgrp', 'RECORDING');
    
    Примечание

    Если вы установили MySQL Enterprise Firewall в пользовательской схеме, то внесите соответствующие изменения для вашей системы. Например, если брандмауэр установлен в схеме fwdb, то выполните хранимые процедуры следующим образом:

    CALL fwdb.sp_set_firewall_group_mode('fwgrp', 'RECORDING');
    
  3. Используйте хранимую процедуру sp_firewall_group_enlist() для добавления начальной учетной записи участника для использования при обучении белого списка профиля группы:

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

    SELECT title, release_year FROM film WHERE film_id = 1;
    UPDATE actor SET last_update = NOW() WHERE actor_id = 1;
    SELECT store_id, COUNT(*) FROM inventory GROUP BY store_id;
    

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

    Примечание

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

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

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

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

    mysql> SELECT MODE FROM performance_schema.firewall_groups
           WHERE NAME = 'fwgrp';
    +-----------+
    | MODE      |
    +-----------+
    | RECORDING |
    +-----------+
    mysql> SELECT * FROM performance_schema.firewall_membership
           WHERE GROUP_ID = 'fwgrp' ORDER BY MEMBER_ID;
    +----------+-------------------+
    | GROUP_ID | MEMBER_ID         |
    +----------+-------------------+
    | fwgrp    | member1@localhost |
    +----------+-------------------+
    mysql> SELECT RULE FROM performance_schema.firewall_group_allowlist
           WHERE NAME = 'fwgrp';
    +----------------------------------------------------------------------+
    | RULE                                                                 |
    +----------------------------------------------------------------------+
    | SELECT @@`version_comment` LIMIT ?                                   |
    | UPDATE `actor` SET `last_update` = NOW ( ) WHERE `actor_id` = ?      |
    | SELECT `title` , `release_year` FROM `film` WHERE `film_id` = ?      |
    | SELECT `store_id` , COUNT ( * ) FROM `inventory` GROUP BY `store_id` |
    +----------------------------------------------------------------------+
    
    Примечание

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

    Важно

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

  6. Вызовите sp_set_firewall_group_mode() еще раз, чтобы переключить профиль группы в режим PROTECTING:

    CALL mysql.sp_set_firewall_group_mode('fwgrp', 'PROTECTING');
    
    Важно

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

  7. Добавьте в профиль группы любые другие учетные записи, которые должны быть участниками:

    CALL mysql.sp_firewall_group_enlist('fwgrp', 'member2@localhost');
    CALL mysql.sp_firewall_group_enlist('fwgrp', 'member3@localhost');
    CALL mysql.sp_firewall_group_enlist('fwgrp', 'member4@localhost');
    

    Белый список профиля, обученный с использованием учетной записи member1@localhost, теперь также применяется к дополнительным учетным записям.

  8. Чтобы проверить обновленный состав группы, снова запросите таблицу firewall_membership:

    mysql> SELECT * FROM performance_schema.firewall_membership
           WHERE GROUP_ID = 'fwgrp' ORDER BY MEMBER_ID;
    +----------+-------------------+
    | GROUP_ID | MEMBER_ID         |
    +----------+-------------------+
    | fwgrp    | member1@localhost |
    | fwgrp    | member2@localhost |
    | fwgrp    | member3@localhost |
    | fwgrp    | member4@localhost |
    +----------+-------------------+
    
  9. Проверьте профиль группы на брандмауэре, используя любую учетную запись в группе для выполнения некоторых допустимых и недопустимых запросов. Брандмауэр сопоставляет каждый запрос от учетной записи с белым списком профиля и принимает или отклоняет его:

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

      mysql> SELECT title, release_year FROM film WHERE film_id = 98;
      +-------------------+--------------+
      | title             | release_year |
      +-------------------+--------------+
      | BRIGHT ENCOUNTERS |         2006 |
      +-------------------+--------------+
      
    • Эти запросы не соответствуют ничему в белом списке, поэтому брандмауэр отклоняет каждый из них с ошибкой:

      mysql> SELECT title, release_year FROM film WHERE film_id = 98 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 'member1@localhost'. Reason: No match in allowlist.
      Statement: TRUNCATE TABLE `mysql` . `slow_log`'
      

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

  10. Если необходимо удалить участников из профиля группы, используйте хранимую процедуру sp_firewall_group_delist() вместо sp_firewall_group_enlist():

    CALL mysql.sp_firewall_group_delist('fwgrp', 'member3@localhost');
    

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

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

CALL mysql.sp_set_firewall_group_mode('fwgrp', 'RECORDING');

Однако это позволяет любому члену группы выполнять утверждения и добавлять их в разрешенный список. Чтобы ограничить дополнительное обучение одним членом группы, вызовите sp_set_firewall_group_mode_and_user(), что аналогично sp_set_firewall_group_mode(), но принимает еще один аргумент, указывающий, какая учетная запись может обучать профиль в режиме RECORDING. Например, чтобы включить обучение только member4@localhost, сделайте следующее:

CALL mysql.sp_set_firewall_group_mode_and_user('fwgrp', 'RECORDING', 'member4@localhost');

Это позволяет проводить дополнительное обучение указанной учетной записью, не удаляя других членов группы. Они могут выполнять утверждения, но утверждения не добавляются в разрешенный список. (Однако помните, что в режиме RECORDING другие члены могут выполнять любое утверждение.)

Примечание

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

После дополнительного обучения установите профиль группы обратно в режим PROTECTING:

CALL mysql.sp_set_firewall_group_mode('fwgrp', 'PROTECTING');

Учетная запись обучения, установленная с помощью sp_set_firewall_group_mode_and_user(), сохраняется в профиле группы, поэтому брандмауэр запоминает ее на случай необходимости дальнейшего обучения. Таким образом, если вы вызываете sp_set_firewall_group_mode() (без аргумента учетной записи обучения), текущая учебная учетная запись профиля, member4@localhost, остается неизменной.

Чтобы очистить учетную запись обучения, если на самом деле необходимо разрешить всем членам группы выполнять обучение в режиме RECORDING, вызовите sp_set_firewall_group_mode_and_user() и передайте значение NULL для аргумента учетной записи:

CALL mysql.sp_set_firewall_group_mode_and_user('fwgrp', 'RECORDING', NULL);

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

CALL mysql.sp_set_firewall_group_mode('fwgrp', 'DETECTING');

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

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

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

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

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

CALL mysql.sp_set_firewall_group_mode(group, 'OFF');

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

CALL mysql.sp_set_firewall_group_mode(group, 'RESET');

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

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

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');
    
    Примечание

    Если вы установили MySQL Enterprise Firewall в пользовательской схеме, внесите соответствующие изменения для вашей системы. Например, если брандмауэр установлен в схеме fwdb, то выполните хранимые процедуры следующим образом:

    CALL fwdb.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 или пользовательская схема (см. Установка MySQL Enterprise Firewall).

  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 allowlist.
      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 allowlist.
Statement: SHOW TABLES LIKE ?'

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

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

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

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

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

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

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

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.

Миграция профилей учетных записей на профили групп

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

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

Из-за большей гибкости, предлагаемой профилями групп, рекомендуется создавать все новые профили брандмауэра в качестве профилей групп. Профили учетных записей устарели и могут быть удалены в будущих версиях MySQL. Для обновлений с установок брандмауэра, которые уже содержат профили учетных записей, MySQL Enterprise Firewall включает хранимую процедуру под названием sp_migrate_firewall_user_to_group(), чтобы помочь вам преобразовать профили учетных записей в профили групп. Для её использования выполните следующую процедуру как пользователь, у которого есть привилегия FIREWALL_ADMIN:

  1. Запустите скрипт firewall_profile_migration.sql для установки хранимой процедуры sp_migrate_firewall_user_to_group(). Скрипт расположен в каталоге share вашей установки MySQL.

    Укажите то же имя базы данных брандмауэра в командной строке, что вы ранее определили для вашей установки брандмауэра. В данном примере указывается системная база данных, mysql.

    $> mysql -u root -p -D mysql < firewall_profile_migration.sql
    Enter password: (enter root password here)
    

    Если вы установили MySQL Enterprise Firewall в пользовательской схеме, внесите соответствующие изменения для вашей системы.

  2. Определите существующие профили учетных записей, запросив таблицу Информационной схемы MYSQL_FIREWALL_USERS. Например:

    mysql> SELECT USERHOST FROM INFORMATION_SCHEMA.MYSQL_FIREWALL_USERS;
    +-------------------------------+
    | USERHOST                      |
    +-------------------------------+
    | admin@localhost               |
    | local_client@localhost        |
    | remote_client@abc.example.com |
    +-------------------------------+
    
  3. Для каждого профиля учетной записи, определенного на предыдущем шаге, преобразуйте его в профиль группы. Замените префикс mysql. на фактическое имя базы данных брандмауэра, если необходимо:

    CALL mysql.sp_migrate_firewall_user_to_group('admin@localhost', 'admins');
    CALL mysql.sp_migrate_firewall_user_to_group('local_client@localhost', 'local_clients');
    CALL mysql.sp_migrate_firewall_user_to_group('remote_client@localhost', 'remote_clients');
    

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

  4. (Необязательно) Удалите sp_migrate_firewall_user_to_group():

    DROP PROCEDURE IF EXISTS mysql.sp_migrate_firewall_user_to_group;
    

    Если вы установили MySQL Enterprise Firewall в пользовательской схеме, внесите соответствующие изменения для вашей системы.

Дополнительные сведения о sp_migrate_firewall_user_to_group() см. в разделе Разные хранимые процедуры брандмауэра.

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

Spec-Zone.ru

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