# KESL 12.4 standalone на ВМ2 Processing Операторский runbook для Ubuntu 24.04 ВМ2. Команды выполняет персональная роль `admin` через `sudo` в отдельное maintenance window. Репозиторий не устанавливает, не активирует и не запускает KESL автоматически. Цели: 1. АВЗ.1: обнаружение и реагирование через host File Threat Protection. 2. АВЗ.2: автоматическое обновление баз. 3. Замена ClamAV в Message Safety локальным fail-closed scan-broker. KESL 12.4 commercial не заявляется как сертифицированная ФСТЭК сборка. ## 0. Approvals и stop conditions До окна зафиксировать change ID, оператора, Security/Service/Operations approvers, hostname, ОС/ядро, package version/hash/source, лицензию, release SHA и rollback. EULA, Privacy Policy и KSN согласовать отдельно. Activation code, ключи и secrets не помещать в репозиторий, историю shell, chat или evidence. Остановиться, если: - ОС/архитектура/ядро отсутствуют в матрице KESL 12.4; - установлен другой AV или неизвестный KESL; - свободно менее 10 ГБ, нет 4 ГБ swap либо baseline ВМ2 уже деградирован; - KESL+ClamAV coexistence оставляет менее 2 ГБ available memory, вызывает устойчивый swap IO, OOM/restart, IO wait >10% за 5 минут; - p95 Safety/Redis вырос более чем на 20%, queue age >30 секунд; - package hash/source не подтверждены, лицензия недействительна или базы не загружены. Не совмещать с deploy, миграциями, backup, TLS renewal, Docker restart или reboot. ## 1. Read-only baseline ```sh date -Is hostnamectl uname -a dpkg --print-architecture free -h swapon --show df -hT / /var/lib/docker /tmp df -ih / /var/lib/docker /tmp systemctl is-active docker fail2ban ufw han-processing.service dpkg-query -W -f='${Package}\t${Version}\t${Status}\n' \ kesl kesl-gui kav4fs 2>/dev/null || true /usr/local/sbin/han-vm2-compose ps docker stats --no-stream iptables -S HAN-CHAT-VM2 ufw status verbose ``` Сохранить baseline CPU/RAM/swap/IO, Safety latency/error/queue, Redis latency, container restart/OOM, OTEL queue и внешний/private smoke. Получить фактические mountpoint только для `redis-safety-data` и `otel-queue` через `docker volume inspect`; prefix Compose не угадывать. ## 2. Дистрибутив и установка Использовать amd64 DEB KESL 12.4 из официального канала. Хеши пилота ВМ1 не считать универсальными: записать фактические SHA-256 DEB/ISO и, если поставщик публикует ФИКС/ГОСТ, проверить соответствующим алгоритмом. Проверка файла: ``` apt install rhash ISO='/var/lib/han-deploy/incoming/049-16-d-01.iso' command -v rhash rhash --gost "$ISO" ``` Должно быть 6a94b16afad211e8b9be5ec86f5379184f2b3a9e5869843fe763e2796e5ac1d3 Если совпадёт, извлеките DEB: ``` 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' 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 ``` Ожидаемые свойства: kesl, версия 12.4.x, архитектура amd64. После этого можно выполнять: ``` apt-get install /root/kesl-install/kesl.deb ``` Создать `/root/kesl-install/autoinstall.ini` mode `0600`: ```ini KSVLA_MODE=No ENDPOINT_AGENT_MODE=No EULA_AGREED= PRIVACY_POLICY_AGREED= USE_KSN= 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 ``` ```sh chmod 0600 /root/kesl-install/autoinstall.ini /opt/kaspersky/kesl/bin/kesl-setup.pl \ --autoinstall=/root/kesl-install/autoinstall.ini systemctl --no-pager status kesl kesl-control --app-info --json kesl-control --get-task-list ``` При `INSTALL_LICENSE=None` setup может вернуть 71; не запускать повторно, если `kesl.service` active и компоненты защиты остановлены. Активацию выполнить без history, затем удалить переменную: ```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 ``` ## 3. Resource budget до первой проверки Defaults `ScanMemoryLimit=8192` и `MaxMemory=auto` не принимать на ВМ2 8 ГБ. Стартовый кандидат — `ScanMemoryLimit=1024`, `MaxMemory=2048MB`; окончательные значения определяются baseline и coexistence с ещё работающим ClamAV. ```sh kesl-control --get-app-settings \ --file /root/kesl-install/app-settings.before.ini kesl-control --set-app-settings \ UseOnDemandCPULimit=Yes OnDemandCPULimit= ``` `ScanMemoryLimit`/`MaxMemory` менять только по официальной процедуре в секции `[General]` `/var/opt/kaspersky/kesl/common/kesl.ini` при остановленном KESL. ## 4. АВЗ.2 — базы ID подтвердить через `--get-task-list`. ```sh kesl-control --get-settings 6 kesl-control --start-task 6 -W 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 ``` До приёмки наблюдать хотя бы один автоматический hourly cycle. Alert: ошибка Update, базы старше 240 часов, базы не загружены, лицензия недействительна. ## 5. Host protection — АВЗ.1 Добавить только фактические hot-data mountpoint Redis Safety и OTEL queue. Не исключать `/var/lib/docker`, release, incoming, secrets, `/tmp` или `/`. Не исключать staging broker `/var/lib/han-kesl-scan/staging`: исключение task 1 распространяется и на явный `Scan_File`, поэтому файл будет пропущен. Если исключение уже добавлено, удалить его до проверки broker: ```sh kesl-control --set-settings 1 \ --del-exclusion /var/lib/han-kesl-scan/staging ``` ```sh kesl-control --get-settings 1 \ --file /root/kesl-install/file-threat.before.ini kesl-control --set-settings 1 \ --add-exclusion kesl-control --set-settings 1 \ --add-exclusion 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 ``` Проверять события, health, firewall и ресурсы каждые 15 минут. При деградации: `kesl-control --stop-task 1`. ## 6. Scan-broker После активации release повторить host setup для установки root-owned unit, затем проверить файлы и включить socket: ```sh systemd-analyze verify \ /etc/systemd/system/han-kesl-scan-broker.service \ /etc/systemd/system/han-kesl-scan-broker.socket systemctl enable --now han-kesl-scan-broker.socket systemctl is-active kesl han-kesl-scan-broker.socket stat -c '%U:%G:%a %n' /run/han-kesl/scan.sock /usr/local/libexec/han-kesl-scan-broker --probe journalctl --since '-10 min' --no-pager -u han-kesl-scan-broker.service ``` Ожидается `root:han-message-safety:660`. Broker не имеет TCP port, принимает не более 5 MiB, не получает S3 key/имя/ПД, запускает фиксированный Scan_File `Inform` и возвращает только verdict/version. Неизвестный вывод KESL — error. Для `Scan_File` код возврата `72` означает обнаружение угрозы и принимается только вместе с итогом `detected > 0`; любое противоречие обрабатывается как `scanner_unavailable`. Broker service намеренно не содержит `Requires=kesl.service`: иначе обращение к socket автоматически запустит остановленный KESL и сделает fail-closed проверку недостоверной. Порядок запуска обеспечивается `After=kesl.service`. ## 7. Приёмка и cutover EICAR разрешён только письменно Security и не хранится в repository/evidence. Отдельно выполнить: 1. host on-access: обнаружение и реагирование task 1; 2. broker: clean → clean, EICAR → infected, остановленный KESL → error; 3. 5 concurrent broker slots и corpus 2 file/s; p95 final ≤60 s, public wait ≤300 s, queue age p95 ≤5 s; 4. Message Safety: clean `200`, malware `403`, scanner error `503`, verdict sticky; 5. smoke ВМ2/ВМ1, firewall unchanged, 24 часа без OOM/restart/5xx/degradation. Только после gates активировать новую config version, release без `clamd`/`freshclam`, затем подтвердить отсутствие их контейнеров/volumes и закрыть старый signature-CDN egress. ## 8. Evidence Заполнить `EVIDENCE.AVZ.ru.md` без activation code, secrets, file bytes, S3 key, полного checksum и EICAR. Сохранить безопасные excerpts: ```sh systemctl is-active kesl han-kesl-scan-broker.socket 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 /usr/local/sbin/han-vm2-compose ps ``` ## 9. Rollback Application rollback: вернуть предыдущие совместимые image/config/release с `clamd`, не создавать новый task id для уже pending request. Host KESL оставить, если он не причина инцидента. Если проблема в host protection: ```sh kesl-control --stop-task 1 # если KESL не отвечает: systemctl stop kesl ``` `apt-get purge kesl` — только по решению approver. Не выполнять compose `down -v`, не удалять Redis/OTEL volumes и не менять firewall ради обхода. После rollback повторить smoke, resource checks и зафиксировать incident.