docs(clickhouse): описана учебная модель доступа
- Зачем: - читателю нужна честная граница между учебными ролями и боевой защитой. - Что: - README описывает пользователей, роли и место хранения паролей. - мастер-спека явно откладывает эксплуатационные меры защиты. - устаревшие комментарии Compose и пробника приведены к реализации. - Проверка: - make config-test, make lint.
This commit is contained in:
@@ -242,16 +242,26 @@ uv run --project generator python -m clickstream_generator batch \
|
|||||||
- Prometheus — `http://127.0.0.1:29090`;
|
- Prometheus — `http://127.0.0.1:29090`;
|
||||||
- Grafana — `http://127.0.0.1:23000`, пользователь `admin`, пароль `admin`.
|
- Grafana — `http://127.0.0.1:23000`, пользователь `admin`, пароль `admin`.
|
||||||
|
|
||||||
У локального учебного кластера нет пароля: ноды используют общего пользователя
|
В ClickHouse четыре пользователя:
|
||||||
`default` для запросов `Distributed`. Порты поэтому привязаны к `127.0.0.1` и
|
|
||||||
не открыты во внешнюю сеть.
|
|
||||||
|
|
||||||
Пароли интерфейсов, пароли Postgres, ключи Airflow и Superset, отсутствие
|
- `etl` применяет DDL и подключает Airflow; роль `etl_writer` читает и пишет
|
||||||
пароля ClickHouse и отсутствие проверки доступа у Kafka и Prometheus —
|
слои хранилища;
|
||||||
намеренно простые и явно ненастоящие настройки локального учебного стенда. Это
|
- `bi` подключает Superset; роль `bi_reader` читает будущие слои DDS и DM;
|
||||||
не пример настройки защиты: не копируйте значения из `.env.example` в рабочую
|
- `analyst` предназначен для подключения человека и читает все слои;
|
||||||
среду. Все опубликованные порты привязаны только к `127.0.0.1`; Postgres наружу
|
- `default` остаётся служебным: им ходят проверки здоровья и скрипты внутри
|
||||||
не опубликован.
|
контейнеров, но не приложения.
|
||||||
|
|
||||||
|
Пользователи и роли объявлены в `infra/clickhouse/users.d/access.xml`. Пароли
|
||||||
|
и общий секрет нод живут в `.env` и передаются в конфигурацию через окружение;
|
||||||
|
Superset получает пароль `bi` тем же путём через штатную функцию настройки.
|
||||||
|
Значения для локального стенда есть в `.env.example`.
|
||||||
|
|
||||||
|
Пароли ClickHouse и интерфейсов, пароли Postgres, ключи Airflow и Superset,
|
||||||
|
отсутствие проверки доступа у Kafka и Prometheus — намеренно простые и явно
|
||||||
|
ненастоящие настройки локального учебного стенда. Это не пример настройки
|
||||||
|
защиты: не копируйте значения из `.env.example` в рабочую среду. Все
|
||||||
|
опубликованные порты привязаны только к `127.0.0.1`; Postgres наружу не
|
||||||
|
опубликован.
|
||||||
|
|
||||||
В бою перед репликами ClickHouse обычно был бы балансировщик. Здесь в каждом
|
В бою перед репликами ClickHouse обычно был бы балансировщик. Здесь в каждом
|
||||||
шарде одна реплика, поэтому балансировать нечего. Балансировщик и топология
|
шарде одна реплика, поэтому балансировать нечего. Балансировщик и топология
|
||||||
|
|||||||
+3
-3
@@ -9,7 +9,7 @@ x-clickhouse-common: &clickhouse-common
|
|||||||
image: clickhouse/clickhouse-server:26.3.17.56
|
image: clickhouse/clickhouse-server:26.3.17.56
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
# Стенд локальный: нодам нужен общий пользователь без пароля для Distributed.
|
# Пользователей объявляет access.xml; настройка учётки образом не нужна.
|
||||||
CLICKHOUSE_SKIP_USER_SETUP: "1"
|
CLICKHOUSE_SKIP_USER_SETUP: "1"
|
||||||
CLICKHOUSE_CLUSTER_SECRET: ${CLICKHOUSE_CLUSTER_SECRET:?Скопируйте .env.example в .env}
|
CLICKHOUSE_CLUSTER_SECRET: ${CLICKHOUSE_CLUSTER_SECRET:?Скопируйте .env.example в .env}
|
||||||
CLICKHOUSE_DEFAULT_PASSWORD: ${CLICKHOUSE_DEFAULT_PASSWORD:?Скопируйте .env.example в .env}
|
CLICKHOUSE_DEFAULT_PASSWORD: ${CLICKHOUSE_DEFAULT_PASSWORD:?Скопируйте .env.example в .env}
|
||||||
@@ -116,7 +116,7 @@ services:
|
|||||||
retries: 30
|
retries: 30
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
|
||||||
# Инициатор DDL и будущее подключение Airflow.
|
# Инициатор DDL и точка подключения Airflow.
|
||||||
clickhouse-01:
|
clickhouse-01:
|
||||||
<<: *clickhouse-common
|
<<: *clickhouse-common
|
||||||
hostname: clickhouse-01
|
hostname: clickhouse-01
|
||||||
@@ -130,7 +130,7 @@ services:
|
|||||||
- ./infra/clickhouse/users.d/access.xml:/etc/clickhouse-server/users.d/access.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.
|
||||||
clickhouse-02:
|
clickhouse-02:
|
||||||
<<: *clickhouse-common
|
<<: *clickhouse-common
|
||||||
hostname: clickhouse-02
|
hostname: clickhouse-02
|
||||||
|
|||||||
@@ -29,12 +29,10 @@ EXPECTED_TABLES = [
|
|||||||
(LOCAL_TABLE, "ReplicatedMergeTree"),
|
(LOCAL_TABLE, "ReplicatedMergeTree"),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Ноду 2 пробник читает не своим подключением, а запросом remote() с ноды 1: у
|
# У Airflow одно подключение — к ноде 1; второго ради пробника не заводят.
|
||||||
# Airflow подготовлено одно подключение — к clickhouse-01, и второго ради
|
# Ноду 2 он читает через remote(), который не использует секрет из описания
|
||||||
# пробника не заводят. При этом remote('clickhouse-02:9000', ...) делает
|
# кластера, поэтому учётные данные etl передаются явно. Порт 9000 — нативный,
|
||||||
# инициатором распределённого запроса саму ноду 2 — проверяется именно это, а
|
# тогда как подключение Airflow ходит по HTTP на 8123.
|
||||||
# не доступность ноды 2 по сети. Порт 9000 — межсерверный, тогда как
|
|
||||||
# подключение Airflow ходит по HTTP на 8123.
|
|
||||||
NODES = (
|
NODES = (
|
||||||
("ноде 1", "system.tables"),
|
("ноде 1", "system.tables"),
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -576,6 +576,8 @@ v2 стартует пустым, поэтому объём ниже — это
|
|||||||
стенд работает, но учебного пути на нём ещё нет.
|
стенд работает, но учебного пути на нём ещё нет.
|
||||||
- Инкрементальный ETL (#8) — свой issue.
|
- Инкрементальный ETL (#8) — свой issue.
|
||||||
- Реплики (2×2), HAProxy, репликационная эксплуатация — в лекцию, не в стенд.
|
- Реплики (2×2), HAProxy, репликационная эксплуатация — в лекцию, не в стенд.
|
||||||
|
- TLS между нодами, настоящее хранилище и ротация секретов, внешние учётные
|
||||||
|
записи, квоты, политики строк и аудит запросов — за границей учебного стенда.
|
||||||
- Полный словарь торговых событий Метрики (detail, remove, impressions),
|
- Полный словарь торговых событий Метрики (detail, remove, impressions),
|
||||||
пять уровней категорий, блоки `purchasedProduct*`/`impressions*`.
|
пять уровней категорий, блоки `purchasedProduct*`/`impressions*`.
|
||||||
- Механика `Sign`/CollapsingMergeTree — кандидат на потом (дом — поток
|
- Механика `Sign`/CollapsingMergeTree — кандидат на потом (дом — поток
|
||||||
|
|||||||
Reference in New Issue
Block a user