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_02_HTTP_PORT=28124
|
||||
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
|
||||
PROMETHEUS_PORT=29090
|
||||
GRAFANA_PORT=23000
|
||||
|
||||
@@ -11,6 +11,10 @@ x-clickhouse-common: &clickhouse-common
|
||||
environment:
|
||||
# Стенд локальный: нодам нужен общий пользователь без пароля для Distributed.
|
||||
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:
|
||||
clickhouse-keeper:
|
||||
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/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/users.d/access.xml:/etc/clickhouse-server/users.d/access.xml:ro
|
||||
- clickhouse_01_data:/var/lib/clickhouse
|
||||
|
||||
# Будущее подключение Superset.
|
||||
@@ -133,6 +138,7 @@ services:
|
||||
- ./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/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
|
||||
|
||||
kafka:
|
||||
|
||||
@@ -132,12 +132,16 @@ Postgres и Grafana. Цена выбора известна: объявленн
|
||||
настройки ClickHouse.
|
||||
- Весь DDL репозитория идёт через `IF NOT EXISTS` (файлы `sql/ddl/`).
|
||||
|
||||
Осталось проверить при исполнении, и это работа тикета реализации: точная
|
||||
форма объявления секрета в описании кластера (готового примера в
|
||||
документации не нашлось); работает ли подстановка из окружения именно для
|
||||
пароля пользователя, и если нет — пароли лягут в файл настройки прямым
|
||||
текстом, а README назовёт это вслух; применяются ли на соседнем шарде права
|
||||
`bi`, а не общей учётки (вывод из колонки `user`, живьём не измерен —
|
||||
проверка требует создать пользователя); принимает ли ClickHouse права,
|
||||
выданные на ещё не созданную базу — на момент решения `dds` и `dm` не
|
||||
существуют.
|
||||
Проверено на живом стенде 13 августа 2026 года, ClickHouse 26.3.17.56.
|
||||
|
||||
- Секрет кластера принимается внутри `remote_servers` в виде
|
||||
`<secret from_env="CLICKHOUSE_CLUSTER_SECRET"/>`. Запрос от `etl` через обе
|
||||
ноды выполнился на каждой под пользователем `etl`.
|
||||
- `from_env` работает у элемента `password`: `etl`, `bi` и `analyst` вошли с
|
||||
паролями из окружения и получили свои роли.
|
||||
- При запросе от `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>
|
||||
<clickstream_cluster>
|
||||
<!--
|
||||
ClickHouse 26.3 передаёт с секретом пользователя-инициатора на
|
||||
соседний шард; секрет сверяется на обеих нодах.
|
||||
-->
|
||||
<secret from_env="CLICKHOUSE_CLUSTER_SECRET"/>
|
||||
<shard>
|
||||
<internal_replication>true</internal_replication>
|
||||
<replica>
|
||||
@@ -33,4 +38,3 @@
|
||||
<path>/clickhouse/task_queue/ddl</path>
|
||||
</distributed_ddl>
|
||||
</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