2048162057
Updater applies chmod/chown on config, spool and state paths on every run. SAC is the primary update path; optional cron uses the same behavior. Co-authored-by: Cursor <cursoragent@cursor.com>
114 lines
6.6 KiB
Markdown
114 lines
6.6 KiB
Markdown
# Автообновление 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).
|
||
|