# KESL 12.4 standalone на ВМ3 SigNoz Операторский runbook для Ubuntu 24.04 ВМ3. Команды выполняет `root` или персональная роль `admin` через `sudo` в отдельное maintenance window. Репозиторий и скрипты Foundry KESL не устанавливают и не запускают. Цели: 1. АВЗ.1: обнаружение и реагирование через host File Threat Protection. 2. АВЗ.2: автоматическое обновление баз с серверов Kaspersky. На ВМ3 нет Message Safety и нет scan-broker. Container Monitoring этой лицензией не покрыт — контейнерный мониторинг пропускаем, компенсируем host File Threat Protection и точечным `scan-file`. Сеть, firewall management, Web Threat Protection и Behavior Detection KESL не включаем. KESL 12.4 commercial не заявляется как сертифицированная ФСТЭК сборка. Раскатка SigNoz, lockdown и обновление стека — только в [`../RUNBOOK.ru.md`](../RUNBOOK.ru.md). Это окно с ними не совмещать. ## 0. Approvals, egress и stop conditions До окна зафиксировать change ID, оператора, Security/Service/Operations approvers, hostname, ОС/ядро, RAM/swap/диск, package version/hash/source, лицензию и rollback. EULA, Privacy Policy и KSN согласовать отдельно. Activation code, ключи и secrets не помещать в репозиторий, историю shell, chat или evidence. Текущий инвентарь (подставьте актуальные значения): | Узел | SSH | Приватный IP | |---|---|---| | ВМ3 SigNoz | `signoz-private` через jump | `192.168.0.5` | Рабочий каталог SigNoz на ВМ: `/opt/signoz`. Compose: ```sh COMPOSE=/opt/signoz/pours/deployment/compose.yaml ``` ### 0.1. Egress на время окна Исходящий доступ ВМ3 управляется файрволом (cloud SG / NAT policy), не постоянным unrestricted internet. На это окно оператор **открывает** исходящий HTTPS/DNS, достаточный для: - активации лицензии Kaspersky; - первого Update с `UPDATER_SOURCE=KLServers`; - опционально `apt` (`rhash`) и загрузки EICAR с `secure.eicar.org`. После приёмки общий интернет **не оставлять**. Для АВЗ.2 в steady state оставить узкий allow-list к серверам обновления/активации Kaspersky (имена, не застывшие IP) по [приложению вендора](https://support.kaspersky.ru/kes-for-linux/12.4.0/316243). Минимум для Update при `USE_KSN=No`: - `s00.upd.kaspersky.com` … `s19.upd.kaspersky.com`, TCP 443; - `downloads.upd.kaspersky.com`, TCP 443; - серверы активации из того же приложения, TCP 443; - рабочий системный DNS/NTP. Если системный DNS недоступен, KESL может сам обратиться к публичным DNS (`8.8.8.8`, `1.1.1.1` и др.) — это запрещено политикой ВМ3, поэтому resolver должен работать. Проверка до активации и Update: ```sh getent hosts s00.upd.kaspersky.com downloads.upd.kaspersky.com curl -4sS -o /dev/null -w '%{http_code}\n' --connect-timeout 8 --max-time 15 \ https://downloads.upd.kaspersky.com ``` Ожидается разрешение имён и HTTP `200`/`301`/`302`/`403`/`404`, не таймаут. Если файрвол ещё закрыт — stop: не запускать `kesl-setup` активацию и task 6. ### 0.2. Stop conditions Остановиться, если: - ОС/архитектура/ядро отсутствуют в матрице KESL 12.4; - установлен другой AV или неизвестный KESL; - свободно менее 10 ГБ или нет рабочего swap; - до установки есть unhealthy/restarting контейнеры SigNoz, OTLP `4317` недоступен с ВМ1/ВМ2, UI `/api/v1/health` не отвечает; - package hash/source не подтверждены, лицензия недействительна или базы не загружены; - после этапа: ClickHouse/PostgreSQL/SigNoz/ingester unhealthy или restart; - available memory менее 512 МБ на 4 ГиБ RAM либо менее 1 ГиБ на ≥8 ГиБ; - устойчивый swap IO, OOM, IO wait >10% за 5 минут; - File Threat Protection изменил UFW/слушатели `8080/4317/4318`. Не совмещать с `20-deploy-signoz.sh`, правкой `casting.yaml`, snapshot, lockdown, TLS, Docker restart или host reboot. ## 1. Read-only baseline Сохранить вывод каждого блока в change record без секретов, полного `docker inspect` и Compose environment. ### 1.1. Host ```sh date -Is hostnamectl uname -a dpkg --print-architecture findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS / /var/lib/docker /opt /tmp free -h swapon --show df -hT / /var/lib/docker /opt /tmp df -ih / /var/lib/docker /opt /tmp systemctl is-active docker ufw dpkg-query -W -f='${Package}\t${Version}\t${Status}\n' \ kesl kesl-gui kav4fs 2>/dev/null || true ``` Проверка только для `amd64`, Ubuntu 24.04 LTS и поддерживаемого ядра. SigNoz на 4 ГиБ — constrained; для KESL лучше ≥8 ГиБ. Defaults `ScanMemoryLimit=8192` и `MaxMemory=auto` на этой ВМ не принимать. ### 1.2. SigNoz и volumes ```sh cd /opt/signoz docker info --format \ 'driver={{.Driver}} root={{.DockerRootDir}} containers={{.Containers}} running={{.ContainersRunning}}' docker compose -f pours/deployment/compose.yaml ps -a docker stats --no-stream --format \ 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.BlockIO}}\t{{.PIDs}}' curl -fsS --max-time 5 http://127.0.0.1:8080/api/v1/health ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )' ``` Снять фактические **host**-пути hot-data (поле `Source`). Prefix Compose и путь внутри контейнера (`Destination`) в `--add-exclusion` не подставлять. Как читать вывод и какие строки брать — раздел 6. ```sh for c in \ signoz-telemetrystore-clickhouse-0-0 \ signoz-telemetrykeeper-clickhousekeeper-0 \ signoz-metastore-postgres-0 \ signoz-signoz-0 do echo "=== $c ===" docker inspect --format \ '{{range .Mounts}}{{.Type}} {{.Name}} {{.Source}} -> {{.Destination}}{{println}}{{end}}' \ "$c" done ``` В change record — только host-пути данных ClickHouse, ClickHouse Keeper, PostgreSQL metastore. Overlay2, `/opt/signoz` и `/tmp` не исключать. ### 1.3. Firewall и OTLP ```sh ufw status verbose iptables-save | head ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )' ``` С ВМ1 (не ICMP): ```sh timeout 3 bash -c 'exec 3<>/dev/tcp/192.168.0.5/4317' \ && echo 'OTLP gRPC reachable' ``` Без живого OTLP и healthy стека к установке не переходить. ## 2. Дистрибутив и установка GUI, i386, RPM, KSC agent на сервер не ставятся. ISO не распаковывать в `/opt/signoz` и не оставлять смонтированным. Ожидаемый ISO пилота ВМ1/ВМ2: `049-16-d-01.iso`, volume id `KESL12SP4`, DEB `kesl_12.4.0-1225_amd64.deb`. Хеши пилота не считать универсальными, если пришёл другой носитель: записать фактические SHA-256 и ГОСТ. Вендор публикует **ФИКС 2.0.2 / ГОСТ Р 34.11-94**, не SHA-256. Для ISO `049-16-d-01.iso` сумма вендора совпала с `rhash --gost`: ``` 6a94b16afad211e8b9be5ec86f5379184f2b3a9e5869843fe763e2796e5ac1d3 ``` SHA-256 того же ISO (локальный учёт, не сверка с сайтом ФИКС): ``` 8599a7ed8d7d661a70811d668e5f98e372b674c87ef4cd24abbd917625a2d5e5 ``` ### 2.1. Копирование на ВМ3 На ВМ заранее: ```sh install -d -m 0700 -o root -g root /var/lib/han-deploy/incoming ``` С рабочей станции через jump (`signoz-private` из [`../RUNBOOK.ru.md`](../RUNBOOK.ru.md)): ```powershell scp ` "C:\Users\MI\Documents\job\HAN_new_life\HANapp\docs\kes 12.4\049-16-d-01.iso" ` "C:\Users\MI\Documents\job\HAN_new_life\HANapp\docs\kes 12.4\049-16-d-01.sig" ` signoz-private:/var/lib/han-deploy/incoming/ ``` ### 2.2. Проверка ГОСТ и извлечение DEB ```sh apt-get update apt-get install -y rhash ISO='/var/lib/han-deploy/incoming/049-16-d-01.iso' SIG='/var/lib/han-deploy/incoming/049-16-d-01.sig' ls -l "$ISO" "$SIG" file "$ISO" "$SIG" sha256sum "$ISO" rhash --gost "$ISO" ``` Если ГОСТ совпал — извлеките только amd64 DEB: ```sh install -d -m 0700 -o root -g root \ /root/kesl-install /mnt/kesl-iso mount -o ro,loop "$ISO" /mnt/kesl-iso find /mnt/kesl-iso -type f \ \( -iname 'kesl_*_amd64.deb' -o -iname '*.deb' \) | sort ``` ```sh DEB='/mnt/kesl-iso/kesl/kesl_12.4.0-1225_amd64.deb' dpkg-deb -f "$DEB" Package Version Architecture sha256sum "$DEB" install -m 0600 -o root -g root \ "$DEB" /root/kesl-install/kesl.deb umount /mnt/kesl-iso rmdir /mnt/kesl-iso ``` Ожидается: Package `kesl`, Version `12.4.x`, Architecture `amd64`. `kesl-gui`, i386 и RPM не копировать. ```sh apt-get remove -y rhash apt-get purge -y rhash apt-get autoremove -y ``` Снимки до установки: ```sh test -f /etc/docker/daemon.json && \ cp -a /etc/docker/daemon.json /root/kesl-install/docker-daemon.before.json iptables-save > /root/kesl-install/iptables.before ufw status verbose > /root/kesl-install/ufw.before ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )' \ > /root/kesl-install/listeners.before ls -l /root/kesl-install ``` ```sh apt-get install /root/kesl-install/kesl.deb ``` ### 2.3. Первоначальная настройка без защиты Значения EULA, Privacy Policy и KSN — после согласования, не механически. Для этого окна, как на ВМ1/ВМ2: `USE_KSN=No`. ```sh install -m 0600 -o root -g root /dev/null /root/kesl-install/autoinstall.ini cat > /root/kesl-install/autoinstall.ini <<'EOF' KSVLA_MODE=No ENDPOINT_AGENT_MODE=No EULA_AGREED=Yes PRIVACY_POLICY_AGREED=Yes USE_KSN=No GROUP_CLEAN=Yes LOCALE=ru_RU.UTF-8 INSTALL_LICENSE=None UPDATER_SOURCE=KLServers UPDATE_EXECUTE=No KERNEL_SRCS_INSTALL=No USE_GUI=No CONFIGURE_SELINUX=No DISABLE_PROTECTION=Yes INTERCEPTOR_MODE=UseFanotify ENABLE_TRACES_ON_FIRST_STARTUP=No EOF chmod 0600 /root/kesl-install/autoinstall.ini stat -c '%U:%G:%a %n' /root/kesl-install/autoinstall.ini ``` ```sh /opt/kaspersky/kesl/bin/kesl-setup.pl \ --autoinstall=/root/kesl-install/autoinstall.ini echo "kesl-setup exit=$?" ``` При `INSTALL_LICENSE=None` setup может вернуть 71. Не запускать повторно, если `kesl.service` active и File Threat Protection Stopped. ```sh systemctl --no-pager --no-legend status kesl || true kesl-control --app-info kesl-control --get-task-list free -h cd /opt/signoz docker compose -f pours/deployment/compose.yaml ps curl -fsS --max-time 5 http://127.0.0.1:8080/api/v1/health ``` Ожидается: `kesl` запущен, задача 1 не `Started`, контейнеры healthy. ## 3. Resource budget до Update и FTP Не стартовать Update (task 6) и File Threat Protection (task 1), пока не срезаны дефолты памяти. Стартовый кандидат: - ≥8 ГиБ RAM: `ScanMemoryLimit=1024`, `MaxMemory=2048MB`, `OnDemandCPULimit=15`; - 4 ГиБ RAM: только по письменному решению владельца — `ScanMemoryLimit=512`, `MaxMemory=1024MB`, `OnDemandCPULimit=15`; full filesystem scan и архивы запрещены. ### 3.1. Снимок ```sh kesl-control --get-app-settings \ --file /root/kesl-install/app-settings.before.ini install -m 0600 -o root -g root \ /var/opt/kaspersky/kesl/common/kesl.ini \ /root/kesl-install/kesl.ini.before awk '/^\[General\]/,/^\[/' /var/opt/kaspersky/kesl/common/kesl.ini | head -n 40 ``` ### 3.2. Лимит CPU (KESL ещё работает) ```sh kesl-control --set-app-settings \ UseOnDemandCPULimit=Yes OnDemandCPULimit=15 ``` ### 3.3. Память — только при остановленном KESL Файл целиком не подменять. Сначала смотрите `[General]` из шага 3.1. ```sh systemctl stop kesl systemctl is-active kesl || true grep -nE '^(ScanMemoryLimit|MaxMemory)=' \ /var/opt/kaspersky/kesl/common/kesl.ini sed -i \ -e 's/^ScanMemoryLimit=8192$/ScanMemoryLimit=1024/' \ -e 's/^MaxMemory=auto$/MaxMemory=2048MB/' \ /var/opt/kaspersky/kesl/common/kesl.ini grep -nE '^(ScanMemoryLimit|MaxMemory)=' \ /var/opt/kaspersky/kesl/common/kesl.ini systemctl start kesl systemctl is-active kesl kesl-control --get-app-settings | grep -iE \ 'UseOnDemandCPULimit|OnDemandCPULimit|ScanMemoryLimit|MaxMemory' free -h cd /opt/signoz docker compose -f pours/deployment/compose.yaml ps ``` На constrained 4 ГиБ замените значения в `sed` на `512` и `1024MB`. Ожидаемо: `kesl.service` active; task 1 и 6 `Stopped`; базы ещё не загружены; ClickHouse/SigNoz healthy. ## 4. Активация Код не помещать в `autoinstall.ini`, репозиторий, evidence, чат и history. Нужен открытый egress из раздела 0.1. ```sh set +o history unset HISTFILE read -rsp 'KESL activation code: ' KESL_CODE; echo kesl-control --add-active-key "$KESL_CODE" unset KESL_CODE set -o history kesl-control -L --query kesl-control --app-info ``` В evidence — только статус вроде `Active subscription` и срок, не GUID ключа. Если лицензия `Inconsistent update` или недействительна — stop. ## 5. АВЗ.2 — базы ID подтвердить через `--get-task-list` (Update = 6). ```sh kesl-control --get-settings 6 kesl-control --start-task 6 -W kesl-control --get-task-state 6 kesl-control --app-info --json free -h cd /opt/signoz docker compose -f pours/deployment/compose.yaml ps ``` Если available RAM падает ниже порога раздела 0.2 или контейнер unhealthy: ```sh kesl-control --stop-task 6 ``` Ожидается: Update завершилась, `Application databases loaded: Yes`. Для 12.4 одного `RuleType=Hourly` недостаточно: нужен `StartTime` с интервалом `;1` и `LC_ALL=C` (иначе `ru_RU` подставит русское имя месяца). ```sh START="$(LC_ALL=C date +'%Y/%b/%d %H:%M:%S;1')" kesl-control --set-schedule 6 RuleType=Hourly \ "StartTime=${START}" RunMissedStartRules=No RandomInterval=0 kesl-control --get-schedule 6 ``` Если в `--app-info` есть `Post-update actions: The application module has been updated. Restart the application` — обязательный рестарт **до** запуска task 1: ```sh systemctl restart kesl systemctl is-active kesl kesl-control --app-info --json grep -nE '^(ScanMemoryLimit|MaxMemory)=' \ /var/opt/kaspersky/kesl/common/kesl.ini kesl-control --get-app-settings | grep -iE \ 'UseOnDemandCPULimit|OnDemandCPULimit' kesl-control --get-schedule 6 kesl-control --get-task-state 1 kesl-control --get-task-state 6 ``` До приёмки АВЗ.2 наблюдать хотя бы один автоматический hourly cycle при уже суженном (не широком) egress. Alert: ошибка Update, базы старше 240 часов, базы не загружены, лицензия недействительна. ## 6. Исключения hot-data KESL смотрит host filesystem. В `--add-exclusion` идёт `Source` (путь на ВМ), обычно `/var/lib/docker/volumes/<имя>/_data`. `Destination` — путь внутри контейнера, его KESL не видит. Prefix тома не угадывать. Снять mounts ещё раз, если baseline раздела 1.2 уже не под рукой: ```sh cd /opt/signoz docker compose -f pours/deployment/compose.yaml ps --format '{{.Name}}' for c in \ signoz-telemetrystore-clickhouse-0-0 \ signoz-telemetrykeeper-clickhousekeeper-0 \ signoz-metastore-postgres-0 do echo "=== $c ===" docker inspect --format \ '{{range .Mounts}}{{if eq .Type "volume"}}{{.Source}} dest={{.Destination}} vol={{.Name}}{{println}}{{end}}{{end}}' \ "$c" done ``` Какой `Source` брать — снято на этой ВМ3: | Контейнер | `dest=` | Host-путь для `--add-exclusion` | |---|---|---| | `signoz-telemetrystore-clickhouse-0-0` | `/var/lib/clickhouse` | `/var/lib/docker/volumes/signoz-telemetrystore-0-0-data/_data` | | `signoz-telemetrykeeper-clickhousekeeper-0` | `/var/lib/clickhouse-keeper` | `/var/lib/docker/volumes/signoz-telemetrykeeper-0-data/_data` | | `signoz-metastore-postgres-0` | `/var/lib/postgresql/data` | `/var/lib/docker/volumes/signoz-metastore-postgres-0-data/_data` | Не добавлять в этом окне: - `signoz-telemetrystore-user-scripts` — скрипты, не hot-data ClickHouse; - анонимный том Keeper `29bd76fc40766c8bbf2f584040e75b4f3cab02052fcf67541777c4f9340dbc84` (`dest=/var/lib/clickhouse` у keeper). Если начнёт расти (`du -sh` этого `_data`) — отдельное решение Security, не расширять список вслепую. Проверка тома: ```sh docker volume inspect --format '{{.Name}} {{.Mountpoint}}' \ signoz-telemetrystore-0-0-data \ signoz-telemetrykeeper-0-data \ signoz-metastore-postgres-0-data ``` `Mountpoint` обязан совпасть с путями ниже. Не исключать `/var/lib/docker`, `overlay2`, `/opt/signoz`, `/var/lib/han-deploy/incoming`, `/tmp`, `/root`. ```sh kesl-control --get-settings 1 \ --file /root/kesl-install/file-threat.before.ini kesl-control --set-settings 1 \ --add-exclusion /var/lib/docker/volumes/signoz-telemetrystore-0-0-data/_data kesl-control --set-settings 1 \ --add-exclusion /var/lib/docker/volumes/signoz-telemetrykeeper-0-data/_data kesl-control --set-settings 1 \ --add-exclusion /var/lib/docker/volumes/signoz-metastore-postgres-0-data/_data kesl-control --set-settings 1 ScanArchived=No kesl-control --get-settings 1 ``` Каждое исключение: владелец, причина (write-hot telemetry/metadata), компенсация (FTP вне volume + периодический `scan-file` host-дерева `/opt/signoz/scripts`), срок пересмотра, подтверждение Security. ## 7. Узкий on-demand scan-file ODS schedules, кроме Update, оставить Manual. Не сканировать volumes ClickHouse/PostgreSQL и не запускать Container Scan. ```sh kesl-control --get-task-list kesl-control --get-schedule 2 kesl-control --set-schedule 2 RuleType=Manual kesl-control --scan-file /opt/signoz/scripts --action Inform kesl-control --get-task-state 1 free -h cd /opt/signoz docker compose -f pours/deployment/compose.yaml ps ``` Ожидается: scan-file без ошибок, FTP всё ещё Stopped, стек healthy. Если вырос swap или unhealthy — остановить scan и не включать task 1. ## 8. Host protection — АВЗ.1 На Ubuntu 24.04 с fanotify параметр `InterceptorProtectionMode` **не поддерживается**. Штатный режим — блокировка на время проверки. Откат: `kesl-control --stop-task 1`. ```sh kesl-control --start-task 1 kesl-control --set-settings 1 \ ActionOnThreat=DisinfectDeleteIfNotPossible ScanArchived=No kesl-control --get-task-state 1 kesl-control --get-settings 1 kesl-control --app-info --json free -h docker stats --no-stream --format \ 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}' cd /opt/signoz docker compose -f pours/deployment/compose.yaml ps ufw status verbose ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )' ``` Пилот: каждые 15 минут — health, OTLP, RAM/swap, события KESL, firewall. При деградации: `kesl-control --stop-task 1`. Не расширять исключения вслепую. ## 9. Приёмочный EICAR EICAR только с письменным разрешением Security. Образец не класть в git, chat и evidence. Каталог не в docker volume, `/tmp`, `/opt/signoz/pours`. ```sh install -d -m 0700 -o root -g root /root/kesl-eicar-test date -Is kesl-control --get-task-state 1 curl -fsSL -o /root/kesl-eicar-test/eicar.com \ 'https://secure.eicar.org/eicar.com' chmod 0600 /root/kesl-eicar-test/eicar.com ls -l /root/kesl-eicar-test kesl-control -E --query -n 20 --reverse ``` Если OAS на запись молчит (как на пилоте ВМ1) — явный ODS: ```sh kesl-control --scan-file /root/kesl-eicar-test/eicar.com \ --action DisinfectDeleteIfNotPossible kesl-control -E --query -n 20 --reverse ls -la /root/kesl-eicar-test ``` Уборка (не весь Backup): ```sh kesl-control -B --query --reverse -n 20 kesl-control -B --mass-remove --query "DetectName == 'EICAR-Test-File'" rm -rf /root/kesl-eicar-test ``` ## 10. Приёмка стека и сужение egress На ВМ3: ```sh systemctl is-active kesl docker kesl-control --app-info kesl-control --get-task-state 1 kesl-control --get-task-state 6 kesl-control --get-schedule 6 cd /opt/signoz ./scripts/30-verify-signoz.sh docker compose -f pours/deployment/compose.yaml ps ufw status verbose diff -u /root/kesl-install/ufw.before <(ufw status verbose) || true ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )' free -h swapon --show df -hT / /opt /var/lib/docker ``` С ВМ1 повторить TCP `4317`. Слушатели `8080` только на `127.0.0.1`, `4317/4318` только на `192.168.0.5`. Сравнить UFW с baseline: новых правил KESL быть не должно. 24 часа: без OOM/restart/unhealthy, hourly Update сам зелёный, диск ClickHouse не упёрся в stop-порог. После gates: 1. закрыть широкий internet egress окна установки; 2. оставить DNS/NTP и узкий allow-list Kaspersky из раздела 0.1; 3. не открывать ingress `8080/4317/4318` из интернета; 4. ISO/DEB из `/var/lib/han-deploy/incoming` и `/root/kesl-install` удалить только после переноса разрешённого evidence. ```sh rm -rf /root/kesl-eicar-test # после копирования evidence: # rm -rf /root/kesl-install # rm -f /var/lib/han-deploy/incoming/049-16-d-01.iso \ # /var/lib/han-deploy/incoming/049-16-d-01.sig ``` Не выполнять reboot только ради KESL. ## 11. Evidence Заполнить [`EVIDENCE.AVZ.ru.md`](EVIDENCE.AVZ.ru.md) без activation code, secrets, file bytes, полного checksum и EICAR. ```sh systemctl is-active kesl kesl-control --app-info --json kesl-control --get-task-state 1 kesl-control --get-settings 1 kesl-control --get-schedule 6 kesl-control -E --query -n 100 --reverse --json cd /opt/signoz docker compose -f pours/deployment/compose.yaml ps ``` ## 12. Rollback Сначала минимально обратимое: ```sh kesl-control --stop-task 1 ``` Если KESL не отвечает: ```sh systemctl stop kesl ``` `apt-get purge kesl` — только по решению approver. Затем: ```sh systemctl daemon-reload cd /opt/signoz ./scripts/30-verify-signoz.sh docker compose -f pours/deployment/compose.yaml ps ufw status verbose ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )' ``` Запрещено: `docker compose down -v`, `docker volume prune`, `docker system prune --volumes`, удаление volumes ClickHouse/PostgreSQL, правка `pours/` или смена firewall ради обхода KESL. После rollback повторить OTLP с ВМ1 и зафиксировать incident. ## 13. Эксплуатационный режим - Update (ID 6): каждый час; нужен постоянный узкий egress к KLServers. - File Threat Protection (ID 1): постоянно, `DisinfectDeleteIfNotPossible`, `ScanArchived=No`. - ODS: по согласованию в низкую нагрузку; не полный диск и не volumes БД. - ContainerScan: не использовать при текущей лицензии. - Ежедневно: лицензия, task 1 `Started`, дата баз, ошибки KESL, health SigNoz, свободное место `/opt`. - После upgrade KESL/kernel/Docker: повтор пилота и evidence delta. Обновление образов SigNoz (`20-deploy-signoz.sh`) — отдельное break-glass окно; его egress к Docker Hub/GitHub не заменяет allow-list KESL.