# KESL 12.4 standalone на production ВМ1 Это операторский runbook для поэтапного внедрения Kaspersky Endpoint Security для Linux 12.4 на Ubuntu 24.04 ВМ1. Команды выполняются только персональной ролью `admin` через `sudo`; repository automation этот runbook не запускает. Цель: реализовать АВЗ.1 (обнаружение и реагирование) и АВЗ.2 (обновление баз) без деградации Docker-стека HAN Chat. Не выполняйте установку одновременно с deploy, миграциями, backup, ротацией секретов, TLS renewal, перезапуском Docker или host reboot. Официальная документация: - [программные требования](https://support.kaspersky.ru/kes-for-linux/12.4.0/197645); - [краткое руководство по установке](https://support.kaspersky.ru/kes-for-linux/12.4.0/install/16099); - [автоматическая первоначальная настройка](https://support.kaspersky.ru/kes-for-linux/12.4.0/197909); - [параметры autoinstall.ini](https://support.kaspersky.ru/kes-for-linux/12.4.0/197593); - [ограничение CPU и памяти](https://support.kaspersky.ru/kes-for-linux/12.4.0/264979); - [настройка File Threat Protection](https://support.kaspersky.ru/kes-for-linux/12.4.0/248490); - [проверка контейнеров](https://support.kaspersky.ru/kes-for-linux/12.4.0/197612); - [удаление DEB-пакета](https://support.kaspersky.ru/kes-for-linux/12.4.0/197596). ## 0. Участники, входные данные и stop conditions До окна работ зафиксируйте: - change ID, время окна, оператора, approver Security и on-call; - hostname/IP ВМ1, фактическую версию Ubuntu и ядра; - точное имя, версию и SHA-256 полученного от Kaspersky DEB-пакета; - источник пакета и лицензию/код активации; - текущий release SHA и image digests; - место хранения evidence вне immutable release. Значения лицензии, activation code, proxy credentials и секреты HAN нельзя помещать в репозиторий, shell history, журналы или evidence. Немедленно остановитесь, если: - ОС, архитектура или ядро отсутствуют в матрице KESL 12.4; - уже установлен другой антивирус или неизвестная версия KESL; - свободно менее 4 ГБ или нет рабочего swap; - до установки есть unhealthy/restarting контейнеры, 5xx или дефицит ресурсов; - не совпал SHA-256 пакета; - после этапа выросли restart count, 5xx, Redis latency/blocked clients, OTEL queue или host IO wait сверх согласованного порога; - File Threat Protection изменил UFW/iptables или доступность портов; - базы не загрузились либо лицензия недействительна. Рекомендуемые пороги отката для пилота (утвердить до установки): - новый unhealthy/restart любого steady-state сервиса; - публичный smoke не проходит два запуска подряд; - host available memory менее 2 ГБ или начинается устойчивый swap-in/swap-out; - IO wait более 10% в течение 5 минут; - p95 API/Redis latency выросла более чем на 20% от baseline в течение 10 минут; - свободное место уменьшилось ниже 10 ГБ или ниже 15%. ### 0.1. Исключение только для constrained test VM На тестовой ВМ допускается пилот с 4 ГБ RAM без увеличения памяти только по явному решению владельца среды. Это не отменяет production-gate и не является обоснованием для переноса той же конфигурации в боевую среду. Обязательные ограничения такого пилота: - provider snapshot/console и оператор доступны до начала; - `ScanMemoryLimit=512`, `MaxMemory=1024MB`; - `UseOnDemandCPULimit=Yes`, `OnDemandCPULimit=15`; - не запускать full filesystem scan и проверку архивов; - ODS и ContainerScan выполнять по одному объекту, не одновременно; - сначала Update и health, затем один ограниченный `scan-file`, затем File Threat Protection; `InterceptorProtectionMode` на fanotify недоступен; - остановить KESL при available memory менее 512 МБ, устойчивом swap IO, появлении host/container OOM, restart или провале smoke; - до режима `Block` требуется отдельное подтверждение стабильности. Перед production-внедрением повторить sizing и baseline на боевых ресурсах; test-профиль 512/1024 МБ автоматически не переносить. ## 1. Read-only preflight и baseline Команды разделены на небольшие блоки: сохраните вывод каждого блока в change record, предварительно проверив отсутствие секретов. Не публикуйте полный `docker inspect`, Compose config или environment. ### 1.1. Host и совместимость ```sh date -Is hostnamectl uname -a dpkg --print-architecture findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS / /var/lib/docker /tmp 2>/dev/null free -h swapon --show df -hT / /var/lib/docker /tmp df -ih / /var/lib/docker /tmp systemctl is-active docker fail2ban ufw dpkg-query -W -f='${Package}\t${Version}\t${Status}\n' \ kesl kesl-gui kav4fs 2>/dev/null || true ``` Проверка проходит только для `amd64`/поддерживаемой архитектуры, Ubuntu 24.04 LTS и поддерживаемого KESL ядра. Требования Kaspersky — минимум 2 ГБ RAM, 1 ГБ swap и 4 ГБ свободного диска, но этого недостаточно для данной ВМ: Compose-лимиты суммарно около 11,6 ГБ. При RAM менее 16 ГБ установка требует отдельного решения владельца сервиса о доступном запасе. ### 1.2. Docker и приложение ```sh docker info --format \ 'driver={{.Driver}} root={{.DockerRootDir}} containers={{.Containers}} running={{.ContainersRunning}}' /usr/local/sbin/han-vm1-compose ps docker ps --format \ 'table {{.Names}}\t{{.Status}}\t{{.Image}}' docker stats --no-stream --format \ 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.BlockIO}}\t{{.PIDs}}' ``` Сохраните список и состояние именованных volumes без содержимого: ```sh for volume in redis-data otel-queue nginx-cache; do docker volume ls --format '{{.Name}}' | while IFS= read -r name; do case "$name" in *"$volume"*) docker volume inspect --format \ '{{.Name}}\t{{.Mountpoint}}' "$name" ;; esac done done ``` В change record перенесите три фактических mountpoint. Не подставляйте предполагаемый Compose prefix. ### 1.3. Health, edge и firewall Под root на ВМ: ```sh systemctl --no-pager status \ han-secrets@production.service han-stack@production.service iptables -S HAN-CHAT-DOCKER iptables -L HAN-CHAT-DOCKER -n -v ufw status verbose journalctl --since '-30 min' --no-pager \ -u han-stack@production.service -p warning ``` С trusted external host выполните smoke из `deployment/RUNBOOK.production.ru.md`, раздел 10. Если запускается repository `deployment/scripts/smoke.sh`, он должен использовать штатный secret launcher; не печатайте resolved environment. Снимите из штатного observability baseline: - API request rate, 5xx и p50/p95/p99 latency; - Redis latency, blocked clients и memory; - container restart/OOM count; - host CPU, available RAM, swap, disk IO/IO wait; - OTEL exporter failures и queue depth. Без доступных baseline и rollback approver к установке не переходить. ## 2. Проверка пакета и подготовка GUI на сервер не устанавливается. Дистрибутив и DEB копируются в root-only staging `/root/kesl-install` и удаляются после приёмки. ISO в `/var/lib/han-deploy/incoming` не распаковывается на месте и не остаётся смонтированным после извлечения пакета. Для тестовой ВМ ожидаемый ISO: `049-16-d-01.iso`, volume id `KESL12SP4`. Вендор публикует контрольную сумму **ФИКС 2.0.2 / ГОСТ Р 34.11-94, программно**, а не SHA-256. Это разные алгоритмы: оба дают 64 hex-символа, поэтому `sha256sum --check` против суммы с сайта закономерно не совпадает. Ожидаемая сумма вендора (ГОСТ Р 34.11-94): ``` 6a94b16afad211e8b9be5ec86f5379184f2b3a9e5869843fe763e2796e5ac1d3 ``` Фактический SHA-256 полученного ISO (для локального учёта, не для сверки с сайтом ФИКС): ``` 8599a7ed8d7d661a70811d668e5f98e372b674c87ef4cd24abbd917625a2d5e5 ``` ```sh 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" command -v rhash || true openssl list -digest-algorithms 2>/dev/null | grep -i gost || true ``` Если доступен `rhash`, посчитайте ГОСТ и сравните с суммой вендора. ФИКС может использовать другой набор S-блоков/порядок байт, поэтому проверьте несколько вариантов: ```sh rhash --gost "$ISO" rhash --gost --gost-reverse "$ISO" rhash --gost-cryptopro "$ISO" rhash --gost-cryptopro --gost-reverse "$ISO" ``` Для ISO `049-16-d-01.iso` сумма вендора совпала с `rhash --gost`. Подлинность принимается, если совпала ГОСТ-сумма **или** одновременно выполнены все условия ниже: - volume id ISO = `KESL12SP4`; - внутри есть `kesl/kesl_12.4.0-1225_amd64.deb`; - SHA-256 ISO зафиксирован в evidence; - источник — официальный канал вендора. Файл `.sig` без доверенного публичного ключа не заменяет эту проверку. Только после совпадения хеша смонтируйте ISO только для чтения и найдите `kesl_*_amd64.deb` без GUI: ```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*' -o -iname '*.deb' \) | sort ``` Ожидается имя вида `kesl_12.4.0-*_amd64.deb`. Не копируйте `kesl-gui`, i386, arm64, RPM, KSC agent и Windows-пакеты. Если внутри только 12.0.x или нет amd64 DEB — stop: для Ubuntu 24.04 нужен KESL 12.4. ```sh install -m 0600 -o root -g root \ /root/kesl-install/kesl.deb dpkg-deb -f /root/kesl-install/kesl.deb Package Version Architecture umount /mnt/kesl-iso rmdir /mnt/kesl-iso ``` Не продолжайте при package name не `kesl`, неверной архитектуре или версии не 12.4.x. Перед установкой сохраните только безопасные snapshots: ```sh 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 ``` ## 3. Установка с отключённой защитой Установка изменяет host и выполняется только в maintenance window. ```sh apt-get install /root/kesl-install/kesl.deb ``` Создайте `/root/kesl-install/autoinstall.ini` с mode `0600`. Значения EULA, Privacy Policy и KSN должны быть осознанно согласованы с Security/Legal, а не скопированы механически: ```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 ``` Для Ubuntu AppArmor значение `CONFIGURE_SELINUX=No` ожидаемо. `UseFanotify` не требует сборки стороннего kernel module. Если выбран KSN, документируйте передачу данных и правовое основание. Первоначальная настройка: ```sh chmod 0600 /root/kesl-install/autoinstall.ini /opt/kaspersky/kesl/bin/kesl-setup.pl \ --autoinstall=/root/kesl-install/autoinstall.ini echo "kesl-setup exit=$?" # Exit 71 with INSTALL_LICENSE=None is expected: setup treats None as a # code. Do not rerun setup. Continue if kesl.service is active and # File_Threat_Protection is Stopped. systemctl --no-pager status kesl kesl-control --app-info kesl-control --supported-tech-info kesl-control --get-task-list ``` Активацию кодом выполняйте только после успешного `kesl-setup.pl` и до загрузки баз. Код не помещайте в `autoinstall.ini`, репозиторий, evidence, чат и историю shell: ```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 ``` Нужен исходящий доступ к серверам активации Kaspersky. В выводе лицензии оставьте только статус «ключ действителен» и срок; сам код не копируйте. ## 4. Ресурсные ограничения до первого scan В KESL 12.4 `ScanMemoryLimit` по умолчанию равен 8192 МБ, а `MaxMemory=auto` может разрешить до 50% доступной RAM. Для ВМ1 эти defaults не принимаются без измерений. Выберите значения по фактическому baseline: - constrained test VM, 4 ГБ RAM: `ScanMemoryLimit=512`, `MaxMemory=1024MB`, `OnDemandCPULimit=15`; только по разделу 0.1; - 16 ГБ RAM: начните с `ScanMemoryLimit=1024`, `MaxMemory=2048MB`; - 24–32 ГБ RAM: начните с `ScanMemoryLimit=2048`, `MaxMemory=4096MB`; - иной размер: согласуйте значения; `ScanMemoryLimit` должен быть ниже `MaxMemory`, а после резервирования KESL у приложения должен оставаться исходный запас. Сначала сохраните исходные настройки: ```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 ``` Установите CPU limit для ODS/ContainerScan: ```sh kesl-control --set-app-settings \ UseOnDemandCPULimit=Yes OnDemandCPULimit=<15_FOR_TEST_OR_APPROVED_VALUE> ``` Для изменения `ScanMemoryLimit` и `MaxMemory` следуйте официальной процедуре: остановите KESL, внесите значения в секцию `[General]` файла `/var/opt/kaspersky/kesl/common/kesl.ini`, затем запустите KESL. Не заменяйте файл целиком и не применяйте шаблон из репозитория как готовый конфиг. После запуска проверьте: ```sh systemctl is-active kesl kesl-control --get-app-settings kesl-control --app-info ``` ## 5. Обновление баз — АВЗ.2 Запустите предустановленную задачу Update (ID 6) и дождитесь результата: ```sh kesl-control --get-settings 6 kesl-control --get-schedule 6 kesl-control --start-task 6 -W kesl-control --get-task-state 6 kesl-control --app-info ``` Проверьте действующую лицензию, `Базы приложения загружены: Да`, свежую дату выпуска баз и успешное завершение Update. Затем задайте почасовой запуск: ```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 ``` Для 12.4 одного `RuleType=Hourly` недостаточно: нужен `StartTime` вида `2026/Sep/07 12:00:00;1` (английское имя месяца, интервал 1 час). `LC_ALL=C` обязателен, иначе локаль `ru_RU` подставит русское имя месяца. До успешного автообновления АВЗ.2 не принимается. Сразу после обновления повторите разделы 1.2–1.3. При деградации выполните rollback из раздела 11. ## 6. Исключения hot-data Исключения создаются только после получения фактических mountpoint в разделе 1.2. Разрешены три области: - `` — AOF/RDB; - `` — persistent telemetry queue; - `` — regenerable cache. До изменения экспортируйте параметры: ```sh kesl-control --get-settings 1 \ --file /root/kesl-install/file-threat.before.ini ``` Добавьте обычные исключения File Threat Protection: ```sh kesl-control --set-settings 1 \ --add-exclusion kesl-control --set-settings 1 \ --add-exclusion kesl-control --set-settings 1 \ --add-exclusion kesl-control --get-settings 1 ``` Не исключать: - весь `/var/lib/docker`, `/var/lib/docker/overlay2` или все volumes; - `/opt/han-chat/releases` и `/opt/han-chat/current`; - `/var/lib/han-deploy/incoming`; - `/etc/han`, `/run/han-chat`, `/etc/letsencrypt`; - `/tmp`, `/var/tmp`, `/root` или весь filesystem. Обычное исключение из scan может не исключить файловый перехват. Не создавайте bind mounts и не добавляйте `ExcludedMountPoint` в первой итерации. Это допустимо только если измерена деградация и Security письменно принял компенсацию плановой проверкой/container scan. ## 7. Пилот задач проверки Убедитесь, что все ODS/ContainerScan schedules, кроме Update, пока ручные: ```sh kesl-control --get-task-list kesl-control --get-schedule 2 kesl-control --get-schedule 18 kesl-control --set-schedule 2 RuleType=Manual kesl-control --set-schedule 18 RuleType=Manual ``` Идентификаторы подтвердите через `--get-task-list`; не применяйте команды, если тип задачи не совпадает. ### 7.1. Ограниченная on-demand проверка host Сначала проверьте небольшой immutable release, не корень filesystem: ```sh kesl-control --scan-file /opt/han-chat/current/backend \ --action Inform ``` В первом пилоте действие `Inform` не изменяет release. Проверьте результат, events, ресурсы и application health: ```sh kesl-control -E --query -n 100 --reverse kesl-control --get-statistic /usr/local/sbin/han-vm1-compose ps docker stats --no-stream ``` ### 7.2. Проверка контейнеров Перед scan снимите список running containers. Проверяйте по одному объекту, начиная с stateless/oneshot image, не Redis и не Keycloak: ```sh docker ps --format '{{.Names}}\t{{.Image}}' kesl-control --get-settings 19 kesl-control --scan-container ``` После успешного одиночного теста задачу `Container_Scan` (ID 18) можно назначить еженедельно в согласованное время. Перед этим проверьте параметры: по умолчанию `ContainerScanAction=StopContainerIfFailed`; production-контейнер не должен останавливаться из-за технической ошибки сканирования. Итоговое действие отдельно утверждает Security. Container scan после deploy выполняется только после завершения smoke, а не одновременно с pull/start/migrations. ## 8. Ступенчатое включение File Threat Protection — АВЗ.1 `DISABLE_PROTECTION=Yes` отключает компоненты после setup. До старта сохраните параметры и убедитесь, что `ScanArchived=No`: ```sh kesl-control --get-settings 1 kesl-control --get-task-state 1 ``` Для пилота запустите File Threat Protection. На Ubuntu 24.04 с `fanotify` параметр `InterceptorProtectionMode` **не поддерживается** (`Unsupported setting`): перехватчик работает в штатном блокирующем режиме на время проверки. Отдельный `Notify` недоступен; откат — остановка задачи 1. ```sh kesl-control --start-task 1 kesl-control --get-task-state 1 kesl-control --app-info ``` Пилот длится минимум 15–30 минут на constrained test VM и 2–4 часа на боевых ресурсах. Каждые 15 минут проверяйте метрики раздела 1, события KESL и firewall. АВЗ.1 выполняется при `Started` + `ActionOnThreat=DisinfectDeleteIfNotPossible`. Перед приёмкой: ```sh kesl-control --set-settings 1 \ ActionOnThreat=DisinfectDeleteIfNotPossible ScanArchived=No kesl-control --get-task-state 1 kesl-control --app-info ``` При latency/swap/unhealthy выполните `kesl-control --stop-task 1`. Не расширяйте исключения вслепую. Network Threat Protection, Firewall Management, Web Threat Protection и Behavior Detection не запускайте. ## 9. Приёмочный тест и evidence Тест EICAR выполняется только с письменным разрешением Security в отдельном безопасном каталоге, не в release, volume, backup, secret или upload path. Используйте официальную контрольную строку/файл с сайта EICAR/Kaspersky; этот репозиторий намеренно не содержит тестовый образец. До теста: ```sh install -d -m 0700 -o root -g root /root/kesl-eicar-test date -Is kesl-control --app-info kesl-control --get-task-state 1 ``` Ожидается блокирование/лечение/карантин и событие KESL. Не прикладывайте сам образец к evidence. Сохраните: ```sh kesl-control --app-info kesl-control --get-task-list kesl-control --get-settings 1 kesl-control --get-schedule 6 kesl-control -E --query -n 100 --reverse ``` Очистите тестовый каталог после подтверждения реакции. Копию EICAR в Backup удалите точечно, не весь Backup: ```sh kesl-control -B --query --reverse -n 20 kesl-control -B --mass-remove --query "DetectName == 'EICAR-Test-File'" ``` Заполните `deployment/kesl/EVIDENCE.AVZ.ru.md`. ## 10. Финальные проверки На ВМ: ```sh systemctl is-active kesl docker \ han-secrets@production.service han-stack@production.service kesl-control --app-info kesl-control --get-task-state 1 kesl-control --get-task-state 6 /usr/local/sbin/han-vm1-compose ps iptables -S HAN-CHAT-DOCKER ufw status verbose ``` С внешнего trusted host повторите production smoke и negative port probes. Сравните метрики минимум за 24 часа. Не выполняйте reboot только ради KESL. Если пакет/ядро явно запросили reboot, проведите его отдельным окном по reboot gate основного production-runbook. После приёмки удалите package/autoinstall и временные snapshots с ВМ только после переноса разрешённого evidence: ```sh rm -rf /root/kesl-install /root/kesl-eicar-test ``` ## 11. Rollback ### 11.1. До включения блокирующей защиты ```sh kesl-control --stop-task 1 2>/dev/null || true apt-get purge kesl systemctl daemon-reload systemctl restart han-chat-docker-firewall.service /usr/local/sbin/han-vm1-compose ps iptables -S HAN-CHAT-DOCKER ufw status verbose ``` Повторите smoke и resource checks. Docker и application stack без причины не перезапускайте. ### 11.2. При инциденте после включения Block Сначала минимально обратимое действие: ```sh kesl-control --stop-task 1 ``` Если управление KESL не отвечает: ```sh systemctl stop kesl ``` Затем восстановите доступность и соберите события. Полный `apt-get purge kesl` выполняйте только по решению change approver. Reboot — только если он требуется для удаления/ядра и есть отдельное окно. Нельзя выполнять `docker compose down -v`, удалять volumes, чистить Redis AOF, пересоздавать VM или менять firewall ради обхода проблемы KESL. ## 12. Эксплуатационный режим - Update (ID 6): каждый час; alert при ошибке или устаревании баз. - File Threat Protection (ID 1): постоянно, `Block`, `DisinfectDeleteIfNotPossible`, `ScanArchived=No`. - ODS: еженедельно в низкую нагрузку после подтверждения resource budget. - ContainerScan: еженедельно и после deploy, только после smoke. - Ежедневно: статус лицензии, компонентов, дата баз и ошибки KESL. - Ежемесячно: review исключений и фактической нагрузки. - После upgrade KESL/kernel/Docker: повтор пилота, smoke и evidence delta. Любое новое исключение должно иметь владельца, причину, срок пересмотра, компенсирующую проверку и подтверждение Security.