Внедрение KESL на ВМ2 + замена CLAMAV на KESL
This commit is contained in:
@@ -0,0 +1,288 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user