Поставка KESL на ВМ3
This commit is contained in:
@@ -24,6 +24,8 @@
|
|||||||
|
|
||||||
- [RUNBOOK.ru.md](docs/RUNBOOK.ru.md) — раскатка ВМ3, verify, firewall,
|
- [RUNBOOK.ru.md](docs/RUNBOOK.ru.md) — раскатка ВМ3, verify, firewall,
|
||||||
lockdown, обновление и rollback;
|
lockdown, обновление и rollback;
|
||||||
|
- [RUNBOOK.KESL.ru.md](docs/kesl/RUNBOOK.KESL.ru.md) — установка host KESL
|
||||||
|
12.4, АВЗ.1/АВЗ.2, отдельное окно;
|
||||||
- [NETWORK.md](docs/NETWORK.md) — сеть, группа безопасности, SSH-туннель;
|
- [NETWORK.md](docs/NETWORK.md) — сеть, группа безопасности, SSH-туннель;
|
||||||
- [BACKEND_OTLP.md](docs/BACKEND_OTLP.md) — передача телеметрии HAN Chat;
|
- [BACKEND_OTLP.md](docs/BACKEND_OTLP.md) — передача телеметрии HAN Chat;
|
||||||
- [SIGNOZ_RUNBOOK.md](docs/SIGNOZ_RUNBOOK.md) — ежедневная работа в UI и
|
- [SIGNOZ_RUNBOOK.md](docs/SIGNOZ_RUNBOOK.md) — ежедневная работа в UI и
|
||||||
|
|||||||
@@ -12,7 +12,9 @@
|
|||||||
Эксплуатация UI, разбор инцидентов и алерты — в
|
Эксплуатация UI, разбор инцидентов и алерты — в
|
||||||
[`SIGNOZ_RUNBOOK.md`](SIGNOZ_RUNBOOK.md). Подключение приложений —
|
[`SIGNOZ_RUNBOOK.md`](SIGNOZ_RUNBOOK.md). Подключение приложений —
|
||||||
[`BACKEND_OTLP.md`](BACKEND_OTLP.md). Сеть и группы безопасности —
|
[`BACKEND_OTLP.md`](BACKEND_OTLP.md). Сеть и группы безопасности —
|
||||||
[`NETWORK.md`](NETWORK.md).
|
[`NETWORK.md`](NETWORK.md). Установка host KESL 12.4 — отдельное окно,
|
||||||
|
[`kesl/RUNBOOK.KESL.ru.md`](kesl/RUNBOOK.KESL.ru.md); не совмещать с
|
||||||
|
раскаткой, lockdown или обновлением стека.
|
||||||
|
|
||||||
## 0. Назначение, инвентарь и stop conditions
|
## 0. Назначение, инвентарь и stop conditions
|
||||||
|
|
||||||
@@ -356,7 +358,9 @@ docker system df
|
|||||||
`casting.yaml` + `20-deploy-signoz.sh`.
|
`casting.yaml` + `20-deploy-signoz.sh`.
|
||||||
|
|
||||||
Обновление — break-glass по arch-06: временный исходящий HTTPS к Docker Hub,
|
Обновление — break-glass по arch-06: временный исходящий HTTPS к Docker Hub,
|
||||||
GitHub и SigNoz, минимальное окно, затем повтор lockdown.
|
GitHub и SigNoz, минимальное окно, затем повтор lockdown. Узкий egress
|
||||||
|
host KESL к серверам обновления Kaspersky задаётся runbook KESL и этим
|
||||||
|
окном не подменяется.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /opt/signoz
|
cd /opt/signoz
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
# Карта доказательств АВЗ.1 и АВЗ.2 для ВМ3 SigNoz
|
||||||
|
|
||||||
|
Заполняется оператором после `RUNBOOK.KESL.ru.md`. Не включать activation
|
||||||
|
code, ключи, токены, environment, персональные данные или тестовый файл
|
||||||
|
EICAR.
|
||||||
|
|
||||||
|
## 1. Изменение
|
||||||
|
|
||||||
|
- Change ID / окно:
|
||||||
|
- Оператор / approvers Security, Service, Operations:
|
||||||
|
- Hostname, Ubuntu, kernel, architecture:
|
||||||
|
- RAM / swap / свободный диск:
|
||||||
|
- KESL package/version, SHA-256 DEB, источник ISO, ГОСТ ISO:
|
||||||
|
- Коммерческая сборка не заявлена сертифицированной ФСТЭК: да / нет
|
||||||
|
- KSN decision и правовое основание:
|
||||||
|
- Egress окна установки (что открывали) и steady-state allow-list:
|
||||||
|
|
||||||
|
## 2. Baseline и stop conditions
|
||||||
|
|
||||||
|
- SigNoz containers healthy/running (`30-verify-signoz.sh`):
|
||||||
|
- OTLP `192.168.0.5:4317` с ВМ1/ВМ2:
|
||||||
|
- UI `127.0.0.1:8080/api/v1/health`:
|
||||||
|
- CPU, available RAM, swap, disk/IO wait:
|
||||||
|
- Restart/OOM ClickHouse, Keeper, PostgreSQL, SigNoz, ingester:
|
||||||
|
- Слушатели `8080/4317/4318` совпали с baseline:
|
||||||
|
- Утверждённые пороги и rollback approver:
|
||||||
|
|
||||||
|
## 3. АВЗ.1
|
||||||
|
|
||||||
|
Норма: Приказ ФСТЭК №21, приложение АВЗ.1; п. 8.6 — обнаружение
|
||||||
|
вредоносных программ/информации и реагирование.
|
||||||
|
|
||||||
|
- [ ] `kesl.service` active, лицензия действительна.
|
||||||
|
- [ ] File Threat Protection task 1 = `Started`.
|
||||||
|
- [ ] `ActionOnThreat=DisinfectDeleteIfNotPossible`, `ScanArchived=No`.
|
||||||
|
- [ ] fanotify; `InterceptorProtectionMode` не применялся (unsupported).
|
||||||
|
- [ ] Контролируемый EICAR обнаружен (OAS и/или ODS) и обработан.
|
||||||
|
- [ ] Событие detection/action есть в журнале KESL.
|
||||||
|
- [ ] Исключения ограничены фактическими mountpoint ClickHouse / Keeper /
|
||||||
|
PostgreSQL.
|
||||||
|
- [ ] `/var/lib/docker`, `/opt/signoz`, `/tmp` не исключены целиком.
|
||||||
|
- [ ] UFW и слушатели портов после Block без новых правил KESL.
|
||||||
|
- [ ] 24 часа без OOM/restart/unhealthy и неприемлемой деградации.
|
||||||
|
|
||||||
|
Артефакты/время/результат:
|
||||||
|
|
||||||
|
## 4. АВЗ.2
|
||||||
|
|
||||||
|
Норма: Приказ ФСТЭК №21, приложение АВЗ.2 — обновление базы признаков
|
||||||
|
вредоносных компьютерных программ.
|
||||||
|
|
||||||
|
- [ ] Update task 6 вручную завершилась успешно.
|
||||||
|
- [ ] Базы загружены, дата актуальна.
|
||||||
|
- [ ] Schedule = Hourly с `StartTime=...;1`.
|
||||||
|
- [ ] Наблюдён последующий автоматический successful update.
|
||||||
|
- [ ] После окна широкий egress закрыт; KLServers остаются в allow-list.
|
||||||
|
- [ ] Alert на update failure / unloaded / age >240h / license failure.
|
||||||
|
- [ ] Назначен ежедневный контроль и owner.
|
||||||
|
|
||||||
|
Артефакты/время последнего automatic update:
|
||||||
|
|
||||||
|
## 5. РСБ и АНЗ.2
|
||||||
|
|
||||||
|
- [ ] Определены события detection/remediation/update/license.
|
||||||
|
- [ ] Определены место/срок хранения и регламент просмотра.
|
||||||
|
- [ ] Версия KESL и upgrade lifecycle контролируются.
|
||||||
|
- [ ] Kernel/Docker/KESL upgrade требует compatibility pilot + evidence delta.
|
||||||
|
|
||||||
|
## 6. Исключения
|
||||||
|
|
||||||
|
Для каждого исключения: фактический mountpoint, владелец, причина, риск,
|
||||||
|
компенсирующая проверка, дата пересмотра.
|
||||||
|
|
||||||
|
- ClickHouse data:
|
||||||
|
- ClickHouse Keeper:
|
||||||
|
- PostgreSQL metastore:
|
||||||
|
- Иные (только с утверждением Security):
|
||||||
|
|
||||||
|
Лицензионное ограничение: Container Monitoring / Container Scan недоступны.
|
||||||
|
Scan-broker Message Safety на ВМ3 не устанавливается.
|
||||||
|
|
||||||
|
## 7. Rollback
|
||||||
|
|
||||||
|
- [ ] `kesl-control --stop-task 1` проверен документально.
|
||||||
|
- [ ] `systemctl stop kesl` доступен break-glass.
|
||||||
|
- [ ] `apt-get purge kesl` только по решению approver.
|
||||||
|
- [ ] Откат не использует `docker compose down -v` и не удаляет volumes.
|
||||||
|
- [ ] После отката предусмотрены `30-verify-signoz.sh`, OTLP и firewall checks.
|
||||||
|
|
||||||
|
## 8. Итоговая приёмка
|
||||||
|
|
||||||
|
- АВЗ.1:
|
||||||
|
- АВЗ.2:
|
||||||
|
- Ограничения/остаточные риски:
|
||||||
|
- Operations, ФИО/подпись/дата:
|
||||||
|
- Security, ФИО/подпись/дата:
|
||||||
|
- Service owner, ФИО/подпись/дата:
|
||||||
@@ -0,0 +1,717 @@
|
|||||||
|
# KESL 12.4 standalone на ВМ3 SigNoz
|
||||||
|
|
||||||
|
Операторский runbook для Ubuntu 24.04 ВМ3. Команды выполняет `root` или
|
||||||
|
персональная роль `admin` через `sudo` в отдельное maintenance window.
|
||||||
|
Репозиторий и скрипты Foundry KESL не устанавливают и не запускают.
|
||||||
|
|
||||||
|
Цели:
|
||||||
|
|
||||||
|
1. АВЗ.1: обнаружение и реагирование через host File Threat Protection.
|
||||||
|
2. АВЗ.2: автоматическое обновление баз с серверов Kaspersky.
|
||||||
|
|
||||||
|
На ВМ3 нет Message Safety и нет scan-broker. Container Monitoring этой
|
||||||
|
лицензией не покрыт — контейнерный мониторинг пропускаем, компенсируем host
|
||||||
|
File Threat Protection и точечным `scan-file`. Сеть, firewall management,
|
||||||
|
Web Threat Protection и Behavior Detection KESL не включаем.
|
||||||
|
|
||||||
|
KESL 12.4 commercial не заявляется как сертифицированная ФСТЭК сборка.
|
||||||
|
|
||||||
|
Раскатка SigNoz, lockdown и обновление стека — только в
|
||||||
|
[`../RUNBOOK.ru.md`](../RUNBOOK.ru.md). Это окно с ними не совмещать.
|
||||||
|
|
||||||
|
## 0. Approvals, egress и stop conditions
|
||||||
|
|
||||||
|
До окна зафиксировать change ID, оператора, Security/Service/Operations
|
||||||
|
approvers, hostname, ОС/ядро, RAM/swap/диск, package version/hash/source,
|
||||||
|
лицензию и rollback. EULA, Privacy Policy и KSN согласовать отдельно.
|
||||||
|
Activation code, ключи и secrets не помещать в репозиторий, историю shell,
|
||||||
|
chat или evidence.
|
||||||
|
|
||||||
|
Текущий инвентарь (подставьте актуальные значения):
|
||||||
|
|
||||||
|
| Узел | SSH | Приватный IP |
|
||||||
|
|---|---|---|
|
||||||
|
| ВМ3 SigNoz | `signoz-private` через jump | `192.168.0.5` |
|
||||||
|
|
||||||
|
Рабочий каталог SigNoz на ВМ: `/opt/signoz`. Compose:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
COMPOSE=/opt/signoz/pours/deployment/compose.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### 0.1. Egress на время окна
|
||||||
|
|
||||||
|
Исходящий доступ ВМ3 управляется файрволом (cloud SG / NAT policy), не
|
||||||
|
постоянным unrestricted internet. На это окно оператор **открывает**
|
||||||
|
исходящий HTTPS/DNS, достаточный для:
|
||||||
|
|
||||||
|
- активации лицензии Kaspersky;
|
||||||
|
- первого Update с `UPDATER_SOURCE=KLServers`;
|
||||||
|
- опционально `apt` (`rhash`) и загрузки EICAR с `secure.eicar.org`.
|
||||||
|
|
||||||
|
После приёмки общий интернет **не оставлять**. Для АВЗ.2 в steady state
|
||||||
|
оставить узкий allow-list к серверам обновления/активации Kaspersky
|
||||||
|
(имена, не застывшие IP) по
|
||||||
|
[приложению вендора](https://support.kaspersky.ru/kes-for-linux/12.4.0/316243).
|
||||||
|
Минимум для Update при `USE_KSN=No`:
|
||||||
|
|
||||||
|
- `s00.upd.kaspersky.com` … `s19.upd.kaspersky.com`, TCP 443;
|
||||||
|
- `downloads.upd.kaspersky.com`, TCP 443;
|
||||||
|
- серверы активации из того же приложения, TCP 443;
|
||||||
|
- рабочий системный DNS/NTP. Если системный DNS недоступен, KESL может
|
||||||
|
сам обратиться к публичным DNS (`8.8.8.8`, `1.1.1.1` и др.) — это
|
||||||
|
запрещено политикой ВМ3, поэтому resolver должен работать.
|
||||||
|
|
||||||
|
Проверка до активации и Update:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
getent hosts s00.upd.kaspersky.com downloads.upd.kaspersky.com
|
||||||
|
curl -4sS -o /dev/null -w '%{http_code}\n' --connect-timeout 8 --max-time 15 \
|
||||||
|
https://downloads.upd.kaspersky.com
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидается разрешение имён и HTTP `200`/`301`/`302`/`403`/`404`, не таймаут.
|
||||||
|
Если файрвол ещё закрыт — stop: не запускать `kesl-setup` активацию и task 6.
|
||||||
|
|
||||||
|
### 0.2. Stop conditions
|
||||||
|
|
||||||
|
Остановиться, если:
|
||||||
|
|
||||||
|
- ОС/архитектура/ядро отсутствуют в матрице KESL 12.4;
|
||||||
|
- установлен другой AV или неизвестный KESL;
|
||||||
|
- свободно менее 10 ГБ или нет рабочего swap;
|
||||||
|
- до установки есть unhealthy/restarting контейнеры SigNoz, OTLP `4317`
|
||||||
|
недоступен с ВМ1/ВМ2, UI `/api/v1/health` не отвечает;
|
||||||
|
- package hash/source не подтверждены, лицензия недействительна или базы
|
||||||
|
не загружены;
|
||||||
|
- после этапа: ClickHouse/PostgreSQL/SigNoz/ingester unhealthy или restart;
|
||||||
|
- available memory менее 512 МБ на 4 ГиБ RAM либо менее 1 ГиБ на ≥8 ГиБ;
|
||||||
|
- устойчивый swap IO, OOM, IO wait >10% за 5 минут;
|
||||||
|
- File Threat Protection изменил UFW/слушатели `8080/4317/4318`.
|
||||||
|
|
||||||
|
Не совмещать с `20-deploy-signoz.sh`, правкой `casting.yaml`, snapshot,
|
||||||
|
lockdown, TLS, Docker restart или host reboot.
|
||||||
|
|
||||||
|
## 1. Read-only baseline
|
||||||
|
|
||||||
|
Сохранить вывод каждого блока в change record без секретов, полного
|
||||||
|
`docker inspect` и Compose environment.
|
||||||
|
|
||||||
|
### 1.1. Host
|
||||||
|
|
||||||
|
```sh
|
||||||
|
date -Is
|
||||||
|
hostnamectl
|
||||||
|
uname -a
|
||||||
|
dpkg --print-architecture
|
||||||
|
findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS / /var/lib/docker /opt /tmp
|
||||||
|
free -h
|
||||||
|
swapon --show
|
||||||
|
df -hT / /var/lib/docker /opt /tmp
|
||||||
|
df -ih / /var/lib/docker /opt /tmp
|
||||||
|
systemctl is-active docker ufw
|
||||||
|
dpkg-query -W -f='${Package}\t${Version}\t${Status}\n' \
|
||||||
|
kesl kesl-gui kav4fs 2>/dev/null || true
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка только для `amd64`, Ubuntu 24.04 LTS и поддерживаемого ядра.
|
||||||
|
SigNoz на 4 ГиБ — constrained; для KESL лучше ≥8 ГиБ. Defaults
|
||||||
|
`ScanMemoryLimit=8192` и `MaxMemory=auto` на этой ВМ не принимать.
|
||||||
|
|
||||||
|
### 1.2. SigNoz и volumes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /opt/signoz
|
||||||
|
docker info --format \
|
||||||
|
'driver={{.Driver}} root={{.DockerRootDir}} containers={{.Containers}} running={{.ContainersRunning}}'
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps -a
|
||||||
|
docker stats --no-stream --format \
|
||||||
|
'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.BlockIO}}\t{{.PIDs}}'
|
||||||
|
curl -fsS --max-time 5 http://127.0.0.1:8080/api/v1/health
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
```
|
||||||
|
|
||||||
|
Снять фактические **host**-пути hot-data (поле `Source`). Prefix Compose и
|
||||||
|
путь внутри контейнера (`Destination`) в `--add-exclusion` не подставлять.
|
||||||
|
Как читать вывод и какие строки брать — раздел 6.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
for c in \
|
||||||
|
signoz-telemetrystore-clickhouse-0-0 \
|
||||||
|
signoz-telemetrykeeper-clickhousekeeper-0 \
|
||||||
|
signoz-metastore-postgres-0 \
|
||||||
|
signoz-signoz-0
|
||||||
|
do
|
||||||
|
echo "=== $c ==="
|
||||||
|
docker inspect --format \
|
||||||
|
'{{range .Mounts}}{{.Type}} {{.Name}} {{.Source}} -> {{.Destination}}{{println}}{{end}}' \
|
||||||
|
"$c"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
В change record — только host-пути данных ClickHouse, ClickHouse Keeper,
|
||||||
|
PostgreSQL metastore. Overlay2, `/opt/signoz` и `/tmp` не исключать.
|
||||||
|
|
||||||
|
### 1.3. Firewall и OTLP
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ufw status verbose
|
||||||
|
iptables-save | head
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
```
|
||||||
|
|
||||||
|
С ВМ1 (не ICMP):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
timeout 3 bash -c 'exec 3<>/dev/tcp/192.168.0.5/4317' \
|
||||||
|
&& echo 'OTLP gRPC reachable'
|
||||||
|
```
|
||||||
|
|
||||||
|
Без живого OTLP и healthy стека к установке не переходить.
|
||||||
|
|
||||||
|
## 2. Дистрибутив и установка
|
||||||
|
|
||||||
|
GUI, i386, RPM, KSC agent на сервер не ставятся. ISO не распаковывать в
|
||||||
|
`/opt/signoz` и не оставлять смонтированным.
|
||||||
|
|
||||||
|
Ожидаемый ISO пилота ВМ1/ВМ2: `049-16-d-01.iso`, volume id `KESL12SP4`,
|
||||||
|
DEB `kesl_12.4.0-1225_amd64.deb`. Хеши пилота не считать универсальными,
|
||||||
|
если пришёл другой носитель: записать фактические SHA-256 и ГОСТ.
|
||||||
|
|
||||||
|
Вендор публикует **ФИКС 2.0.2 / ГОСТ Р 34.11-94**, не SHA-256. Для ISO
|
||||||
|
`049-16-d-01.iso` сумма вендора совпала с `rhash --gost`:
|
||||||
|
|
||||||
|
```
|
||||||
|
6a94b16afad211e8b9be5ec86f5379184f2b3a9e5869843fe763e2796e5ac1d3
|
||||||
|
```
|
||||||
|
|
||||||
|
SHA-256 того же ISO (локальный учёт, не сверка с сайтом ФИКС):
|
||||||
|
|
||||||
|
```
|
||||||
|
8599a7ed8d7d661a70811d668e5f98e372b674c87ef4cd24abbd917625a2d5e5
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.1. Копирование на ВМ3
|
||||||
|
|
||||||
|
На ВМ заранее:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
install -d -m 0700 -o root -g root /var/lib/han-deploy/incoming
|
||||||
|
```
|
||||||
|
|
||||||
|
С рабочей станции через jump (`signoz-private` из
|
||||||
|
[`../RUNBOOK.ru.md`](../RUNBOOK.ru.md)):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
scp `
|
||||||
|
"C:\Users\MI\Documents\job\HAN_new_life\HANapp\docs\kes 12.4\049-16-d-01.iso" `
|
||||||
|
"C:\Users\MI\Documents\job\HAN_new_life\HANapp\docs\kes 12.4\049-16-d-01.sig" `
|
||||||
|
signoz-private:/var/lib/han-deploy/incoming/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2. Проверка ГОСТ и извлечение DEB
|
||||||
|
|
||||||
|
```sh
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y rhash
|
||||||
|
|
||||||
|
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"
|
||||||
|
rhash --gost "$ISO"
|
||||||
|
```
|
||||||
|
|
||||||
|
Если ГОСТ совпал — извлеките только amd64 DEB:
|
||||||
|
|
||||||
|
```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_*_amd64.deb' -o -iname '*.deb' \) |
|
||||||
|
sort
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидается: Package `kesl`, Version `12.4.x`, Architecture `amd64`.
|
||||||
|
`kesl-gui`, i386 и RPM не копировать.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
apt-get remove -y rhash
|
||||||
|
apt-get purge -y rhash
|
||||||
|
apt-get autoremove -y
|
||||||
|
```
|
||||||
|
|
||||||
|
Снимки до установки:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
test -f /etc/docker/daemon.json && \
|
||||||
|
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
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )' \
|
||||||
|
> /root/kesl-install/listeners.before
|
||||||
|
ls -l /root/kesl-install
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
apt-get install /root/kesl-install/kesl.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3. Первоначальная настройка без защиты
|
||||||
|
|
||||||
|
Значения EULA, Privacy Policy и KSN — после согласования, не механически.
|
||||||
|
Для этого окна, как на ВМ1/ВМ2: `USE_KSN=No`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
install -m 0600 -o root -g root /dev/null /root/kesl-install/autoinstall.ini
|
||||||
|
cat > /root/kesl-install/autoinstall.ini <<'EOF'
|
||||||
|
KSVLA_MODE=No
|
||||||
|
ENDPOINT_AGENT_MODE=No
|
||||||
|
EULA_AGREED=Yes
|
||||||
|
PRIVACY_POLICY_AGREED=Yes
|
||||||
|
USE_KSN=No
|
||||||
|
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
|
||||||
|
EOF
|
||||||
|
chmod 0600 /root/kesl-install/autoinstall.ini
|
||||||
|
stat -c '%U:%G:%a %n' /root/kesl-install/autoinstall.ini
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
/opt/kaspersky/kesl/bin/kesl-setup.pl \
|
||||||
|
--autoinstall=/root/kesl-install/autoinstall.ini
|
||||||
|
echo "kesl-setup exit=$?"
|
||||||
|
```
|
||||||
|
|
||||||
|
При `INSTALL_LICENSE=None` setup может вернуть 71. Не запускать повторно,
|
||||||
|
если `kesl.service` active и File Threat Protection Stopped.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl --no-pager --no-legend status kesl || true
|
||||||
|
kesl-control --app-info
|
||||||
|
kesl-control --get-task-list
|
||||||
|
free -h
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
curl -fsS --max-time 5 http://127.0.0.1:8080/api/v1/health
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидается: `kesl` запущен, задача 1 не `Started`, контейнеры healthy.
|
||||||
|
|
||||||
|
## 3. Resource budget до Update и FTP
|
||||||
|
|
||||||
|
Не стартовать Update (task 6) и File Threat Protection (task 1), пока не
|
||||||
|
срезаны дефолты памяти.
|
||||||
|
|
||||||
|
Стартовый кандидат:
|
||||||
|
|
||||||
|
- ≥8 ГиБ RAM: `ScanMemoryLimit=1024`, `MaxMemory=2048MB`,
|
||||||
|
`OnDemandCPULimit=15`;
|
||||||
|
- 4 ГиБ RAM: только по письменному решению владельца —
|
||||||
|
`ScanMemoryLimit=512`, `MaxMemory=1024MB`, `OnDemandCPULimit=15`;
|
||||||
|
full filesystem scan и архивы запрещены.
|
||||||
|
|
||||||
|
### 3.1. Снимок
|
||||||
|
|
||||||
|
```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
|
||||||
|
awk '/^\[General\]/,/^\[/' /var/opt/kaspersky/kesl/common/kesl.ini | head -n 40
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2. Лимит CPU (KESL ещё работает)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --set-app-settings \
|
||||||
|
UseOnDemandCPULimit=Yes OnDemandCPULimit=15
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3. Память — только при остановленном KESL
|
||||||
|
|
||||||
|
Файл целиком не подменять. Сначала смотрите `[General]` из шага 3.1.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl stop kesl
|
||||||
|
systemctl is-active kesl || true
|
||||||
|
|
||||||
|
grep -nE '^(ScanMemoryLimit|MaxMemory)=' \
|
||||||
|
/var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e 's/^ScanMemoryLimit=8192$/ScanMemoryLimit=1024/' \
|
||||||
|
-e 's/^MaxMemory=auto$/MaxMemory=2048MB/' \
|
||||||
|
/var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
|
||||||
|
grep -nE '^(ScanMemoryLimit|MaxMemory)=' \
|
||||||
|
/var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
|
||||||
|
systemctl start kesl
|
||||||
|
systemctl is-active kesl
|
||||||
|
kesl-control --get-app-settings | grep -iE \
|
||||||
|
'UseOnDemandCPULimit|OnDemandCPULimit|ScanMemoryLimit|MaxMemory'
|
||||||
|
free -h
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
На constrained 4 ГиБ замените значения в `sed` на `512` и `1024MB`.
|
||||||
|
|
||||||
|
Ожидаемо: `kesl.service` active; task 1 и 6 `Stopped`; базы ещё не
|
||||||
|
загружены; ClickHouse/SigNoz healthy.
|
||||||
|
|
||||||
|
## 4. Активация
|
||||||
|
|
||||||
|
Код не помещать в `autoinstall.ini`, репозиторий, evidence, чат и history.
|
||||||
|
Нужен открытый egress из раздела 0.1.
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
В evidence — только статус вроде `Active subscription` и срок, не GUID
|
||||||
|
ключа. Если лицензия `Inconsistent update` или недействительна — stop.
|
||||||
|
|
||||||
|
## 5. АВЗ.2 — базы
|
||||||
|
|
||||||
|
ID подтвердить через `--get-task-list` (Update = 6).
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --get-settings 6
|
||||||
|
kesl-control --start-task 6 -W
|
||||||
|
kesl-control --get-task-state 6
|
||||||
|
kesl-control --app-info --json
|
||||||
|
free -h
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
Если available RAM падает ниже порога раздела 0.2 или контейнер unhealthy:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --stop-task 6
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидается: Update завершилась, `Application databases loaded: Yes`.
|
||||||
|
|
||||||
|
Для 12.4 одного `RuleType=Hourly` недостаточно: нужен `StartTime` с
|
||||||
|
интервалом `;1` и `LC_ALL=C` (иначе `ru_RU` подставит русское имя месяца).
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
Если в `--app-info` есть
|
||||||
|
`Post-update actions: The application module has been updated. Restart
|
||||||
|
the application` — обязательный рестарт **до** запуска task 1:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl restart kesl
|
||||||
|
systemctl is-active kesl
|
||||||
|
kesl-control --app-info --json
|
||||||
|
grep -nE '^(ScanMemoryLimit|MaxMemory)=' \
|
||||||
|
/var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
kesl-control --get-app-settings | grep -iE \
|
||||||
|
'UseOnDemandCPULimit|OnDemandCPULimit'
|
||||||
|
kesl-control --get-schedule 6
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
kesl-control --get-task-state 6
|
||||||
|
```
|
||||||
|
|
||||||
|
До приёмки АВЗ.2 наблюдать хотя бы один автоматический hourly cycle при
|
||||||
|
уже суженном (не широком) egress. Alert: ошибка Update, базы старше
|
||||||
|
240 часов, базы не загружены, лицензия недействительна.
|
||||||
|
|
||||||
|
## 6. Исключения hot-data
|
||||||
|
|
||||||
|
KESL смотрит host filesystem. В `--add-exclusion` идёт `Source` (путь на
|
||||||
|
ВМ), обычно `/var/lib/docker/volumes/<имя>/_data`. `Destination` — путь
|
||||||
|
внутри контейнера, его KESL не видит. Prefix тома не угадывать.
|
||||||
|
|
||||||
|
Снять mounts ещё раз, если baseline раздела 1.2 уже не под рукой:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps --format '{{.Name}}'
|
||||||
|
|
||||||
|
for c in \
|
||||||
|
signoz-telemetrystore-clickhouse-0-0 \
|
||||||
|
signoz-telemetrykeeper-clickhousekeeper-0 \
|
||||||
|
signoz-metastore-postgres-0
|
||||||
|
do
|
||||||
|
echo "=== $c ==="
|
||||||
|
docker inspect --format \
|
||||||
|
'{{range .Mounts}}{{if eq .Type "volume"}}{{.Source}} dest={{.Destination}} vol={{.Name}}{{println}}{{end}}{{end}}' \
|
||||||
|
"$c"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
Какой `Source` брать — снято на этой ВМ3:
|
||||||
|
|
||||||
|
| Контейнер | `dest=` | Host-путь для `--add-exclusion` |
|
||||||
|
|---|---|---|
|
||||||
|
| `signoz-telemetrystore-clickhouse-0-0` | `/var/lib/clickhouse` | `/var/lib/docker/volumes/signoz-telemetrystore-0-0-data/_data` |
|
||||||
|
| `signoz-telemetrykeeper-clickhousekeeper-0` | `/var/lib/clickhouse-keeper` | `/var/lib/docker/volumes/signoz-telemetrykeeper-0-data/_data` |
|
||||||
|
| `signoz-metastore-postgres-0` | `/var/lib/postgresql/data` | `/var/lib/docker/volumes/signoz-metastore-postgres-0-data/_data` |
|
||||||
|
|
||||||
|
Не добавлять в этом окне:
|
||||||
|
|
||||||
|
- `signoz-telemetrystore-user-scripts` — скрипты, не hot-data ClickHouse;
|
||||||
|
- анонимный том Keeper
|
||||||
|
`29bd76fc40766c8bbf2f584040e75b4f3cab02052fcf67541777c4f9340dbc84`
|
||||||
|
(`dest=/var/lib/clickhouse` у keeper). Если начнёт расти (`du -sh`
|
||||||
|
этого `_data`) — отдельное решение Security, не расширять список вслепую.
|
||||||
|
|
||||||
|
Проверка тома:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker volume inspect --format '{{.Name}} {{.Mountpoint}}' \
|
||||||
|
signoz-telemetrystore-0-0-data \
|
||||||
|
signoz-telemetrykeeper-0-data \
|
||||||
|
signoz-metastore-postgres-0-data
|
||||||
|
```
|
||||||
|
|
||||||
|
`Mountpoint` обязан совпасть с путями ниже. Не исключать `/var/lib/docker`,
|
||||||
|
`overlay2`, `/opt/signoz`, `/var/lib/han-deploy/incoming`, `/tmp`, `/root`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --get-settings 1 \
|
||||||
|
--file /root/kesl-install/file-threat.before.ini
|
||||||
|
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/signoz-telemetrystore-0-0-data/_data
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/signoz-telemetrykeeper-0-data/_data
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/signoz-metastore-postgres-0-data/_data
|
||||||
|
kesl-control --set-settings 1 ScanArchived=No
|
||||||
|
kesl-control --get-settings 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Каждое исключение: владелец, причина (write-hot telemetry/metadata),
|
||||||
|
компенсация (FTP вне volume + периодический `scan-file` host-дерева
|
||||||
|
`/opt/signoz/scripts`), срок пересмотра, подтверждение Security.
|
||||||
|
|
||||||
|
## 7. Узкий on-demand scan-file
|
||||||
|
|
||||||
|
ODS schedules, кроме Update, оставить Manual. Не сканировать volumes
|
||||||
|
ClickHouse/PostgreSQL и не запускать Container Scan.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --get-task-list
|
||||||
|
kesl-control --get-schedule 2
|
||||||
|
kesl-control --set-schedule 2 RuleType=Manual
|
||||||
|
kesl-control --scan-file /opt/signoz/scripts --action Inform
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
free -h
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидается: scan-file без ошибок, FTP всё ещё Stopped, стек healthy.
|
||||||
|
Если вырос swap или unhealthy — остановить scan и не включать task 1.
|
||||||
|
|
||||||
|
## 8. Host protection — АВЗ.1
|
||||||
|
|
||||||
|
На Ubuntu 24.04 с fanotify параметр `InterceptorProtectionMode` **не
|
||||||
|
поддерживается**. Штатный режим — блокировка на время проверки. Откат:
|
||||||
|
`kesl-control --stop-task 1`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
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
|
||||||
|
kesl-control --app-info --json
|
||||||
|
free -h
|
||||||
|
docker stats --no-stream --format \
|
||||||
|
'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}'
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
ufw status verbose
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
```
|
||||||
|
|
||||||
|
Пилот: каждые 15 минут — health, OTLP, RAM/swap, события KESL, firewall.
|
||||||
|
При деградации: `kesl-control --stop-task 1`. Не расширять исключения
|
||||||
|
вслепую.
|
||||||
|
|
||||||
|
## 9. Приёмочный EICAR
|
||||||
|
|
||||||
|
EICAR только с письменным разрешением Security. Образец не класть в git,
|
||||||
|
chat и evidence. Каталог не в docker volume, `/tmp`, `/opt/signoz/pours`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
install -d -m 0700 -o root -g root /root/kesl-eicar-test
|
||||||
|
date -Is
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
curl -fsSL -o /root/kesl-eicar-test/eicar.com \
|
||||||
|
'https://secure.eicar.org/eicar.com'
|
||||||
|
chmod 0600 /root/kesl-eicar-test/eicar.com
|
||||||
|
ls -l /root/kesl-eicar-test
|
||||||
|
kesl-control -E --query -n 20 --reverse
|
||||||
|
```
|
||||||
|
|
||||||
|
Если OAS на запись молчит (как на пилоте ВМ1) — явный ODS:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --scan-file /root/kesl-eicar-test/eicar.com \
|
||||||
|
--action DisinfectDeleteIfNotPossible
|
||||||
|
kesl-control -E --query -n 20 --reverse
|
||||||
|
ls -la /root/kesl-eicar-test
|
||||||
|
```
|
||||||
|
|
||||||
|
Уборка (не весь Backup):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control -B --query --reverse -n 20
|
||||||
|
kesl-control -B --mass-remove --query "DetectName == 'EICAR-Test-File'"
|
||||||
|
rm -rf /root/kesl-eicar-test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. Приёмка стека и сужение egress
|
||||||
|
|
||||||
|
На ВМ3:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl is-active kesl docker
|
||||||
|
kesl-control --app-info
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
kesl-control --get-task-state 6
|
||||||
|
kesl-control --get-schedule 6
|
||||||
|
cd /opt/signoz
|
||||||
|
./scripts/30-verify-signoz.sh
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
ufw status verbose
|
||||||
|
diff -u /root/kesl-install/ufw.before <(ufw status verbose) || true
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
free -h
|
||||||
|
swapon --show
|
||||||
|
df -hT / /opt /var/lib/docker
|
||||||
|
```
|
||||||
|
|
||||||
|
С ВМ1 повторить TCP `4317`. Слушатели `8080` только на `127.0.0.1`,
|
||||||
|
`4317/4318` только на `192.168.0.5`. Сравнить UFW с baseline: новых
|
||||||
|
правил KESL быть не должно.
|
||||||
|
|
||||||
|
24 часа: без OOM/restart/unhealthy, hourly Update сам зелёный, диск
|
||||||
|
ClickHouse не упёрся в stop-порог.
|
||||||
|
|
||||||
|
После gates:
|
||||||
|
|
||||||
|
1. закрыть широкий internet egress окна установки;
|
||||||
|
2. оставить DNS/NTP и узкий allow-list Kaspersky из раздела 0.1;
|
||||||
|
3. не открывать ingress `8080/4317/4318` из интернета;
|
||||||
|
4. ISO/DEB из `/var/lib/han-deploy/incoming` и `/root/kesl-install`
|
||||||
|
удалить только после переноса разрешённого evidence.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rm -rf /root/kesl-eicar-test
|
||||||
|
# после копирования evidence:
|
||||||
|
# rm -rf /root/kesl-install
|
||||||
|
# rm -f /var/lib/han-deploy/incoming/049-16-d-01.iso \
|
||||||
|
# /var/lib/han-deploy/incoming/049-16-d-01.sig
|
||||||
|
```
|
||||||
|
|
||||||
|
Не выполнять reboot только ради KESL.
|
||||||
|
|
||||||
|
## 11. Evidence
|
||||||
|
|
||||||
|
Заполнить [`EVIDENCE.AVZ.ru.md`](EVIDENCE.AVZ.ru.md) без activation code,
|
||||||
|
secrets, file bytes, полного checksum и EICAR.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl is-active kesl
|
||||||
|
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
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
## 12. Rollback
|
||||||
|
|
||||||
|
Сначала минимально обратимое:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --stop-task 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Если KESL не отвечает:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl stop kesl
|
||||||
|
```
|
||||||
|
|
||||||
|
`apt-get purge kesl` — только по решению approver. Затем:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl daemon-reload
|
||||||
|
cd /opt/signoz
|
||||||
|
./scripts/30-verify-signoz.sh
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
ufw status verbose
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
```
|
||||||
|
|
||||||
|
Запрещено: `docker compose down -v`, `docker volume prune`,
|
||||||
|
`docker system prune --volumes`, удаление volumes ClickHouse/PostgreSQL,
|
||||||
|
правка `pours/` или смена firewall ради обхода KESL.
|
||||||
|
|
||||||
|
После rollback повторить OTLP с ВМ1 и зафиксировать incident.
|
||||||
|
|
||||||
|
## 13. Эксплуатационный режим
|
||||||
|
|
||||||
|
- Update (ID 6): каждый час; нужен постоянный узкий egress к KLServers.
|
||||||
|
- File Threat Protection (ID 1): постоянно,
|
||||||
|
`DisinfectDeleteIfNotPossible`, `ScanArchived=No`.
|
||||||
|
- ODS: по согласованию в низкую нагрузку; не полный диск и не volumes БД.
|
||||||
|
- ContainerScan: не использовать при текущей лицензии.
|
||||||
|
- Ежедневно: лицензия, task 1 `Started`, дата баз, ошибки KESL, health
|
||||||
|
SigNoz, свободное место `/opt`.
|
||||||
|
- После upgrade KESL/kernel/Docker: повтор пилота и evidence delta.
|
||||||
|
|
||||||
|
Обновление образов SigNoz (`20-deploy-signoz.sh`) — отдельное break-glass
|
||||||
|
окно; его egress к Docker Hub/GitHub не заменяет allow-list KESL.
|
||||||
@@ -1,5 +1,262 @@
|
|||||||
# Ставим KES на ВМ1
|
# Ставим KES на ВМ1
|
||||||
|
|
||||||
|
Копируем на диск:
|
||||||
|
scp "C:\Users\MI\Documents\job\HAN_new_life\HANapp\docs\kes 12.4\049-16-d-01.iso" "C:\Users\MI\Documents\job\HAN_new_life\HANapp\docs\kes 12.4\049-16-d-01.sig" prodVM1Deploy:/var/lib/han-deploy/incoming/
|
||||||
|
|
||||||
|
apt install rhash
|
||||||
|
|
||||||
|
ISO='/var/lib/han-deploy/incoming/049-16-d-01.iso'
|
||||||
|
command -v rhash
|
||||||
|
rhash --gost "$ISO"
|
||||||
|
|
||||||
|
ГОСТ совпал: rhash --gost дал ту же сумму, что на сайте вендора. ISO подлинный.
|
||||||
|
6a94b16afad211e8b9be5ec86f5379184f2b3a9e5869843fe763e2796e5ac1d3
|
||||||
|
|
||||||
|
sudo apt remove -y rhash
|
||||||
|
sudo apt purge -y rhash
|
||||||
|
|
||||||
|
Дальше только копирование нужного DEB и снимки. GUI, i386 и RPM не трогайте. Установку ещё не запускайте.
|
||||||
|
```sh
|
||||||
|
ISO='/var/lib/han-deploy/incoming/049-16-d-01.iso'
|
||||||
|
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'
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
`apt-get install /root/kesl-install/kesl.deb`
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
ls -l /root/kesl-install
|
||||||
|
|
||||||
|
Ожидается: Package: kesl, Version: 12.4.0-1225, Architecture: amd64.
|
||||||
|
|
||||||
|
Дальше установка с выключенной защитой, без кода активации и без сканирования.
|
||||||
|
Перед командами явно примите EULA и политику конфиденциальности Kaspersky. KSN для этого пилота выключаем (USE_KSN=No).
|
||||||
|
|
||||||
|
```sh
|
||||||
|
install -m 0600 -o root -g root /dev/null /root/kesl-install/autoinstall.ini
|
||||||
|
cat >/root/kesl-install/autoinstall.ini <<'EOF'
|
||||||
|
KSVLA_MODE=No
|
||||||
|
ENDPOINT_AGENT_MODE=No
|
||||||
|
EULA_AGREED=Yes
|
||||||
|
PRIVACY_POLICY_AGREED=Yes
|
||||||
|
USE_KSN=No
|
||||||
|
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
|
||||||
|
EOF
|
||||||
|
chmod 0600 /root/kesl-install/autoinstall.ini
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
/opt/kaspersky/kesl/bin/kesl-setup.pl \
|
||||||
|
--autoinstall=/root/kesl-install/autoinstall.ini
|
||||||
|
echo "kesl-setup exit=$?"
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl --no-pager --no-legend status kesl || true
|
||||||
|
kesl-control --app-info
|
||||||
|
kesl-control --get-task-list
|
||||||
|
free -h
|
||||||
|
/usr/local/sbin/han-vm1-compose ps
|
||||||
|
docker stats --no-stream --format \
|
||||||
|
'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидается: служба kesl запущена, File Threat Protection не в Started, контейнеры healthy, available RAM не уходит ниже ~512 МБ.
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
systemctl stop kesl
|
||||||
|
python3 - <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
path = Path("/var/opt/kaspersky/kesl/common/kesl.ini")
|
||||||
|
text = path.read_text(encoding="utf-8")
|
||||||
|
if "[General]" not in text:
|
||||||
|
raise SystemExit("no [General] section in kesl.ini")
|
||||||
|
wanted = {"ScanMemoryLimit": "1024", "MaxMemory": "2048MB"}
|
||||||
|
lines = text.splitlines()
|
||||||
|
in_general = False
|
||||||
|
seen = set()
|
||||||
|
out = []
|
||||||
|
for line in lines:
|
||||||
|
stripped = line.strip()
|
||||||
|
if stripped.startswith("[") and stripped.endswith("]"):
|
||||||
|
in_general = stripped == "[General]"
|
||||||
|
if in_general and "=" in stripped and not stripped.startswith("#"):
|
||||||
|
key = stripped.split("=", 1)[0].strip()
|
||||||
|
if key in wanted:
|
||||||
|
out.append(f"{key}={wanted[key]}")
|
||||||
|
seen.add(key)
|
||||||
|
continue
|
||||||
|
out.append(line)
|
||||||
|
if seen != set(wanted):
|
||||||
|
rebuilt = []
|
||||||
|
inserted = False
|
||||||
|
in_general = False
|
||||||
|
for line in out:
|
||||||
|
stripped = line.strip()
|
||||||
|
rebuilt.append(line)
|
||||||
|
if stripped.startswith("[") and stripped.endswith("]"):
|
||||||
|
if in_general and not inserted:
|
||||||
|
for key, value in wanted.items():
|
||||||
|
if key not in seen:
|
||||||
|
rebuilt.insert(-1, f"{key}={value}")
|
||||||
|
inserted = True
|
||||||
|
in_general = stripped == "[General]"
|
||||||
|
if in_general and not inserted:
|
||||||
|
for key, value in wanted.items():
|
||||||
|
if key not in seen:
|
||||||
|
rebuilt.append(f"{key}={value}")
|
||||||
|
out = rebuilt
|
||||||
|
path.write_text("\n".join(out) + "\n", encoding="utf-8")
|
||||||
|
print("updated ScanMemoryLimit/MaxMemory")
|
||||||
|
PY
|
||||||
|
grep -E '^(ScanMemoryLimit|MaxMemory)=' /var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
systemctl start kesl
|
||||||
|
systemctl is-active kesl
|
||||||
|
kesl-control --set-app-settings UseOnDemandCPULimit=Yes OnDemandCPULimit=15
|
||||||
|
free -h
|
||||||
|
swapon --show
|
||||||
|
|
||||||
|
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
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
|
free -h
|
||||||
|
kesl-control --start-task 6 -W
|
||||||
|
kesl-control --get-task-state 6
|
||||||
|
kesl-control --app-info
|
||||||
|
free -h
|
||||||
|
/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
|
Ожидается ровно одна строка MaxMemory=1024MB, Update завершилась, Application databases loaded: Yes, лицензия не Inconsistent update. Если available RAM < 512 МБ или контейнер unhealthy — остановите Update (kesl-control --stop-task 6) и пришлите вывод. GUID ключа в следующий лог лучше не включать.
|
||||||
|
|
||||||
|
|
||||||
|
Базы загружены, ключ действителен, File Threat Protection доступна и остановлена, сервисы HAN healthy. АВЗ.2 по сути закрыта после почасового Update.
|
||||||
|
|
||||||
|
Вендор просит перезапуск KESL после обновления модуля. Container Monitoring этой лицензией не покрыт — контейнерный мониторинг пропускаем, компенсируем host File Threat Protection и точечным scan-file.
|
||||||
|
|
||||||
|
Сеть/firewall KESL не включаем. Сначала restart, расписание Update и исключения hot-data.
|
||||||
|
|
||||||
|
systemctl restart kesl
|
||||||
|
systemctl is-active kesl
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
kesl-control --get-settings 1 \
|
||||||
|
--file /root/kesl-install/file-threat.before.ini
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/han-chat_redis-data/_data
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/han-chat_otel-queue/_data
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/han-chat_nginx-cache/_data
|
||||||
|
kesl-control --set-settings 1 ScanArchived=No
|
||||||
|
kesl-control --get-settings 1
|
||||||
|
|
||||||
|
free -h
|
||||||
|
/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
|
|
||||||
|
Ожидается: Post-update actions: No action required, базы загружены, FTP Stopped, RuleType=Hourly, в настройках задачи 1 три исключения и ScanArchived=No. Пришлите вывод.
|
||||||
|
|
||||||
|
Исключения приняты, сервисы healthy. Почасовой Update не применился: 12.4 требует StartTime с интервалом, иначе остаётся Manual.
|
||||||
|
|
||||||
|
Сначала расписание, затем узкий scan-file без изменения файлов. File Threat Protection пока не запускаем.
|
||||||
|
|
||||||
|
kesl-control --get-schedule 6
|
||||||
|
|
||||||
|
kesl-control --scan-file /opt/han-chat/current/backend --action Inform
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
free -h
|
||||||
|
/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
|
Ожидается: RuleType=Hourly и StartTime=...;1, scan-file без ошибок, FTP Stopped, контейнеры healthy. Если scan-file сильно поднимет swap или появятся unhealthy — остановите его и пришлите вывод.
|
||||||
|
|
||||||
|
Расписание Update почасовое, узкий scan-file прошёл чисто (421 объект, 0 угроз), swap не вырос, сервисы healthy.
|
||||||
|
|
||||||
|
Дальше File Threat Protection в режиме Notify: обнаружения пишутся в журнал, файлы не блокируются. Сеть/firewall KESL и Behavior Detection не включаем. Container scan этой лицензией недоступен — пропускаем.
|
||||||
|
|
||||||
|
kesl-control --set-app-settings InterceptorProtectionMode=Notify
|
||||||
|
kesl-control --start-task 1
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
kesl-control --app-info --json
|
||||||
|
free -h
|
||||||
|
docker stats --no-stream --format \
|
||||||
|
'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}'
|
||||||
|
/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
iptables -S HAN-CHAT-DOCKER
|
||||||
|
|
||||||
|
|
||||||
|
File Threat Protection уже Running, сервисы healthy, firewall не тронут. InterceptorProtectionMode на fanotify в 12.4 не существует — штатный режим и есть блокировка на время проверки. Для АВЗ.1 это достаточный путь; откат: kesl-control --stop-task 1.
|
||||||
|
|
||||||
|
Дальше контролируемый EICAR. Образец в чат после теста не копируйте.
|
||||||
|
```sh
|
||||||
|
install -d -m 0700 -o root -g root /root/kesl-eicar-test
|
||||||
|
printf '%s' 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \
|
||||||
|
> /root/kesl-eicar-test/eicar.com
|
||||||
|
ls -l /root/kesl-eicar-test
|
||||||
|
kesl-control --scan-file /root/kesl-eicar-test --action DisinfectDeleteIfNotPossible
|
||||||
|
kesl-control -E --query -n 30 --reverse
|
||||||
|
ls -la /root/kesl-eicar-test
|
||||||
|
rm -rf /root/kesl-eicar-test
|
||||||
|
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
kesl-control --get-schedule 6
|
||||||
|
free -h
|
||||||
|
/usr/local/sbin/han-vm1-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -387,8 +644,8 @@ allow 10.0.0.11;
|
|||||||
deny all;
|
deny all;
|
||||||
|
|
||||||
Переключить только Message Safety
|
Переключить только Message Safety
|
||||||
|
```sh
|
||||||
cd /opt/han-chat/services/
|
cd /opt/han-chat/services/
|
||||||
|
|
||||||
deployment/preflight.sh
|
deployment/preflight.sh
|
||||||
/usr/local/sbin/han-vm2-compose config --quiet
|
/usr/local/sbin/han-vm2-compose config --quiet
|
||||||
|
|
||||||
@@ -397,6 +654,19 @@ deployment/preflight.sh
|
|||||||
|
|
||||||
/usr/local/sbin/han-vm2-compose ps
|
/usr/local/sbin/han-vm2-compose ps
|
||||||
/usr/local/sbin/han-vm2-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
/usr/local/sbin/han-vm2-compose ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
HUP NGINX
|
||||||
|
```sh
|
||||||
|
/usr/local/sbin/han-vm2-compose exec -T nginx nginx -t -c /etc/nginx/nginx.conf
|
||||||
|
NGINX_ID=$(/usr/local/sbin/han-vm2-compose ps --status running --quiet nginx)
|
||||||
|
docker kill --signal HUP "$NGINX_ID"
|
||||||
|
|
||||||
|
/usr/local/sbin/han-vm2-compose exec -T nginx getent hosts message-safety-api
|
||||||
|
/usr/local/sbin/han-vm2-compose exec -T message-safety-api \
|
||||||
|
python -c 'import json,urllib.request; print(json.dumps(json.load(urllib.request.urlopen("http://127.0.0.1:8080/health/ready")), indent=2))'
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Тестирование:
|
Тестирование:
|
||||||
|
|
||||||
@@ -600,9 +870,11 @@ kesl-control --get-schedule 6
|
|||||||
|
|
||||||
curl --fail --silent --show-error \
|
curl --fail --silent --show-error \
|
||||||
--cacert /etc/han/ca/vm2-internal-ca.crt \
|
--cacert /etc/han/ca/vm2-internal-ca.crt \
|
||||||
|
https://prodhanservice.ihan.ru:8443/internal/safety/status
|
||||||
|
|
||||||
|
|
||||||
https://processing.internal:8443/internal/safety/status
|
https://processing.internal:8443/internal/safety/status
|
||||||
|
|
||||||
https://prodhanservice.ihan.ru:8443/internal/safety/status
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Cutover (только после 1–5)
|
### Cutover (только после 1–5)
|
||||||
@@ -645,3 +917,423 @@ docker kill --signal HUP "$NGINX_ID"
|
|||||||
Старый signature-CDN egress закрывается отдельно в firewall/SG — не через `compose down -v`.
|
Старый signature-CDN egress закрывается отдельно в firewall/SG — не через `compose down -v`.
|
||||||
|
|
||||||
На этом DEV-хосте (3.8 ГиБ, swap 391 МиБ) пункт 3 и file-EICAR через Safety лучше не совмещать с чем-то ещё. Если нужно, могу выписать только gate 1+2 компактным блоком под копирование в `260907_1.md`.
|
На этом DEV-хосте (3.8 ГиБ, swap 391 МиБ) пункт 3 и file-EICAR через Safety лучше не совмещать с чем-то ещё. Если нужно, могу выписать только gate 1+2 компактным блоком под копирование в `260907_1.md`.
|
||||||
|
|
||||||
|
# Ставим KESL на ВМ1
|
||||||
|
|
||||||
|
Копируем на диск:
|
||||||
|
scp -i C:\Users\MI\.ssh\prodHan "C:\Users\MI\Documents\job\HAN_new_life\HANapp\docs\kes 12.4\049-16-d-01.iso" "C:\Users\MI\Documents\job\HAN_new_life\HANapp\docs\kes 12.4\049-16-d-01.sig" root@185.31.164.97:/tmp/
|
||||||
|
|
||||||
|
|
||||||
|
apt install rhash
|
||||||
|
ISO='/tmp/049-16-d-01.iso'
|
||||||
|
command -v rhash
|
||||||
|
rhash --gost "$ISO"
|
||||||
|
|
||||||
|
ГОСТ совпал: rhash --gost дал ту же сумму, что на сайте вендора. ISO подлинный.
|
||||||
|
6a94b16afad211e8b9be5ec86f5379184f2b3a9e5869843fe763e2796e5ac1d3
|
||||||
|
|
||||||
|
sudo apt remove -y rhash
|
||||||
|
sudo apt purge -y rhash
|
||||||
|
|
||||||
|
Подготовка
|
||||||
|
```sh
|
||||||
|
free -h
|
||||||
|
swapon --show
|
||||||
|
df -hT / /var/lib/docker /opt /tmp
|
||||||
|
df -ih / /var/lib/docker /opt /tmp
|
||||||
|
systemctl is-active docker ufw
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.2. SigNoz и volumes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /opt/signoz
|
||||||
|
docker info --format \
|
||||||
|
'driver={{.Driver}} root={{.DockerRootDir}} containers={{.Containers}} running={{.ContainersRunning}}'
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps -a
|
||||||
|
docker stats --no-stream --format \
|
||||||
|
'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.BlockIO}}\t{{.PIDs}}'
|
||||||
|
curl -fsS --max-time 5 http://127.0.0.1:8080/api/v1/health
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
```
|
||||||
|
|
||||||
|
Снять фактические mountpoint hot-data. Prefix Compose не угадывать:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
for c in \
|
||||||
|
signoz-telemetrystore-clickhouse-0-0 \
|
||||||
|
signoz-telemetrykeeper-clickhousekeeper-0 \
|
||||||
|
signoz-metastore-postgres-0 \
|
||||||
|
signoz-signoz-0
|
||||||
|
do
|
||||||
|
echo "=== $c ==="
|
||||||
|
docker inspect --format \
|
||||||
|
'{{range .Mounts}}{{.Type}} {{.Name}} {{.Source}} -> {{.Destination}}{{println}}{{end}}' \
|
||||||
|
"$c"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
В change record перенести только host-пути данных ClickHouse, ClickHouse
|
||||||
|
Keeper, PostgreSQL metastore и, если есть отдельный volume приложения
|
||||||
|
SigNoz. Overlay2, `/opt/signoz` и `/tmp` в исключения не входят.
|
||||||
|
|
||||||
|
### 1.3. Firewall и OTLP
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ufw status verbose
|
||||||
|
iptables-save | head
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
```
|
||||||
|
|
||||||
|
С ВМ1 (не ICMP):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
timeout 3 bash -c 'exec 3<>/dev/tcp/10.0.0.13/4317' \
|
||||||
|
&& echo 'OTLP gRPC reachable'
|
||||||
|
```
|
||||||
|
|
||||||
|
Без живого OTLP и healthy стека к установке не переходить.
|
||||||
|
|
||||||
|
|
||||||
|
## 2. Дистрибутив и установка
|
||||||
|
|
||||||
|
ISO='/tmp/049-16-d-01.iso'
|
||||||
|
|
||||||
|
```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_*_amd64.deb' -o -iname '*.deb' \) |
|
||||||
|
sort
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
apt-get remove -y rhash
|
||||||
|
apt-get purge -y rhash
|
||||||
|
apt-get autoremove -y
|
||||||
|
```
|
||||||
|
|
||||||
|
Снимки до установки:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
test -f /etc/docker/daemon.json && \
|
||||||
|
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
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )' \
|
||||||
|
> /root/kesl-install/listeners.before
|
||||||
|
ls -l /root/kesl-install
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
apt-get install /root/kesl-install/kesl.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3. Первоначальная настройка без защиты
|
||||||
|
|
||||||
|
Значения EULA, Privacy Policy и KSN — после согласования, не механически.
|
||||||
|
Для этого окна, как на ВМ1/ВМ2: `USE_KSN=No`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
install -m 0600 -o root -g root /dev/null /root/kesl-install/autoinstall.ini
|
||||||
|
cat > /root/kesl-install/autoinstall.ini <<'EOF'
|
||||||
|
KSVLA_MODE=No
|
||||||
|
ENDPOINT_AGENT_MODE=No
|
||||||
|
EULA_AGREED=Yes
|
||||||
|
PRIVACY_POLICY_AGREED=Yes
|
||||||
|
USE_KSN=No
|
||||||
|
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
|
||||||
|
EOF
|
||||||
|
chmod 0600 /root/kesl-install/autoinstall.ini
|
||||||
|
stat -c '%U:%G:%a %n' /root/kesl-install/autoinstall.ini
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
/opt/kaspersky/kesl/bin/kesl-setup.pl \
|
||||||
|
--autoinstall=/root/kesl-install/autoinstall.ini
|
||||||
|
echo "kesl-setup exit=$?"
|
||||||
|
```
|
||||||
|
|
||||||
|
При `INSTALL_LICENSE=None` setup может вернуть 71. Не запускать повторно,
|
||||||
|
если `kesl.service` active и File Threat Protection Stopped.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl --no-pager --no-legend status kesl || true
|
||||||
|
kesl-control --app-info
|
||||||
|
kesl-control --get-task-list
|
||||||
|
free -h
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
curl -fsS --max-time 5 http://127.0.0.1:8080/api/v1/health
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидается: `kesl` запущен, задача 1 не `Started`, контейнеры healthy.
|
||||||
|
|
||||||
|
|
||||||
|
## 3. Resource budget до Update и FTP
|
||||||
|
### 3.1. Снимок
|
||||||
|
|
||||||
|
```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
|
||||||
|
awk '/^\[General\]/,/^\[/' /var/opt/kaspersky/kesl/common/kesl.ini | head -n 40
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2. Лимит CPU (KESL ещё работает)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --set-app-settings \
|
||||||
|
UseOnDemandCPULimit=Yes OnDemandCPULimit=15
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3. Память — только при остановленном KESL
|
||||||
|
|
||||||
|
Файл целиком не подменять. Сначала смотрите `[General]` из шага 3.1.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl stop kesl
|
||||||
|
systemctl is-active kesl || true
|
||||||
|
|
||||||
|
grep -nE '^(ScanMemoryLimit|MaxMemory)=' \
|
||||||
|
/var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e 's/^ScanMemoryLimit=8192$/ScanMemoryLimit=1024/' \
|
||||||
|
-e 's/^MaxMemory=auto$/MaxMemory=2048MB/' \
|
||||||
|
/var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
|
||||||
|
grep -nE '^(ScanMemoryLimit|MaxMemory)=' \
|
||||||
|
/var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
|
||||||
|
systemctl start kesl
|
||||||
|
systemctl is-active kesl
|
||||||
|
kesl-control --get-app-settings | grep -iE \
|
||||||
|
'UseOnDemandCPULimit|OnDemandCPULimit|ScanMemoryLimit|MaxMemory'
|
||||||
|
free -h
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
На constrained 4 ГиБ замените значения в `sed` на `512` и `1024MB`.
|
||||||
|
|
||||||
|
Ожидаемо: `kesl.service` active; task 1 и 6 `Stopped`; базы ещё не
|
||||||
|
загружены; ClickHouse/SigNoz healthy.
|
||||||
|
|
||||||
|
## 4. Активация
|
||||||
|
|
||||||
|
Код не помещать в `autoinstall.ini`, репозиторий, evidence, чат и history.
|
||||||
|
Нужен открытый egress из раздела 0.1.
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
В evidence — только статус вроде `Active subscription` и срок, не GUID
|
||||||
|
ключа. Если лицензия `Inconsistent update` или недействительна — stop.
|
||||||
|
|
||||||
|
## 5. АВЗ.2 — базы
|
||||||
|
|
||||||
|
ID подтвердить через `--get-task-list` (Update = 6).
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --get-settings 6
|
||||||
|
kesl-control --start-task 6 -W
|
||||||
|
kesl-control --get-task-state 6
|
||||||
|
kesl-control --app-info --json
|
||||||
|
free -h
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl restart kesl
|
||||||
|
systemctl is-active kesl
|
||||||
|
kesl-control --app-info --json
|
||||||
|
grep -nE '^(ScanMemoryLimit|MaxMemory)=' \
|
||||||
|
/var/opt/kaspersky/kesl/common/kesl.ini
|
||||||
|
kesl-control --get-app-settings | grep -iE \
|
||||||
|
'UseOnDemandCPULimit|OnDemandCPULimit'
|
||||||
|
kesl-control --get-schedule 6
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
kesl-control --get-task-state 6
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. Исключения hot-data
|
||||||
|
|
||||||
|
Только фактические mountpoint из раздела 1.2. Кандидаты: данные ClickHouse,
|
||||||
|
ClickHouse Keeper, PostgreSQL metastore. Не исключать `/var/lib/docker`,
|
||||||
|
`overlay2`, `/opt/signoz`, `/var/lib/han-deploy/incoming`, `/tmp`, `/root`.
|
||||||
|
|
||||||
|
Снять mountpoint:
|
||||||
|
```sh
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps --format '{{.Name}}'
|
||||||
|
|
||||||
|
for c in \
|
||||||
|
signoz-telemetrystore-clickhouse-0-0 \
|
||||||
|
signoz-telemetrykeeper-clickhousekeeper-0 \
|
||||||
|
signoz-metastore-postgres-0
|
||||||
|
do
|
||||||
|
echo "=== $c ==="
|
||||||
|
docker inspect --format \
|
||||||
|
'{{range .Mounts}}{{if eq .Type "volume"}}{{.Source}} dest={{.Destination}} vol={{.Name}}{{println}}{{end}}{{end}}' \
|
||||||
|
"$c"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --get-settings 1 \
|
||||||
|
--file /root/kesl-install/file-threat.before.ini
|
||||||
|
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/signoz-telemetrystore-0-0-data/_data
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/signoz-telemetrykeeper-0-data/_data
|
||||||
|
kesl-control --set-settings 1 \
|
||||||
|
--add-exclusion /var/lib/docker/volumes/signoz-metastore-postgres-0-data/_data
|
||||||
|
kesl-control --set-settings 1 ScanArchived=No
|
||||||
|
kesl-control --get-settings 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Каждое исключение: владелец, причина (write-hot telemetry/metadata),
|
||||||
|
компенсация (FTP вне volume + периодический `scan-file` host-дерева
|
||||||
|
`/opt/signoz/scripts`), срок пересмотра, подтверждение Security.
|
||||||
|
|
||||||
|
|
||||||
|
## 7. Узкий on-demand scan-file
|
||||||
|
|
||||||
|
ODS schedules, кроме Update, оставить Manual. Не сканировать volumes
|
||||||
|
ClickHouse/PostgreSQL и не запускать Container Scan.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kesl-control --get-task-list
|
||||||
|
kesl-control --get-schedule 2
|
||||||
|
kesl-control --set-schedule 2 RuleType=Manual
|
||||||
|
kesl-control --scan-file /opt/signoz/scripts --action Inform
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
free -h
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидается: scan-file без ошибок, FTP всё ещё Stopped, стек healthy.
|
||||||
|
Если вырос swap или unhealthy — остановить scan и не включать task 1.
|
||||||
|
|
||||||
|
## 8. Host protection — АВЗ.1
|
||||||
|
|
||||||
|
На Ubuntu 24.04 с fanotify параметр `InterceptorProtectionMode` **не
|
||||||
|
поддерживается**. Штатный режим — блокировка на время проверки. Откат:
|
||||||
|
`kesl-control --stop-task 1`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
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
|
||||||
|
kesl-control --app-info --json
|
||||||
|
free -h
|
||||||
|
docker stats --no-stream --format \
|
||||||
|
'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}'
|
||||||
|
cd /opt/signoz
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
ufw status verbose
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
```
|
||||||
|
|
||||||
|
Пилот: каждые 15 минут — health, OTLP, RAM/swap, события KESL, firewall.
|
||||||
|
При деградации: `kesl-control --stop-task 1`. Не расширять исключения
|
||||||
|
вслепую.
|
||||||
|
|
||||||
|
## 10. Приёмка стека и сужение egress
|
||||||
|
|
||||||
|
На ВМ3:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
systemctl is-active kesl docker
|
||||||
|
kesl-control --app-info
|
||||||
|
kesl-control --get-task-state 1
|
||||||
|
kesl-control --get-task-state 6
|
||||||
|
kesl-control --get-schedule 6
|
||||||
|
cd /opt/signoz
|
||||||
|
sudo PRIVATE_IP=10.0.0.13 ./scripts/30-verify-signoz.sh
|
||||||
|
docker compose -f pours/deployment/compose.yaml ps
|
||||||
|
ufw status verbose
|
||||||
|
diff -u /root/kesl-install/ufw.before <(ufw status verbose) || true
|
||||||
|
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||||
|
free -h
|
||||||
|
swapon --show
|
||||||
|
df -hT / /opt /var/lib/docker
|
||||||
|
```
|
||||||
|
|
||||||
|
С ВМ1 повторить TCP `4317`. Слушатели `8080` только на `127.0.0.1`,
|
||||||
|
`4317/4318` только на `192.168.0.5`. Сравнить UFW с baseline: новых
|
||||||
|
правил KESL быть не должно.
|
||||||
|
|
||||||
|
24 часа: без OOM/restart/unhealthy, hourly Update сам зелёный, диск
|
||||||
|
ClickHouse не упёрся в stop-порог.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rm -rf /root/kesl-eicar-test
|
||||||
|
# после копирования evidence:
|
||||||
|
# rm -rf /root/kesl-install
|
||||||
|
# rm -f /var/lib/han-deploy/incoming/049-16-d-01.iso \
|
||||||
|
# /var/lib/han-deploy/incoming/049-16-d-01.sig
|
||||||
|
```
|
||||||
|
|
||||||
|
## 13. Эксплуатационный режим
|
||||||
|
|
||||||
|
- Update (ID 6): каждый час; нужен постоянный узкий egress к KLServers.
|
||||||
|
- File Threat Protection (ID 1): постоянно,
|
||||||
|
`DisinfectDeleteIfNotPossible`, `ScanArchived=No`.
|
||||||
|
- ODS: по согласованию в низкую нагрузку; не полный диск и не volumes БД.
|
||||||
|
- ContainerScan: не использовать при текущей лицензии.
|
||||||
|
- Ежедневно: лицензия, task 1 `Started`, дата баз, ошибки KESL, health
|
||||||
|
SigNoz, свободное место `/opt`.
|
||||||
|
- После upgrade KESL/kernel/Docker: повтор пилота и evidence delta.
|
||||||
|
|
||||||
|
Обновление образов SigNoz (`20-deploy-signoz.sh`) — отдельное break-glass
|
||||||
|
окно; его egress к Docker Hub/GitHub не заменяет allow-list KESL.
|
||||||
|
|||||||
Reference in New Issue
Block a user