Поставка KESL на ВМ3
This commit is contained in:
@@ -1,5 +1,262 @@
|
||||
# Ставим 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;
|
||||
|
||||
Переключить только Message Safety
|
||||
```sh
|
||||
cd /opt/han-chat/services/
|
||||
|
||||
deployment/preflight.sh
|
||||
/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 --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 \
|
||||
--cacert /etc/han/ca/vm2-internal-ca.crt \
|
||||
https://prodhanservice.ihan.ru:8443/internal/safety/status
|
||||
|
||||
|
||||
https://processing.internal:8443/internal/safety/status
|
||||
|
||||
https://prodhanservice.ihan.ru:8443/internal/safety/status
|
||||
---
|
||||
|
||||
### Cutover (только после 1–5)
|
||||
@@ -644,4 +916,424 @@ docker kill --signal HUP "$NGINX_ID"
|
||||
|
||||
Старый 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