feat(clickhouse): добавлены роли и межнодовый секрет
- Зачем: - менти должен увидеть разделение доступа без состояния в томах. - Что: - пользователи и роли объявлены файлом с паролями из окружения. - межшардовые запросы передают пользователя через общий секрет. - четыре допущения реализации подтверждены в ADR живыми замерами. - Проверка: - make config-test, make smoke, make check-clickhouse, make check-services.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,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>
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user