feat(clickhouse): добавлены роли и межнодовый секрет

- Зачем:
  - менти должен увидеть разделение доступа без состояния в томах.
- Что:
  - пользователи и роли объявлены файлом с паролями из окружения.
  - межшардовые запросы передают пользователя через общий секрет.
  - четыре допущения реализации подтверждены в ADR живыми замерами.
- Проверка:
  - make config-test, make smoke, make check-clickhouse, make check-services.
This commit is contained in:
2026-08-13 10:04:58 +03:00
parent 41d057252e
commit 790f7c1bb7
5 changed files with 92 additions and 10 deletions
+5
View File
@@ -4,6 +4,11 @@ CLICKHOUSE_01_HTTP_PORT=28123
CLICKHOUSE_01_TCP_PORT=29000 CLICKHOUSE_01_TCP_PORT=29000
CLICKHOUSE_02_HTTP_PORT=28124 CLICKHOUSE_02_HTTP_PORT=28124
CLICKHOUSE_02_TCP_PORT=29001 CLICKHOUSE_02_TCP_PORT=29001
CLICKHOUSE_CLUSTER_SECRET=cluster-26-secret
CLICKHOUSE_DEFAULT_PASSWORD=default-26-local
CLICKHOUSE_ETL_PASSWORD=etl-26-writer
CLICKHOUSE_BI_PASSWORD=bi-26-reader
CLICKHOUSE_ANALYST_PASSWORD=analyst-26-reader
KAFKA_EXTERNAL_PORT=29092 KAFKA_EXTERNAL_PORT=29092
PROMETHEUS_PORT=29090 PROMETHEUS_PORT=29090
GRAFANA_PORT=23000 GRAFANA_PORT=23000
+6
View File
@@ -11,6 +11,10 @@ x-clickhouse-common: &clickhouse-common
environment: environment:
# Стенд локальный: нодам нужен общий пользователь без пароля для Distributed. # Стенд локальный: нодам нужен общий пользователь без пароля для Distributed.
CLICKHOUSE_SKIP_USER_SETUP: "1" CLICKHOUSE_SKIP_USER_SETUP: "1"
CLICKHOUSE_CLUSTER_SECRET: ${CLICKHOUSE_CLUSTER_SECRET:?Скопируйте .env.example в .env}
CLICKHOUSE_ETL_PASSWORD: ${CLICKHOUSE_ETL_PASSWORD:?Скопируйте .env.example в .env}
CLICKHOUSE_BI_PASSWORD: ${CLICKHOUSE_BI_PASSWORD:?Скопируйте .env.example в .env}
CLICKHOUSE_ANALYST_PASSWORD: ${CLICKHOUSE_ANALYST_PASSWORD:?Скопируйте .env.example в .env}
depends_on: depends_on:
clickhouse-keeper: clickhouse-keeper:
condition: service_healthy condition: service_healthy
@@ -120,6 +124,7 @@ services:
- ./infra/clickhouse/config.d/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml:ro - ./infra/clickhouse/config.d/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml:ro
- ./infra/clickhouse/config.d/prometheus.xml:/etc/clickhouse-server/config.d/prometheus.xml:ro - ./infra/clickhouse/config.d/prometheus.xml:/etc/clickhouse-server/config.d/prometheus.xml:ro
- ./infra/clickhouse/config.d/macros-01.xml:/etc/clickhouse-server/config.d/macros.xml:ro - ./infra/clickhouse/config.d/macros-01.xml:/etc/clickhouse-server/config.d/macros.xml:ro
- ./infra/clickhouse/users.d/access.xml:/etc/clickhouse-server/users.d/access.xml:ro
- clickhouse_01_data:/var/lib/clickhouse - clickhouse_01_data:/var/lib/clickhouse
# Будущее подключение Superset. # Будущее подключение Superset.
@@ -133,6 +138,7 @@ services:
- ./infra/clickhouse/config.d/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml:ro - ./infra/clickhouse/config.d/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml:ro
- ./infra/clickhouse/config.d/prometheus.xml:/etc/clickhouse-server/config.d/prometheus.xml:ro - ./infra/clickhouse/config.d/prometheus.xml:/etc/clickhouse-server/config.d/prometheus.xml:ro
- ./infra/clickhouse/config.d/macros-02.xml:/etc/clickhouse-server/config.d/macros.xml:ro - ./infra/clickhouse/config.d/macros-02.xml:/etc/clickhouse-server/config.d/macros.xml:ro
- ./infra/clickhouse/users.d/access.xml:/etc/clickhouse-server/users.d/access.xml:ro
- clickhouse_02_data:/var/lib/clickhouse - clickhouse_02_data:/var/lib/clickhouse
kafka: kafka:
+13 -9
View File
@@ -132,12 +132,16 @@ Postgres и Grafana. Цена выбора известна: объявленн
настройки ClickHouse. настройки ClickHouse.
- Весь DDL репозитория идёт через `IF NOT EXISTS` (файлы `sql/ddl/`). - Весь DDL репозитория идёт через `IF NOT EXISTS` (файлы `sql/ddl/`).
Осталось проверить при исполнении, и это работа тикета реализации: точная Проверено на живом стенде 13 августа 2026 года, ClickHouse 26.3.17.56.
форма объявления секрета в описании кластера (готового примера в
документации не нашлось); работает ли подстановка из окружения именно для - Секрет кластера принимается внутри `remote_servers` в виде
пароля пользователя, и если нет — пароли лягут в файл настройки прямым `<secret from_env="CLICKHOUSE_CLUSTER_SECRET"/>`. Запрос от `etl` через обе
текстом, а README назовёт это вслух; применяются ли на соседнем шарде права ноды выполнился на каждой под пользователем `etl`.
`bi`, а не общей учётки (вывод из колонки `user`, живьём не измерен — - `from_env` работает у элемента `password`: `etl`, `bi` и `analyst` вошли с
проверка требует создать пользователя); принимает ли ClickHouse права, паролями из окружения и получили свои роли.
выданные на ещё не созданную базу — на момент решения `dds` и `dm` не - При запросе от `bi` через Distributed на второй ноде `system.query_log`
существуют. показал `user = bi` и `initial_user = bi`. Значит, на соседнем шарде
применяются права инициатора, а не общей учётной записи.
- Права на отсутствующие базы `dds` и `dm` приняты. До создания баз они видны
в `SHOW GRANTS FOR etl_writer`; временная таблица в `dm` подтвердила право
`bi` на чтение после появления базы.
+5 -1
View File
@@ -5,6 +5,11 @@
--> -->
<remote_servers> <remote_servers>
<clickstream_cluster> <clickstream_cluster>
<!--
ClickHouse 26.3 передаёт с секретом пользователя-инициатора на
соседний шард; секрет сверяется на обеих нодах.
-->
<secret from_env="CLICKHOUSE_CLUSTER_SECRET"/>
<shard> <shard>
<internal_replication>true</internal_replication> <internal_replication>true</internal_replication>
<replica> <replica>
@@ -33,4 +38,3 @@
<path>/clickhouse/task_queue/ddl</path> <path>/clickhouse/task_queue/ddl</path>
</distributed_ddl> </distributed_ddl>
</clickhouse> </clickhouse>
+63
View File
@@ -0,0 +1,63 @@
<clickhouse>
<!--
Пользователи и роли объявлены файлом: повторный подъём стенда не хранит
доступ в томах. Пароли приходят из .env через Compose.
-->
<roles>
<etl_writer>
<grants>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW ON default.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE ON stg.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE ON ods.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE ON dds.*</query>
<query>GRANT SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW, CREATE DATABASE ON dm.*</query>
<query>GRANT SELECT ON system.*</query>
<query>GRANT CLUSTER ON *.*</query>
<query>GRANT REMOTE ON *.*</query>
</grants>
</etl_writer>
<bi_reader>
<grants>
<query>GRANT SELECT ON dds.*</query>
<query>GRANT SELECT ON dm.*</query>
<query>GRANT SELECT ON system.settings</query>
</grants>
</bi_reader>
<analyst_reader>
<grants>
<query>GRANT SELECT ON stg.*</query>
<query>GRANT SELECT ON ods.*</query>
<query>GRANT SELECT ON dds.*</query>
<query>GRANT SELECT ON dm.*</query>
<query>GRANT SELECT ON system.settings</query>
</grants>
</analyst_reader>
</roles>
<users>
<etl>
<password from_env="CLICKHOUSE_ETL_PASSWORD"/>
<profile>default</profile>
<quota>default</quota>
<grants>
<query>GRANT etl_writer</query>
</grants>
</etl>
<bi>
<password from_env="CLICKHOUSE_BI_PASSWORD"/>
<profile>default</profile>
<quota>default</quota>
<grants>
<query>GRANT bi_reader</query>
</grants>
</bi>
<analyst>
<password from_env="CLICKHOUSE_ANALYST_PASSWORD"/>
<profile>default</profile>
<quota>default</quota>
<grants>
<query>GRANT analyst_reader</query>
</grants>
</analyst>
</users>
</clickhouse>