Плагин MySQL предоставляет GrantForge поиск баз данных, таблиц и столбцов, а также политики доступа, маскирования и фильтрации строк. Идентификатор плагина и тип сервиса — mysql. Плагин сервиса работает на сервере GrantForge; SQL-запросы приложений проверяет отдельный прокси-агент MySQL.
Проверка подключения допускает MySQL 8.0 и новее. Интеграционные тесты Testcontainers в репозитории охватывают mysql:8.0 и mysql:8.4; это не означает, что все остальные версии проверены. Серверы MariaDB и MySQL 5.7 не поддерживаются. jdbc:mariadb:// — формат URL драйвера, а не указание на поддержку серверов MariaDB.
Установка
Плагин включён в дистрибутив в каталоге plugins/mysql. Убедитесь, что mysql включён в разделе Управление платформой → Плагины; после обновления повторно просканируйте каталог плагинов. Для подключения к MySQL плагин использует MariaDB Connector/J (LGPL), который поддерживает протокол MySQL, включая caching_sha2_password и TLS, и работает в отдельном загрузчике классов. Официальный MySQL Connector/J распространяется по GPL и не включён в дистрибутив.
Добавление сервиса данных
- Откройте Права на данные → Сервисы данных, добавьте сервис и выберите MySQL (
mysql). - Укажите JDBC URL сервера, например
jdbc:mysql://mysql.example.com:3306. Также допустимыjdbc:mariadb://и форматы отказоустойчивого подключения драйвера, напримерjdbc:mysql:replication://primary:3306,replica:3306. - Укажите пользователя для поиска ресурсов и его пароль, проверьте подключение и сохраните сервис. Проверка выполняет вход, проверяет версию сервера и читает
information_schema, как и поиск ресурсов.
Пользователь для поиска ресурсов нужен GrantForge для получения метаданных и отличается от пользователей, с которыми приложения подключаются к MySQL. Успешная проверка подключения не означает, что политики уже применяются к SQL-запросам приложений.
| Параметр | Назначение |
|---|---|
jdbc.url |
Обязательный JDBC URL: jdbc:mysql://host[:port] или jdbc:mariadb://…; можно добавить базу данных и ?options, но не учётные данные |
username |
Обязательный пользователь для поиска ресурсов |
password |
Пароль этого пользователя; хранится в зашифрованном виде |
jdbc.properties |
Параметры драйвера, по одному key=value на строку, например sslMode=verify-full и serverSslCert=/etc/grantforge/mysql-ca.pem |
connect.timeout.ms |
Тайм-аут подключения, по умолчанию 10000, диапазон 1..600000 |
read.timeout.ms |
Тайм-аут чтения при поиске ресурсов, по умолчанию 30000, диапазон 1..600000 |
Параметры, позволяющие серверу читать локальные файлы, выполнять команды при подключении, выполнять несколько команд одновременно, передавать учётные данные или загружать классы, запрещены в URL и в jdbc.properties независимо от регистра: user, password, allowLocalInfile, allowMultiQueries, initSql, createDatabaseIfNotExist, socketFactory, credentialType и параметры пула. Соединения для поиска ресурсов доступны только для чтения.
Для TLS с проверкой подлинности сервера добавьте в jdbc.properties:
sslMode=verify-full
serverSslCert=/etc/grantforge/mysql-ca.pemФайл сертификата должен быть доступен для чтения на сервере GrantForge, а имя хоста в URL должно соответствовать сертификату. По умолчанию плагин не требует TLS; настройте его явно. Используются имена параметров MariaDB Connector/J.
information_schema показывает пользователю только объекты, на которые у него есть права. Например, для поиска ресурсов только в базе sales администратор базы данных может выполнить следующие команды. Замените grantforge-host адресом, с которого подключается сервер GrantForge:
CREATE USER 'grantforge_lookup'@'grantforge-host' IDENTIFIED BY 'replace-with-a-password';
GRANT REFERENCES ON sales.* TO 'grantforge_lookup'@'grantforge-host';Используйте REFERENCES ON *.* только при необходимости обнаруживать все базы данных. Учётной записи метаданных прокси также требуется SHOW_ROUTINE; см. руководство по агенту.
Ресурсы и типы доступа
| Уровень | Сопоставление | Примечания |
|---|---|---|
database |
Подстановочные знаки, с учётом регистра | Политика может завершаться на этом уровне |
table |
Подстановочные знаки, с учётом регистра | Под базой данных; политика может завершаться на этом уровне |
column |
Подстановочные знаки, без учёта регистра | Под таблицей; типы доступа select, insert и update |
Имена баз данных и таблиц сравниваются с учётом регистра, как при хранении MySQL в Linux. Если на сервере lower_case_table_names равно 1 или 2, агент приводит проверяемые имена к нижнему регистру; такие политики следует писать в нижнем регистре. Имена столбцов всегда сравниваются без учёта регистра, как в MySQL.
Типы доступа соответствуют привилегиям MySQL: select, insert, update, delete, create, drop, alter, index и all, включающий эти восемь типов. all не равнозначен ALL PRIVILEGES в MySQL и не отменяет ограничения прокси на SQL-команды.
В значениях политики * соответствует любому количеству символов, а ? — одному символу. Редактор предлагает имена по префиксу: базы данных, таблицы в указанных политикой базах и столбцы этих таблиц. В поле поиска подсказок % и _ считаются обычными символами.
Маскирование
Политики маскирования применяются к столбцам. Каждый тип маски — выражение MySQL 8, где {col} обозначает столбец:
| Тип маски | Результат |
|---|---|
mask |
Буквы ASCII заменяются на X/x, цифры — на n; остальные символы сохраняются |
mask_show_last_4 |
Только последние четыре символа |
mask_show_first_4 |
Только первые четыре символа |
mask_hash |
Хеш SHA-256 без соли |
mask_null |
NULL |
mask_none |
Исходное значение |
mask_date_show_year |
1 января года исходной даты |
custom |
Собственное выражение MySQL с {col} вместо столбца, например CONCAT('****', RIGHT({col}, 4)) |
Маски, показывающие первые или последние четыре символа, сохраняют значение целиком, если его длина не превышает четырёх символов. Например, mask_show_last_4 отображает 4111111111111111 как xxxxxxxxxxxx1111.
Фильтрация строк
Политики фильтрации строк применяются к таблицам. Фильтр — условие MySQL для столбцов таблицы, например region = 'EU': пользователь видит только соответствующие строки, а однотабличные команды UPDATE и DELETE изменяют только эти строки. Запись с участием нескольких таблиц отклоняется, если к целевой таблице требуется применить фильтр строк. Другие ограничения описаны в руководстве по агенту.
Маски и фильтры строк не предоставляют доступ. Операция должна быть разрешена отдельной политикой доступа.
Пример политик
Предположим, в MySQL есть таблица sales.orders со столбцами id, region и card. Создайте в одном сервисе данных три включённые политики для пользователя MySQL alice:
| Вид политики | Ресурсы | Правило |
|---|---|---|
| Доступ | database=sales, table=orders, column=* |
Разрешить select пользователю alice |
| Маскирование | database=sales, table=orders, column=card |
Использовать mask_show_last_4 для пользователя alice |
| Фильтрация строк | database=sales, table=orders |
Использовать region = 'EU' для пользователя alice |
В политике укажите пользователя alice, а не alice@host. Сам MySQL также должен разрешать этой учётной записи читать таблицу. Когда прокси применит новый снимок, запросы alice через прокси будут возвращать только строки EU, а в номерах карт останутся видимыми лишь последние четыре символа. Условия запросов и выражения соединения также видят маскированные значения. Развёртывание и проверка описаны в руководстве прокси-агента MySQL.
Применение политик
Плагин сервиса управляет политиками и ищет ресурсы. Для их применения, включая маски и фильтры строк, необходим прокси-агент MySQL, к которому клиенты подключаются вместо сервера. Руководство по агенту описывает его развёртывание и выполняемые проверки.
