# Автообновление ssh-monitor Скрипт **`update_ssh_monitor.sh`** обновляет **`/usr/local/bin/ssh-monitor`** из git и перезапускает systemd-сервис. ## Основной путь: Security Alert Center На продакшен-хостах обновление идёт **через SAC**, без cron: 1. Админ нажимает **«Обновить ssh-monitor (SSH)»** в карточке хоста. 2. SAC по SSH запускает `/opt/scripts/update_ssh_monitor.sh` с `REPO_URL` / `GIT_BRANCH` из **Настройки → Обновления агентов**. 3. Updater сам выполняет `git pull`, синхронизирует `sac-client.sh` и watchdog, дописывает отсутствующие ключи в **`/etc/ssh-monitor.conf`**, **выставляет `chmod`/`chown`** на конфиг, SAC-spool, счётчики и state-файлы, перезапускает **`ssh-monitor.service`**. Участие админа на сервере **не требуется** (кроме первичной настройки `SAC_URL` / `SAC_API_KEY` в конфиге). При **первой установке** (нет updater на хосте) SAC выполняет bootstrap с **`--deploy`**: clone, ipset при необходимости, systemd unit, полный hardening. **Cron / systemd timer** — опциональная альтернатива с тем же скриптом и обязательным `REPO_URL` в окружении. Watchdog и таймеры watchdog **не изменяются** при обычном update (кроме синхронизации скрипта watchdog из git). **Конфиг `/etc/ssh-monitor.conf`:** при первой установке копируется из `ssh-monitor.conf.example`. При каждом update в **существующий** конфиг **дописываются** отсутствующие SAC-переменные и ключи безопасности; **`UseSAC=fallback`**. Telegram/SMTP и прочие ключи **не перезаписываются**. Установка монитора и unit-файлов: [README.md](../README.md), зависимости: [install-prerequisites.ru.md](install-prerequisites.ru.md). ## Что делает скрипт 1. Создаёт рабочий каталог **`UPDATE_DIR`** (по умолчанию `/opt/scripts/update`). 2. При **`--deploy`** / bootstrap SAC проверяет **`ipset`** и при отсутствии пытается установить через пакетный менеджер. Обычное обновление **не** вызывает `apt-get`. 3. В **`UPDATE_DIR`** выполняет **`git clone`** или **`git pull`** репозитория. 4. Ищет **`ssh-monitor`** в клоне (GitLab layout или плоский репозиторий). 5. Сравнивает **SHA256** с **`LOCAL_SCRIPT_PATH`** (`/usr/local/bin/ssh-monitor`). 6. **Всегда** синхронизирует **`sac-client.sh`**, **`ssh-monitor-perms.sh`**, watchdog. 7. Дописывает ключи конфига; **`apply_runtime_security_hardening`**: `chmod 600` конфиг, `700` spool, `600` state/SAC-файлы, whitelist. 8. При изменении **`ssh-monitor`**, **`sac-client.sh`** или конфига — **`systemctl restart ssh-monitor.service`**. 9. Лог: **`/var/log/update_script.log`** (блок «Итог обновления», строка `security hardening`). ```mermaid flowchart LR A[SAC или cron] --> B[update_ssh_monitor.sh] B --> C[git pull/clone] C --> D[sync sac-client + perms lib] C --> E{SHA256 ssh-monitor?} D --> F[harden config/spool/state] E -->|да| G[backup + cp ssh-monitor] E -->|нет| F G --> F F --> H{что-то изменилось?} H -->|да| I[restart ssh-monitor.service] H -->|нет| J[без перезапуска] ``` ## Настройка перед первым запуском | Переменная | По умолчанию | Назначение | |------------|--------------|------------| | `UPDATE_DIR` | `/opt/scripts/update` | Каталог для git-клона | | `REPO_URL` | *(обязательно)* | URL git — задаётся SAC, export или `Environment=` в cron | | `GIT_BRANCH` | `main` | Ветка для clone/pull | | `LOCAL_SCRIPT_PATH` | `/usr/local/bin/ssh-monitor` | Куда копировать монитор | | `LOG_FILE` | `/var/log/update_script.log` | Лог обновлений | | `UPDATE_VIA_SAC` | *(опционально)* | SAC выставляет `1`; при отсутствии бинарника включается `--deploy` | Требования: **root**, **git**, доступ к репозиторию. ## Первичная установка (--deploy) ```bash sudo REPO_URL=https://git.kalinamall.ru/PapaTramp/ssh-monitor.git ./update_ssh_monitor.sh --deploy # или first_deploy.sh с REPO_URL в окружении ``` Через SAC bootstrap выполняется автоматически с **`--deploy`**. ## Установка updater (если не через SAC bootstrap) ```bash sudo mkdir -p /opt/scripts sudo cp update_ssh_monitor.sh /opt/scripts/update_ssh_monitor.sh sudo chmod 750 /opt/scripts/update_ssh_monitor.sh ``` Проверка: ```bash sudo REPO_URL=https://git.kalinamall.ru/PapaTramp/ssh-monitor.git /opt/scripts/update_ssh_monitor.sh sudo tail -30 /var/log/update_script.log ``` ## Запуск по расписанию (опционально) ### Cron ``` 0 4 * * * REPO_URL=https://git.kalinamall.ru/PapaTramp/ssh-monitor.git /opt/scripts/update_ssh_monitor.sh ``` ### systemd timer См. предыдущие примеры `ssh-monitor-update.service` / `.timer` с `Environment=REPO_URL=...`. ## Откат ```bash ls -la /usr/local/bin/ssh-monitor.backup.* sudo cp /usr/local/bin/ssh-monitor.backup.YYYYMMDD_HHMMSS /usr/local/bin/ssh-monitor sudo systemctl restart ssh-monitor.service ``` ## Ограничения - Секреты (`SAC_API_KEY`, Telegram) SAC **не** прописывает — только в `/etc/ssh-monitor.conf` на хосте. - При недоступном git **`git pull`** пишет предупреждение и продолжает с локальной копией. - **`REPO_URL`** без дефолта в скрипте — только доверенное зеркало (kalinamall / своё Gitea).