Внедрение KESL на ВМ2 + замена CLAMAV на KESL

This commit is contained in:
mi
2026-09-08 01:39:37 +03:00
parent 85df788f2d
commit fdfdeaffb4
43 changed files with 2210 additions and 329 deletions
@@ -51,8 +51,9 @@ deployment-артефакты: `VM2_services/codebase/services/`. Локальн
`ops`.
9. Setup оставляет исходящий трафик UFW открытым на bootstrap-окно. До
production ограничьте egress правилами Selectel SG/NAT/proxy до
утверждённых PostgreSQL, S3, Secrets Manager, Bitrix24, DNS/NTP, SigNoz и
источников ClamAV. Registry/package repositories оставляйте только на
утверждённых PostgreSQL, S3, Secrets Manager, Bitrix24, DNS/NTP и SigNoz.
Для host KESL разрешите только источники обновления из
[`deployment/kesl/RUNBOOK.KESL.ru.md`](kesl/RUNBOOK.KESL.ru.md). Registry/package repositories оставляйте только на
controlled maintenance window.
## Кто что выполняет
@@ -87,7 +88,8 @@ deployment-артефакты: `VM2_services/codebase/services/`. Локальн
[`arch-10-deployment.md`](../../../../architectory/arch-10-deployment.md) §6.
3. **Образы** — собрать и push `han-message-safety`, `han-bitrix-sync`;
получить immutable digest для всех `*_IMAGE` в `.env.example` (nginx, redis,
clamav, otel-collector, Redis exporter, nginx exporter).
otel-collector, Redis exporter, nginx exporter). `clamd`/`freshclam` в
Compose отсутствуют: KESL 12.4 standalone и broker устанавливаются на host.
4. **Selectel Secrets Manager** — заполнить все remote names из
`deployment/secrets/config.example.json` (DSN, tokens, S3 read-only keys,
`REDIS_SAFETY_ACL`, `REDIS_EXPORTER_PASSWORD`, internal TLS PEM для `8443`).
@@ -526,7 +528,7 @@ REVOKE USAGE ON SCHEMA han_app FROM <BITRIX_SYNC_MIGRATION_ROLE>;
новый монотонный номер и отдельные значения `--actor`/`--approved-by`; повторно
активировать старую версию нельзя. Alembic downgrade запрещён.
При обновлении ClamAV policy образ Message Safety должен содержать согласованные
При обновлении KESL policy образ Message Safety должен содержать согласованные
seed и schema: seed `max_signature_age_hours=240`, schema maximum `720`
(30 дней). После обновления immutable image digest создайте новую config
version; существующую active version не редактируйте и не активируйте повторно:
@@ -548,7 +550,7 @@ NEXT_VERSION='<СЛЕДУЮЩИЙ_МОНОТОННЫЙ_НОМЕР>'
/usr/local/sbin/han-vm2-compose up -d --no-deps --force-recreate \
message-safety-api message-safety-worker
/usr/local/sbin/han-vm2-compose ps \
message-safety-api message-safety-worker clamd freshclam
message-safety-api message-safety-worker
unset NEXT_VERSION
```
@@ -588,8 +590,15 @@ open-file limit быть не должно. Ошибка отсутствующ
Под `root` на VM2:
```sh
cd /opt/han-chat/services
# Сначала полностью выполните operator runbook:
# deployment/kesl/RUNBOOK.KESL.ru.md
systemctl enable --now han-kesl-scan-broker.socket
systemctl --no-pager status kesl han-kesl-scan-broker.socket
test -S /run/han-kesl/scan.sock
stat -c '%U:%G %a %n' /run/han-kesl/scan.sock
/usr/local/sbin/han-vm2-compose up -d redis-safety otel-collector
/usr/local/sbin/han-vm2-compose up -d freshclam clamd
/usr/local/sbin/han-vm2-compose up -d \
message-safety-api message-safety-worker
/usr/local/sbin/han-vm2-compose up -d \
@@ -598,6 +607,13 @@ open-file limit быть не должно. Ошибка отсутствующ
/usr/local/sbin/han-vm2-compose ps
```
До запуска Message Safety operator KESL runbook обязан подтвердить KESL 12.4
standalone, успешное ежечасное обновление, допустимый database date и canary.
Socket должен иметь `root:han-message-safety 0660` и не быть доступен посторонним
UID. Broker является custom
integration: неизвестный output/exit code `kesl-control --scan-file --action Inform`
считается scanner error, а не clean. Формат и throughput проверяются на target VM2.
`otel-collector` автоматически запускает одноразовый `otel-queue-init`. Он
выставляет владельца persistent queue `10001:10001` и завершается с кодом `0`;
сам Collector стартует только после этого.
@@ -892,7 +908,7 @@ journalctl --no-pager -u han-processing.service -u han-secrets-vm2.service
- container unhealthy/restart/OOM;
- срок TLS;
- возраст ClamAV signatures;
- KESL version/database date, результат ежечасного update и broker/socket status;
- OTEL queue/export errors;
- disk/RAM;
- активный MOCK mode;
@@ -1107,8 +1123,9 @@ plan.
- Отказ зависимости Safety — fail-closed: VM1 не должна отправлять/продвигать
контент.
- Устаревшие/недоступные сигнатуры ClamAV отключают только файловую
capability; ошибка сканирования никогда не превращается в allow.
- Устаревшая/недоступная база KESL или ошибка broker отключают только файловую
capability; ошибка сканирования никогда не превращается в allow и ведёт к
retry/`503`.
- Потеря Redis может убрать ускорение, но PostgreSQL остаётся источником
истины.
- Сбой OTEL ставит в очередь в пределах ограниченного тома и не должен
@@ -1134,10 +1151,12 @@ han-message-safety-mode mock --text-free false --file-free false
таймаута: держите high-severity alert активным до явного `standard`, затем
проверьте нормальные text/link/file capabilities и EICAR-canary.
## Известные исключения по образам
## Host KESL и broker
Образы ClamAV могут потребовать корректировок UID/path после валидации
точного digest. Не ослабляйте `read_only`, capabilities или mounts глобально:
задокументируйте минимальные writable пути для сигнатур/runtime и
компенсируйте сетевыми и ресурсными лимитами. Egress к signature-CDN
получает только `freshclam`; `clamd` — нет.
KESL 12.4 standalone и root-owned fail-closed broker не являются Compose
образами. Message Safety worker получает только Unix socket
`/run/han-kesl/scan.sock`; доступ к `kesl-control`, Docker socket и host root
ему не выдаётся. `scanner_engine=kesl`, а `signatures_version` вычисляется как
hash KESL version + database date. Установка, ежечасное обновление, права
socket, clean/EICAR/error/stale gates и rollback выполняются строго по
[`deployment/kesl/RUNBOOK.KESL.ru.md`](kesl/RUNBOOK.KESL.ru.md).