Files
2026-09-09 10:57:11 +03:00

718 lines
25 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.