Плагин Apache Doris ищет каталоги, базы данных, таблицы, столбцы и группы нагрузки и управляет политиками доступа в терминах самого Doris: чтение столбцов, загрузка, изменение и удаление таблиц и показ определений их представлений, создание таблиц в базе данных и её удаление, создание баз данных в каталоге и выполнение запросов в группе нагрузки, с фильтрами строк таблиц. Идентификатор плагина и тип сервиса — оба doris. Сервисный плагин работает на сервере GrantForge; агент Apache Doris, сервис рядом с кластером, применяет политики собственными ролями, привилегиями и политиками строк Doris.
Интеграционные тесты Testcontainers в репозитории покрывают Apache Doris 2.1, 3.1, 4.0 и 4.1, каждый на кластере из одного фронтенда и одного бэкенда; это не означает сертификацию всех остальных версий.
Установка
Дистрибутив включает плагин в plugins/doris. Убедитесь, что doris включён в Управление платформой → Плагины; после обновления каталога плагинов пересканируйте его. Плагин обращается к протоколу MySQL фронтендов через MariaDB Connector/J в собственном загрузчике классов.
Добавление сервиса данных
- Откройте Права на данные → Сервисы данных, добавьте сервис и выберите Apache Doris (
doris). - Укажите адрес протокола MySQL одного фронтенда или нескольких.
- Введите имя и пароль пользователя для поиска, проверьте подключение и сохраните сервис. Проверка входит и описывает кластер: версию Doris, пользователя, под которым выполнен вход, сколько каталогов он видит и сколько баз данных внутреннего каталога. Она обращается только к фронтенду и поэтому отвечает, даже пока ни один бэкенд не работает.
Пользователь для поиска позволяет GrantForge находить ресурсы; он отделён от пользователей, которые читают и загружают данные. Успешная проверка подключения не означает, что доступ уже подчиняется политикам.
| Параметр | Назначение |
|---|---|
doris.hosts |
Обязательно: адрес протокола MySQL фронтенда, например fe1.example.com:9030; несколько через запятую, по очереди, если один недоступен. Без порта — 9030 |
username |
Обязательно: пользователь для поиска |
password |
Пароль пользователя для поиска; хранится в зашифрованном виде |
ssl.mode |
disable (по умолчанию), trust — шифровать без проверки фронтенда, verify-ca — проверять его сертификат или verify-full — проверять и его имя; для фронтендов, которые предлагают TLS в протоколе MySQL |
ssl.root.certificate |
verify-ca и verify-full: PEM-сертификат CA на сервере GrantForge, которым проверяются фронтенды; пусто — используются сертификаты JVM |
timeout |
Сколько могут занимать подключение и инструкция, по умолчанию 30000, диапазон 1..600000 миллисекунд |
Отклонённые входы, недостаток привилегии у пользователя для поиска и недоступные фронтенды сообщаются как таковые.
Что видит пользователь для поиска
Инструкции SHOW в Doris перечисляют только каталоги, базы данных, таблицы и столбцы, на которые у пользователя есть какая-либо привилегия, поэтому поиск показывает то, что может видеть пользователь для поиска. Дайте ему SELECT_PRIV на то, для чего будут писаться политики, например GRANT SELECT_PRIV ON *.*.* TO 'grantforge_lookup'@'%'; SHOW WORKLOAD GROUPS перечисляет группы, которые он может видеть. Собственные базы данных Doris, information_schema, mysql и __internal_schema, опускаются: политики их не решают.
Ресурсы и типы доступа
| Уровень | Сопоставление | Типы доступа |
|---|---|---|
catalog |
Подстановочные знаки, с учётом регистра; внутренний каталог или внешний | create_database |
database |
Подстановочные знаки, с учётом регистра; внутри каталога | create, drop_database |
table |
Подстановочные знаки, с учётом регистра; внутри базы данных, таблица или представление | load, alter, drop, show_view |
column |
Подстановочные знаки, без учёта регистра, как Doris сравнивает имена столбцов; внутри таблицы | select |
workload_group |
Подстановочные знаки, с учётом регистра; имя группы | usage |
| Тип доступа | Привилегия Doris |
|---|---|
select |
SELECT_PRIV — на столбцы или на таблицу, базу данных или каталог целиком |
load |
LOAD_PRIV: загрузки, INSERT, UPDATE, DELETE и TRUNCATE |
alter, drop |
ALTER_PRIV, DROP_PRIV на таблицу |
show_view |
SHOW_VIEW_PRIV: SHOW CREATE VIEW |
create |
CREATE_PRIV на базу данных: создание её, а также таблиц и представлений в ней |
drop_database |
DROP_PRIV на базу данных |
create_database |
CREATE_PRIV на каталог |
usage |
USAGE_PRIV на группу нагрузки |
Чтение решается по столбцам, как Doris его выдаёт: политика select называет столбцы, * — все. Так политика может разрешить таблицу и запретить один её столбец, а пользователь читает все остальные. В значениях политик * соответствует любой последовательности символов, а ? — одному символу. Редактор политик подсказывает каталоги, базы данных названных в политике каталогов, их таблицы и столбцы, а также группы нагрузки.
Привилегия Doris на базу данных распространяется и на каждую её таблицу, а на каталог — на каждую его базу данных. Поэтому агент выдаёт create_database только там, где политики позволяют пользователю также создавать таблицы в каждой базе данных каталога, и drop_database только там, где они позволяют ему также удалять каждую таблицу базы данных; иначе он удерживает привилегию и сообщает об этом, вместо того чтобы выдать больше, чем разрешают политики. ADMIN_PRIV, GRANT_PRIV и NODE_PRIV не являются типами доступа: ни одна политика их не даёт.
Doris маскирует значения только через Apache Ranger, поэтому тип сервиса не предлагает маскирования.
Фильтры строк
Политика фильтра строк таблицы показывает её пользователям строки, для которых выполняется условие. Условие — это предикат Doris в том виде, в каком его принимают политики строк, например region = 'EU'; агент сначала выполняет его на таблице, и фильтр, который там выполнить нельзя, не показывает ни одной строки. Как и в других сервисах, пользователь получает фильтр первой применимой к нему политики.
Пример политик
Пусть в кластере есть базы данных sales и hr во внутреннем каталоге и группа нагрузки etl. Создайте в том же сервисе данных такие включённые политики:
| Ресурсы | Правило |
|---|---|
catalog=internal, database=sales, table=*, column=* |
Разрешить группе analysts select |
catalog=internal, database=sales, table=orders, column=card |
Запретить группе analysts select |
catalog=internal, database=sales, table=orders |
Разрешить пользователю ingest load |
catalog=internal, database=team_* |
Разрешить группе data-team create |
catalog=internal, database=team_*, table=* |
Разрешить группе data-team load, alter и drop |
workload_group=etl |
Разрешить пользователю ingest и группе data-team usage |
catalog=internal, database=sales, table=orders (фильтр строк) |
Показывать пользователю emea строки region = 'EMEA' |
Когда агент применит новый снимок, участники analysts читают все таблицы sales, кроме номеров карт в orders; ingest загружает orders и может выполнять свои загрузки в etl; участники data-team создают таблицы в базах данных team_, созданных администратором, и загружают, изменяют и удаляют их; а emea, если политика позволяет ему читать orders, видит только строки своего региона.
Применение политик
Сервисный плагин управляет политиками и ищет ресурсы. Для их применения нужен агент Apache Doris, по одному на кластер. Развёртывание и проверки описаны в разделе Агент Apache Doris.
