diff --git a/VM3_signoz/Signoz/README.md b/VM3_signoz/Signoz/README.md index 7851ce6..4295e76 100644 --- a/VM3_signoz/Signoz/README.md +++ b/VM3_signoz/Signoz/README.md @@ -24,6 +24,8 @@ - [RUNBOOK.ru.md](docs/RUNBOOK.ru.md) — раскатка ВМ3, verify, firewall, lockdown, обновление и rollback; +- [RUNBOOK.KESL.ru.md](docs/kesl/RUNBOOK.KESL.ru.md) — установка host KESL + 12.4, АВЗ.1/АВЗ.2, отдельное окно; - [NETWORK.md](docs/NETWORK.md) — сеть, группа безопасности, SSH-туннель; - [BACKEND_OTLP.md](docs/BACKEND_OTLP.md) — передача телеметрии HAN Chat; - [SIGNOZ_RUNBOOK.md](docs/SIGNOZ_RUNBOOK.md) — ежедневная работа в UI и diff --git a/VM3_signoz/Signoz/docs/RUNBOOK.ru.md b/VM3_signoz/Signoz/docs/RUNBOOK.ru.md index 1e83eba..410a0de 100644 --- a/VM3_signoz/Signoz/docs/RUNBOOK.ru.md +++ b/VM3_signoz/Signoz/docs/RUNBOOK.ru.md @@ -12,7 +12,9 @@ Эксплуатация UI, разбор инцидентов и алерты — в [`SIGNOZ_RUNBOOK.md`](SIGNOZ_RUNBOOK.md). Подключение приложений — [`BACKEND_OTLP.md`](BACKEND_OTLP.md). Сеть и группы безопасности — -[`NETWORK.md`](NETWORK.md). +[`NETWORK.md`](NETWORK.md). Установка host KESL 12.4 — отдельное окно, +[`kesl/RUNBOOK.KESL.ru.md`](kesl/RUNBOOK.KESL.ru.md); не совмещать с +раскаткой, lockdown или обновлением стека. ## 0. Назначение, инвентарь и stop conditions @@ -356,7 +358,9 @@ docker system df `casting.yaml` + `20-deploy-signoz.sh`. Обновление — break-glass по arch-06: временный исходящий HTTPS к Docker Hub, -GitHub и SigNoz, минимальное окно, затем повтор lockdown. +GitHub и SigNoz, минимальное окно, затем повтор lockdown. Узкий egress +host KESL к серверам обновления Kaspersky задаётся runbook KESL и этим +окном не подменяется. ```bash cd /opt/signoz diff --git a/VM3_signoz/Signoz/docs/kesl/EVIDENCE.AVZ.ru.md b/VM3_signoz/Signoz/docs/kesl/EVIDENCE.AVZ.ru.md new file mode 100644 index 0000000..bb17774 --- /dev/null +++ b/VM3_signoz/Signoz/docs/kesl/EVIDENCE.AVZ.ru.md @@ -0,0 +1,97 @@ +# Карта доказательств АВЗ.1 и АВЗ.2 для ВМ3 SigNoz + +Заполняется оператором после `RUNBOOK.KESL.ru.md`. Не включать activation +code, ключи, токены, environment, персональные данные или тестовый файл +EICAR. + +## 1. Изменение + +- Change ID / окно: +- Оператор / approvers Security, Service, Operations: +- Hostname, Ubuntu, kernel, architecture: +- RAM / swap / свободный диск: +- KESL package/version, SHA-256 DEB, источник ISO, ГОСТ ISO: +- Коммерческая сборка не заявлена сертифицированной ФСТЭК: да / нет +- KSN decision и правовое основание: +- Egress окна установки (что открывали) и steady-state allow-list: + +## 2. Baseline и stop conditions + +- SigNoz containers healthy/running (`30-verify-signoz.sh`): +- OTLP `192.168.0.5:4317` с ВМ1/ВМ2: +- UI `127.0.0.1:8080/api/v1/health`: +- CPU, available RAM, swap, disk/IO wait: +- Restart/OOM ClickHouse, Keeper, PostgreSQL, SigNoz, ingester: +- Слушатели `8080/4317/4318` совпали с baseline: +- Утверждённые пороги и rollback approver: + +## 3. АВЗ.1 + +Норма: Приказ ФСТЭК №21, приложение АВЗ.1; п. 8.6 — обнаружение +вредоносных программ/информации и реагирование. + +- [ ] `kesl.service` active, лицензия действительна. +- [ ] File Threat Protection task 1 = `Started`. +- [ ] `ActionOnThreat=DisinfectDeleteIfNotPossible`, `ScanArchived=No`. +- [ ] fanotify; `InterceptorProtectionMode` не применялся (unsupported). +- [ ] Контролируемый EICAR обнаружен (OAS и/или ODS) и обработан. +- [ ] Событие detection/action есть в журнале KESL. +- [ ] Исключения ограничены фактическими mountpoint ClickHouse / Keeper / + PostgreSQL. +- [ ] `/var/lib/docker`, `/opt/signoz`, `/tmp` не исключены целиком. +- [ ] UFW и слушатели портов после Block без новых правил KESL. +- [ ] 24 часа без OOM/restart/unhealthy и неприемлемой деградации. + +Артефакты/время/результат: + +## 4. АВЗ.2 + +Норма: Приказ ФСТЭК №21, приложение АВЗ.2 — обновление базы признаков +вредоносных компьютерных программ. + +- [ ] Update task 6 вручную завершилась успешно. +- [ ] Базы загружены, дата актуальна. +- [ ] Schedule = Hourly с `StartTime=...;1`. +- [ ] Наблюдён последующий автоматический successful update. +- [ ] После окна широкий egress закрыт; KLServers остаются в allow-list. +- [ ] Alert на update failure / unloaded / age >240h / license failure. +- [ ] Назначен ежедневный контроль и owner. + +Артефакты/время последнего automatic update: + +## 5. РСБ и АНЗ.2 + +- [ ] Определены события detection/remediation/update/license. +- [ ] Определены место/срок хранения и регламент просмотра. +- [ ] Версия KESL и upgrade lifecycle контролируются. +- [ ] Kernel/Docker/KESL upgrade требует compatibility pilot + evidence delta. + +## 6. Исключения + +Для каждого исключения: фактический mountpoint, владелец, причина, риск, +компенсирующая проверка, дата пересмотра. + +- ClickHouse data: +- ClickHouse Keeper: +- PostgreSQL metastore: +- Иные (только с утверждением Security): + +Лицензионное ограничение: Container Monitoring / Container Scan недоступны. +Scan-broker Message Safety на ВМ3 не устанавливается. + +## 7. Rollback + +- [ ] `kesl-control --stop-task 1` проверен документально. +- [ ] `systemctl stop kesl` доступен break-glass. +- [ ] `apt-get purge kesl` только по решению approver. +- [ ] Откат не использует `docker compose down -v` и не удаляет volumes. +- [ ] После отката предусмотрены `30-verify-signoz.sh`, OTLP и firewall checks. + +## 8. Итоговая приёмка + +- АВЗ.1: +- АВЗ.2: +- Ограничения/остаточные риски: +- Operations, ФИО/подпись/дата: +- Security, ФИО/подпись/дата: +- Service owner, ФИО/подпись/дата: diff --git a/VM3_signoz/Signoz/docs/kesl/RUNBOOK.KESL.ru.md b/VM3_signoz/Signoz/docs/kesl/RUNBOOK.KESL.ru.md new file mode 100644 index 0000000..ca68f27 --- /dev/null +++ b/VM3_signoz/Signoz/docs/kesl/RUNBOOK.KESL.ru.md @@ -0,0 +1,717 @@ +# 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. diff --git a/support¬es/deploy_stories/260907_1.md b/support¬es/deploy_stories/260907_1.md index f8e1dfe..b5ea556 100644 --- a/support¬es/deploy_stories/260907_1.md +++ b/support¬es/deploy_stories/260907_1.md @@ -1,5 +1,262 @@ # Ставим KES на ВМ1 +Копируем на диск: +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" prodVM1Deploy:/var/lib/han-deploy/incoming/ + +apt install rhash + +ISO='/var/lib/han-deploy/incoming/049-16-d-01.iso' +command -v rhash +rhash --gost "$ISO" + +ГОСТ совпал: rhash --gost дал ту же сумму, что на сайте вендора. ISO подлинный. +6a94b16afad211e8b9be5ec86f5379184f2b3a9e5869843fe763e2796e5ac1d3 + +sudo apt remove -y rhash +sudo apt purge -y rhash + +Дальше только копирование нужного DEB и снимки. GUI, i386 и RPM не трогайте. Установку ещё не запускайте. +```sh +ISO='/var/lib/han-deploy/incoming/049-16-d-01.iso' +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 + +DEB='/mnt/kesl-iso/kesl/kesl_12.4.0-1225_amd64.deb' +``` + +```sh +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 +``` + +`apt-get install /root/kesl-install/kesl.deb` + + +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 +ls -l /root/kesl-install + +Ожидается: Package: kesl, Version: 12.4.0-1225, Architecture: amd64. + +Дальше установка с выключенной защитой, без кода активации и без сканирования. +Перед командами явно примите EULA и политику конфиденциальности Kaspersky. KSN для этого пилота выключаем (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 +``` + +```sh +/opt/kaspersky/kesl/bin/kesl-setup.pl \ + --autoinstall=/root/kesl-install/autoinstall.ini +echo "kesl-setup exit=$?" +``` + +```sh +systemctl --no-pager --no-legend status kesl || true +kesl-control --app-info +kesl-control --get-task-list +free -h +/usr/local/sbin/han-vm1-compose ps +docker stats --no-stream --format \ + 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}' +``` + +Ожидается: служба kesl запущена, File Threat Protection не в Started, контейнеры healthy, available RAM не уходит ниже ~512 МБ. + + +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 + +systemctl stop kesl +python3 - <<'PY' +from pathlib import Path +path = Path("/var/opt/kaspersky/kesl/common/kesl.ini") +text = path.read_text(encoding="utf-8") +if "[General]" not in text: + raise SystemExit("no [General] section in kesl.ini") +wanted = {"ScanMemoryLimit": "1024", "MaxMemory": "2048MB"} +lines = text.splitlines() +in_general = False +seen = set() +out = [] +for line in lines: + stripped = line.strip() + if stripped.startswith("[") and stripped.endswith("]"): + in_general = stripped == "[General]" + if in_general and "=" in stripped and not stripped.startswith("#"): + key = stripped.split("=", 1)[0].strip() + if key in wanted: + out.append(f"{key}={wanted[key]}") + seen.add(key) + continue + out.append(line) +if seen != set(wanted): + rebuilt = [] + inserted = False + in_general = False + for line in out: + stripped = line.strip() + rebuilt.append(line) + if stripped.startswith("[") and stripped.endswith("]"): + if in_general and not inserted: + for key, value in wanted.items(): + if key not in seen: + rebuilt.insert(-1, f"{key}={value}") + inserted = True + in_general = stripped == "[General]" + if in_general and not inserted: + for key, value in wanted.items(): + if key not in seen: + rebuilt.append(f"{key}={value}") + out = rebuilt +path.write_text("\n".join(out) + "\n", encoding="utf-8") +print("updated ScanMemoryLimit/MaxMemory") +PY +grep -E '^(ScanMemoryLimit|MaxMemory)=' /var/opt/kaspersky/kesl/common/kesl.ini +systemctl start kesl +systemctl is-active kesl +kesl-control --set-app-settings UseOnDemandCPULimit=Yes OnDemandCPULimit=15 +free -h +swapon --show + +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 +kesl-control --get-task-state 1 +/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}" + +free -h +kesl-control --start-task 6 -W +kesl-control --get-task-state 6 +kesl-control --app-info +free -h +/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}" + +Ожидается ровно одна строка MaxMemory=1024MB, Update завершилась, Application databases loaded: Yes, лицензия не Inconsistent update. Если available RAM < 512 МБ или контейнер unhealthy — остановите Update (kesl-control --stop-task 6) и пришлите вывод. GUID ключа в следующий лог лучше не включать. + + +Базы загружены, ключ действителен, File Threat Protection доступна и остановлена, сервисы HAN healthy. АВЗ.2 по сути закрыта после почасового Update. + +Вендор просит перезапуск KESL после обновления модуля. Container Monitoring этой лицензией не покрыт — контейнерный мониторинг пропускаем, компенсируем host File Threat Protection и точечным scan-file. + +Сеть/firewall KESL не включаем. Сначала restart, расписание Update и исключения hot-data. + +systemctl restart kesl +systemctl is-active kesl +kesl-control --get-task-state 1 + +kesl-control --get-task-state 6 +kesl-control --app-info --json +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 + + +kesl-control --get-settings 1 \ + --file /root/kesl-install/file-threat.before.ini +kesl-control --set-settings 1 \ + --add-exclusion /var/lib/docker/volumes/han-chat_redis-data/_data +kesl-control --set-settings 1 \ + --add-exclusion /var/lib/docker/volumes/han-chat_otel-queue/_data +kesl-control --set-settings 1 \ + --add-exclusion /var/lib/docker/volumes/han-chat_nginx-cache/_data +kesl-control --set-settings 1 ScanArchived=No +kesl-control --get-settings 1 + +free -h +/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}" + + +Ожидается: Post-update actions: No action required, базы загружены, FTP Stopped, RuleType=Hourly, в настройках задачи 1 три исключения и ScanArchived=No. Пришлите вывод. + +Исключения приняты, сервисы healthy. Почасовой Update не применился: 12.4 требует StartTime с интервалом, иначе остаётся Manual. + +Сначала расписание, затем узкий scan-file без изменения файлов. File Threat Protection пока не запускаем. + +kesl-control --get-schedule 6 + +kesl-control --scan-file /opt/han-chat/current/backend --action Inform +kesl-control --get-task-state 1 +free -h +/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}" + +Ожидается: RuleType=Hourly и StartTime=...;1, scan-file без ошибок, FTP Stopped, контейнеры healthy. Если scan-file сильно поднимет swap или появятся unhealthy — остановите его и пришлите вывод. + +Расписание Update почасовое, узкий scan-file прошёл чисто (421 объект, 0 угроз), swap не вырос, сервисы healthy. + +Дальше File Threat Protection в режиме Notify: обнаружения пишутся в журнал, файлы не блокируются. Сеть/firewall KESL и Behavior Detection не включаем. Container scan этой лицензией недоступен — пропускаем. + +kesl-control --set-app-settings InterceptorProtectionMode=Notify +kesl-control --start-task 1 +kesl-control --get-task-state 1 +kesl-control --app-info --json +free -h +docker stats --no-stream --format \ + 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}' +/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}" +iptables -S HAN-CHAT-DOCKER + + +File Threat Protection уже Running, сервисы healthy, firewall не тронут. InterceptorProtectionMode на fanotify в 12.4 не существует — штатный режим и есть блокировка на время проверки. Для АВЗ.1 это достаточный путь; откат: kesl-control --stop-task 1. + +Дальше контролируемый EICAR. Образец в чат после теста не копируйте. +```sh +install -d -m 0700 -o root -g root /root/kesl-eicar-test +printf '%s' 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \ + > /root/kesl-eicar-test/eicar.com +ls -l /root/kesl-eicar-test +kesl-control --scan-file /root/kesl-eicar-test --action DisinfectDeleteIfNotPossible +kesl-control -E --query -n 30 --reverse +ls -la /root/kesl-eicar-test +rm -rf /root/kesl-eicar-test + +kesl-control --get-task-state 1 +kesl-control --get-schedule 6 +free -h +/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}" +``` @@ -387,8 +644,8 @@ allow 10.0.0.11; deny all; Переключить только Message Safety +```sh cd /opt/han-chat/services/ - deployment/preflight.sh /usr/local/sbin/han-vm2-compose config --quiet @@ -397,6 +654,19 @@ deployment/preflight.sh /usr/local/sbin/han-vm2-compose ps /usr/local/sbin/han-vm2-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}" +``` + +HUP NGINX +```sh +/usr/local/sbin/han-vm2-compose exec -T nginx nginx -t -c /etc/nginx/nginx.conf +NGINX_ID=$(/usr/local/sbin/han-vm2-compose ps --status running --quiet nginx) +docker kill --signal HUP "$NGINX_ID" + +/usr/local/sbin/han-vm2-compose exec -T nginx getent hosts message-safety-api +/usr/local/sbin/han-vm2-compose exec -T message-safety-api \ + python -c 'import json,urllib.request; print(json.dumps(json.load(urllib.request.urlopen("http://127.0.0.1:8080/health/ready")), indent=2))' +``` + Тестирование: @@ -600,9 +870,11 @@ kesl-control --get-schedule 6 curl --fail --silent --show-error \ --cacert /etc/han/ca/vm2-internal-ca.crt \ + https://prodhanservice.ihan.ru:8443/internal/safety/status + + https://processing.internal:8443/internal/safety/status - https://prodhanservice.ihan.ru:8443/internal/safety/status --- ### Cutover (только после 1–5) @@ -644,4 +916,424 @@ docker kill --signal HUP "$NGINX_ID" Старый signature-CDN egress закрывается отдельно в firewall/SG — не через `compose down -v`. -На этом DEV-хосте (3.8 ГиБ, swap 391 МиБ) пункт 3 и file-EICAR через Safety лучше не совмещать с чем-то ещё. Если нужно, могу выписать только gate 1+2 компактным блоком под копирование в `260907_1.md`. \ No newline at end of file +На этом DEV-хосте (3.8 ГиБ, swap 391 МиБ) пункт 3 и file-EICAR через Safety лучше не совмещать с чем-то ещё. Если нужно, могу выписать только gate 1+2 компактным блоком под копирование в `260907_1.md`. + +# Ставим KESL на ВМ1 + +Копируем на диск: +scp -i C:\Users\MI\.ssh\prodHan "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" root@185.31.164.97:/tmp/ + + +apt install rhash +ISO='/tmp/049-16-d-01.iso' +command -v rhash +rhash --gost "$ISO" + +ГОСТ совпал: rhash --gost дал ту же сумму, что на сайте вендора. ISO подлинный. +6a94b16afad211e8b9be5ec86f5379184f2b3a9e5869843fe763e2796e5ac1d3 + +sudo apt remove -y rhash +sudo apt purge -y rhash + +Подготовка +```sh +free -h +swapon --show +df -hT / /var/lib/docker /opt /tmp +df -ih / /var/lib/docker /opt /tmp +systemctl is-active docker ufw +``` + +### 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 )' +``` + +Снять фактические mountpoint hot-data. Prefix Compose не угадывать: + +```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 и, если есть отдельный volume приложения +SigNoz. 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/10.0.0.13/4317' \ + && echo 'OTLP gRPC reachable' +``` + +Без живого OTLP и healthy стека к установке не переходить. + + +## 2. Дистрибутив и установка + +ISO='/tmp/049-16-d-01.iso' + +```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 +``` + +```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 +### 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 +``` + +```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 +``` + +```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 +``` + +## 6. Исключения hot-data + +Только фактические mountpoint из раздела 1.2. Кандидаты: данные ClickHouse, +ClickHouse Keeper, PostgreSQL metastore. Не исключать `/var/lib/docker`, +`overlay2`, `/opt/signoz`, `/var/lib/han-deploy/incoming`, `/tmp`, `/root`. + +Снять mountpoint: +```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 +``` + +```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`. Не расширять исключения +вслепую. + +## 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 +sudo PRIVATE_IP=10.0.0.13 ./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-порог. + +```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 +``` + +## 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.