Files
ermnvldmr.com/services/docs/content/ru/apex/concepts/security-model.md
T
deytenit 9ee672504f fix: PageHead header alignment, analytics proxy, and infra improvements (#64)
🤖 Pull request created from `various-fixes` containing PageHead
breadcrumbs and navigation alignment fixes, Umami analytics proxy, and
infrastructure updates.
2026-10-24 16:52:49 +03:00

9.0 KiB

title, description, weight
title description weight
Модель безопасности Изоляция привилегий, управление межсетевым экраном, обнаружение вторжений и защита секретов. 18

Фреймворк apex защищает узел на нескольких независимых уровнях: изоляция привилегий в файловой системе, управляемый межсетевой экран хоста, обнаружение вторжений, разграничение прав в контейнерах и строгая изоляция секретов. Каждый уровень настраивается отдельным действием, что гарантирует воспроизводимость и идемпотентность конфигурации.

Изоляция привилегий

Каждый проект работает под изолированным системным пользователем noroot-<project> без права входа. Общее хранилище открыто на запись группе с установленным sticky-битом: проекты могут обмениваться файлами, но не могут удалять чужие данные. Подробное устройство механизма (пользователи, группы и матрица прав) описано в разделе Концепция: Многоуровневое хранилище.

Межсетевой экран хоста

Команда apex configure/ufw настраивает межсетевой экран узла на основе каталога configs/ufw/ по трём направлениям:

  • Правила хоста (configs/ufw/host/host.rules) — список команд ufw (по одной на строку), применяемых последовательно.
  • Правила уровня ядра (configs/ufw/host/before.rules, after.rules) — внедряются в /etc/ufw/before.rules и /etc/ufw/after.rules в виде управляемых блоков-маркеров. Процесс внедрения самовосстанавливающийся: любые ранее добавленные блоки (включая оставшиеся от предыдущих утилит) удаляются перед вставкой актуального блока после якорной строки # End required lines. Рядом с изменяемым файлом сохраняется резервная копия .bak с временной меткой.
  • Правила для контейнеров (configs/ufw/docker/*.rules) — применяются через утилиту ufw-docker, которая формирует правила iptables, устойчивые к перезапускам и манипуляциям самого Docker. Команда configure/base устанавливает этот инструмент в ~/.local/bin/ufw-docker.

Отсутствующая конфигурация считается ошибкой, а не поводом для тихого пропуска: отсутствие каталогов docker/ или host/ (при наличии парного каталога) завершает работу с кодом 66, а отсутствие целевого системного файла в /etc/ufw немедленно прерывает выполнение. В конце действие напоминает о необходимости перезапустить ufw для применения изменений и проверить доступность порта SSH.

Обнаружение вторжений

Команда apex configure/crowdsec автоматически устанавливает CrowdSec через официальный инсталлятор (если утилита cscli отсутствует), генерирует конфигурацию из configs/crowdsec/ в /etc/crowdsec/ (источники логов, парсеры, параметры bouncer) и устанавливает коллекции crowdsecurity/linux и crowdsecurity/traefik. Если конфигурация узла предусматривает firewall-bouncer, соответствующий пакет bouncer устанавливается автоматически, связывая обнаружение атак с немедленной блокировкой на уровне сети.

Ограничение на уровне контейнеров

Ядровая композиция задаёт строгие ограничения для контейнеров:

  • Граничный прокси изолирован от сокета Docker: он получает данные о сервисах через отфильтрованный socket-proxy, который отдаёт состояние контейнеров только для чтения в замкнутой сети.
  • Сети enclave и socket объявлены с параметром internal: true: у них нет прямого доступа в интернет и опубликованных портов хоста.
  • Ядровые сервисы запускаются с опцией no-new-privileges под noroot-пользователем везде, где позволяет рабочая нагрузка; Linux capabilities выдаются точечно каждому сервису, а не глобально.

Наблюдаемость

Система мониторинга построена по модели исходящей отправки (push), а не входящих опросов. Опциональный сервис alloy (Grafana Alloy, один агент на узел) собирает метрики хоста (аналог node_exporter), метрики контейнеров (cadvisor), системный журнал systemd journal и логи docker-контейнеров, после чего передаёт их в центральные хранилища Prometheus и Loki на выделенном узле. Метрики отправляются через prometheus.remote_write на адрес APEX_PROM_PUSH_URL, логи — через loki.write на APEX_LOKI_PUSH_URL. Обе конечные точки защищены базовой аутентификацией HTTP basic auth (APEX_OBS_BASIC_AUTH_USER / APEX_OBS_BASIC_AUTH_PASS). Поскольку трафик отправляется наружу, Alloy подключён к сети direct с доступом в интернет, а не к закрытой сети enclave. На самих узлах логи не накапливаются, и открывать внешний доступ к эндпоинтам сервисов не требуется.

Изоляция секретов

  • Секреты хранятся исключительно в файлах .env каждого проекта. Эти файлы представляют собой символьные ссылки на хранилище уровня 1, расположены вне рабочего дерева git и внесены в .gitignore (**/.env).
  • Для каждого узла перечень обязательных переменных задокументирован в файле SECRETS.md, причём указываются только имена ключей, но ни в коем случае не их значения.
  • Версионируемый файл apex.env содержит только несекретные параметры.
  • В ядровых compose-файлах критически важные секреты снабжены маркером ?error: при отсутствии переменной запуск немедленно останавливается с ошибкой ещё на этапе разбора конфигурации.
  • Механизм «capture-up» безопасен конструктивно: игнорируемые файлы .env и данные уровней хранилища никогда не попадают в git-индекс.

См. также: