server-monitor-manager/docs/installer-contract.md

148 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Контракт собственного Linux bootstrap
## 1. Владение и поставка
Bootstrap, helper, systemd units, JSON schemas и manifests являются компонентами Server Monitor Manager и хранятся только в этом репозитории. Они публикуются одним совместимым release вместе с Desktop, Control и Agent.
Bootstrap не скачивает и не запускает исходники других проектов. Production-установка использует закреплённый release/tag, проверяет signed compatibility manifest и SHA-256 каждого artifact. Mutable `main` не является источником production-установки.
Published release tags and their assets are immutable. A published tag must never be moved, reused, deleted and recreated, or supplied with replacement assets under the same names; corrections must preserve the existing release and publish a new, higher version tag.
Пока bootstrap не опубликован в release, документация не должна предлагать несуществующую команду его скачивания.
## 2. Поддерживаемые роли
### Monitor
- Ubuntu/Debian с systemd;
- отдельный `ochenstarik-monitor` без пароля;
- публичный Ed25519 key из Desktop;
- root-owned forced command;
- сохранение существующего SSH-порта;
- запрет shell, PTY и forwarding.
### Control Hub
- ASP.NET Core Control service и SQLite;
- локальный Control CA и HTTPS certificate;
- TCP `7443` по умолчанию;
- WireGuard interface и root-owned nftables policy helper;
- systemd units и root-only state directories;
- транзит только по explicit directional Link.
### Node
- локальная генерация Agent и WireGuard private keys;
- CSR-based enrollment по одноразовому коду;
- только исходящие mTLS/WireGuard sessions;
- отсутствие требования публичного IP и входящего порта;
- restricted provisioning helper без общего root shell.
## 3. Enrollment
1. Пользователь скачивает bootstrap и checksum из release Server Monitor Manager.
2. Запускает bootstrap локально через `sudo`.
3. Сверяет fingerprint Control CA.
4. Вводит одноразовый enrollment code.
5. Node локально создаёт key и CSR.
6. Control выдаёт role-scoped certificate.
7. Bootstrap устанавливает совместимые Agent/helper units.
8. Enrollment code атомарно погашается.
Sudo-пароль не передаётся в Desktop, Control или audit. Приватные Node keys не покидают Node. Приватный Control CA key не включается в enrollment code.
## 4. Root helper
Helper доступен только через root-owned Unix socket или фиксированный non-interactive privilege wrapper. Он принимает:
- известный action id;
- schema version;
- JSON, соответствующий строгой схеме;
- job id и module hash.
Helper не принимает shell text, произвольные paths, environment или неизвестные поля, способные изменить смысл операции. Username, UID, port, protocol, CIDR, timezone, package id и управляемые пути валидируются повторно.
Каждая mutation:
1. выполняет preflight;
2. создаёт root-only backup;
3. отклоняет symlink в managed path;
4. проверяет синтаксис новой конфигурации;
5. применяет изменение атомарно;
6. проверяет factual state;
7. при ошибке выполняет rollback.
## 5. Целевой CLI
```text
bootstrap enroll
bootstrap status
bootstrap update
bootstrap rollback BACKUP_ID
bootstrap uninstall ROLE
control device-code DEVICE_ID
control node-code NODE_ID
control automation-token AUTOMATION_ID SOURCE_NODE_ID
emergency status
emergency mesh-disable
emergency mesh-enable
emergency firewall-restore
```
Текущая emergency-команда покрывает уже реализованные Mesh/WireGuard и project-owned nftables resources. Действия `vpn-disable` и `ssh-restore BACKUP_ID` добавляются вместе с соответствующими provisioning-модулями и их root-only backup format; до появления этих модулей команда намеренно их отклоняет.
CLI является non-interactive, кроме локального ввода enrollment code и явных подтверждений опасного удаления. Машиночитаемый режим возвращает versioned JSON и стабильные exit codes.
## 6. Идемпотентность и обновление
- повторная установка не дублирует users, keys, units, routes или firewall rules;
- несовместимая версия Control/Agent/helper блокирует provisioning job;
- update загружает artifacts только из release этого репозитория;
- checksum проверяется до остановки service;
- бинарники и units заменяются атомарно;
- неуспешный health check восстанавливает предыдущую версию;
- uninstall удаляет только принадлежащие выбранной роли files, users, interfaces и rules;
- удаление Hub требует отдельного подтверждения и не оставляет forwarding/ACL.
## 7. Forced command monitoring
Monitoring key permits only the exact versioned metrics snapshot listed below; no additional mesh status or other output is allowed. Полный SSH-терминал использует отдельную пользовательскую identity.
Минимальный snapshot:
```text
PROTOCOL=1
HOSTNAME=server-name
UPTIME_SECONDS=12345
LOAD1=0.42
CPU_COUNT=4
MEM_TOTAL_KB=...
MEM_AVAILABLE_KB=...
SWAP_TOTAL_KB=...
SWAP_FREE_KB=...
DISK_TOTAL_KB=...
DISK_AVAILABLE_KB=...
DISK_INODES_TOTAL=...
DISK_INODES_FREE=...
NETWORK_RX_BYTES=...
NETWORK_TX_BYTES=...
KERNEL=...
SYSTEMD_SSH=active|inactive|failed|unknown
SYSTEMD_WIREGUARD=active|inactive|failed|unknown
```
## 8. Обязательные проверки
- ShellCheck и `bash -n` для bootstrap scripts;
- `ssh-keygen` для public keys;
- `sshd -t` и `sshd -T` до reload;
- `wg-quick strip` для WireGuard configuration;
- `nft --check` до замены managed rules;
- проверка systemd units;
- проверка active session до миграции SSH;
- checksum, permissions и ownership release artifacts;
- repeated install/update/rollback/uninstall;
- reboot на поддерживаемой VM matrix;
- сохранение management-доступа при helper/VPN failure.
Полные требования к заданиям, настройке ОС, пользователям и Xray приведены в [ТЗ Provisioning и Xray VPN](provisioning-vpn-requirements.md).