# 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, затем один stateless image, затем File Threat Protection в `Notify`; - остановить 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 на сервер не устанавливается. Пакет передаётся в root-only staging, например `/root/kesl-install`, и удаляется после приёмки. ```sh install -d -m 0700 -o root -g root /root/kesl-install install -m 0600 -o root -g root \ /tmp/ /root/kesl-install/kesl.deb sha256sum /root/kesl-install/kesl.deb dpkg-deb -f /root/kesl-install/kesl.deb Package Version Architecture ``` Сравните SHA-256 с опубликованным/полученным по доверенному каналу значением. Не продолжайте при 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 test "$?" -eq 0 systemctl --no-pager status kesl kesl-control --app-info kesl-control --supported-tech-info kesl-control --get-task-list ``` Если используется activation code, не передавайте его аргументом команды и не храните в этом репозитории. Выполните активацию по официальной инструкции 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 kesl-control --set-schedule 6 RuleType=Hourly kesl-control --get-schedule 6 ``` Если установленная сборка требует интервал в `StartTime`, не угадывайте синтаксис: экспортируйте schedule и измените его по документации именно этой сборки. До успешного автообновления АВЗ.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 ``` Для пилота включите асинхронный режим перехватчика `Notify`, при котором KESL журналирует обнаружения, но не выполняет блокирующее действие: ```sh kesl-control --set-app-settings InterceptorProtectionMode=Notify kesl-control --start-task 1 kesl-control --get-task-state 1 ``` Пилот длится минимум 2–4 часа обычной нагрузки. Каждые 15 минут проверяйте метрики раздела 1 и события KESL. Не считайте этот режим конечной реализацией АВЗ.1: он не обеспечивает блокирование/лечение. Если пилот стабилен, в том же maintenance window: 1. проверьте, что `ActionOnThreat=DisinfectDeleteIfNotPossible`; 2. установите `InterceptorProtectionMode=Block`; 3. перезапустите task 1, если этого требует текущая сборка; 4. повторите health, smoke, firewall и resource checks. ```sh kesl-control --set-settings 1 \ ActionOnThreat=DisinfectDeleteIfNotPossible ScanArchived=No kesl-control --set-app-settings InterceptorProtectionMode=Block kesl-control --stop-task 1 kesl-control --start-task 1 kesl-control --get-task-state 1 kesl-control --app-info ``` В режиме `Block` доступ к файлу ожидает результат проверки. При появлении latency вернитесь в `Notify` либо остановите task 1 и выполните rollback; не расширяйте исключения вслепую. ## 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 ``` Очистите тестовый каталог после подтверждения реакции и заполните `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 --set-app-settings InterceptorProtectionMode=Notify ``` Если управление 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.