Files

289 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# KESL 12.4 standalone на ВМ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=<Yes_AFTER_APPROVAL>
PRIVACY_POLICY_AGREED=<Yes_AFTER_APPROVAL>
USE_KSN=<Yes_OR_No_AFTER_APPROVAL>
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=<APPROVED_VALUE>
```
`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 <REDIS_SAFETY_DATA_MOUNTPOINT>
kesl-control --set-settings 1 \
--add-exclusion <OTEL_QUEUE_MOUNTPOINT>
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.