Плагин ClickHouse находит базы данных, таблицы и столбцы и управляет политиками доступа в терминах самого ClickHouse: чтение и запись столбцов, изменение, удаление, очистка и оптимизация таблиц, создание таблиц в базе данных и её удаление, а на сервере — создание баз данных, KILL QUERY и инструкции SYSTEM, с фильтрами строк таблиц. Идентификатор плагина и тип сервиса — clickhouse. Плагин сервиса работает в сервере GrantForge; политики применяет агент ClickHouse — сервис рядом с серверами — с помощью собственных привилегий и политик строк ClickHouse.
Интеграционные тесты Testcontainers в репозитории охватывают ClickHouse 24.8, 25.3, 25.8, 26.3 и 26.8 — выпуски с долгосрочной поддержкой за последние два года; это не означает сертификацию всех остальных версий.
Установка
Дистрибутив содержит плагин в plugins/clickhouse. Убедитесь в Управление платформой → Плагины, что clickhouse включён; после обновления заново просканируйте каталог плагинов. Плагин обращается к серверам по HTTP через собственный Java-клиент ClickHouse в отдельном загрузчике классов.
Добавление сервиса данных
- Откройте Права на данные → Сервисы данных, добавьте сервис и выберите ClickHouse (
clickhouse). - Укажите URL HTTP-интерфейса сервера или нескольких серверов.
- Выберите, как входит пользователь для поиска, укажите имя пользователя и учётные данные, проверьте подключение и сохраните сервис. Проверка выполняет вход и описывает сервер: его версию ClickHouse, пользователя, под которым выполнен вход, и сколько баз данных видит этот пользователь.
Пользователь для поиска позволяет GrantForge находить ресурсы; он не связан с пользователями, которые читают и пишут. Успешная проверка подключения не означает, что доступ уже подчиняется политикам.
| Параметр | Назначение |
|---|---|
clickhouse.urls |
Обязательный: HTTP-интерфейс сервера, например https://clickhouse1.example.com:8443; несколько через запятую, по очереди, если какой-то недоступен |
authentication |
password (по умолчанию) или certificate: клиентский сертификат TLS, который ClickHouse сопоставляет с пользователем (IDENTIFIED WITH ssl_certificate) |
username |
Обязательный: пользователь для поиска |
password |
password: пароль пользователя для поиска; хранится зашифрованным |
ssl.root.certificate |
https: сертификат CA в формате PEM на сервере GrantForge, по которому проверяются серверы; пустое значение — сертификаты JVM |
ssl.client.certificate, ssl.client.key |
certificate: клиентский сертификат PEM и его закрытый ключ на сервере GrantForge; вход по сертификату требует серверов https:// |
timeout |
Сколько может длиться запрос, по умолчанию 30000, диапазон 1..600000 миллисекунд |
Параметры одного способа входа отклоняются при другом, так что сервис точно указывает, как он входит. Отклонённый вход, пользователь только для чтения, недоступный сервер или сервер, чей сертификат нельзя проверить, а также ответ не от ClickHouse вместо него, например от прокси, сообщаются как таковые.
Что видит пользователь для поиска
ClickHouse показывает пользователю только те базы данных, таблицы и столбцы, на которые у него есть хоть какая-то привилегия. Выдайте пользователю для поиска SHOW на то, для чего будут писаться политики, например GRANT SHOW ON *.* TO grantforge_lookup: так он видит имена, не читая данных. Собственные базы данных ClickHouse, system и information_schema, не учитываются: политики их не решают.
Ресурсы и типы доступа
| Уровень | Сопоставление | Типы доступа |
|---|---|---|
database |
Шаблон, с учётом регистра; имя базы данных | create, drop_database |
table |
Шаблон, с учётом регистра; внутри базы данных | alter, drop, truncate, optimize |
column |
Шаблон, с учётом регистра; внутри таблицы | select, insert |
server |
Единственное значение * |
create_database, kill_query, system |
| Тип доступа | Привилегии ClickHouse |
|---|---|
select, insert |
SELECT, INSERT на столбцы |
alter |
ALTER: любое изменение таблицы, включая ALTER UPDATE и ALTER DELETE |
drop |
DROP TABLE, DROP VIEW, DROP DICTIONARY |
truncate, optimize |
TRUNCATE, OPTIMIZE |
create |
CREATE TABLE, CREATE VIEW, CREATE DICTIONARY в базе данных |
drop_database |
DROP DATABASE |
create_database, kill_query, system |
CREATE DATABASE, KILL QUERY, SYSTEM: любая инструкция SYSTEM |
Чтение и запись решаются по столбцам, так же как их выдаёт ClickHouse: политика для select или insert называет столбцы, * — все. Поэтому политика может разрешить таблицу и запретить один её столбец, и пользователь сможет читать все остальные. В значениях политик * соответствует любой последовательности символов, а ? — одному символу. Редактор политик подсказывает базы данных, таблицы баз, названных политикой, и их столбцы.
Типы доступа не совпадают ни с одной группой привилегий ClickHouse вроде ALL: каждый означает ровно то, что написано, поэтому политика никогда не даёт больше, чем называет. В ClickHouse нет маскирования столбцов вне ClickHouse Cloud, поэтому этот тип сервиса его не предлагает.
Фильтры строк
Политика фильтрации строк таблицы показывает её пользователям строки, для которых выполняется условие. Условие — выражение ClickHouse в том виде, в каком его принимают политики строк, например region = 'EU' или owner = currentUser(). Пользователь видит фильтр первой применимой к нему политики, как и в других сервисах.
Пример политик
Пусть на сервере есть базы данных sales и hr. Создайте в одном сервисе данных такие включённые политики:
| Ресурсы | Правило |
|---|---|
database=sales, table=*, column=* |
Разрешить select группе analysts |
database=sales, table=orders, column=card |
Запретить select группе analysts |
database=sales, table=orders, column=* |
Разрешить insert пользователю ingest |
database=team_* |
Разрешить create группе data-team |
database=team_*, table=* |
Разрешить alter, drop, truncate и optimize группе data-team |
database=team_*, table=*, column=* |
Разрешить select и insert группе data-team |
server=* |
Разрешить create_database группе data-team |
database=sales, table=orders (фильтр строк) |
Показывать пользователю emea строки region = 'EMEA' |
Когда агент применит новый снимок, участники analysts будут читать все таблицы sales, кроме номеров карт в orders; ingest будет записывать в orders и ничего не читать; участники data-team будут создавать базы данных, а в тех, чьё имя начинается с team_, — таблицы, читать, записывать и изменять их; а emea, если какая-то политика позволит ему читать orders, будет видеть только строки своего региона.
Применение политик
Плагин сервиса управляет политиками и находит ресурсы. Для их применения нужен агент ClickHouse, один на сервер или кластер. Развёртывание и проверки описаны в разделе агент ClickHouse.
