148 lines
7.3 KiB
Markdown
148 lines
7.3 KiB
Markdown
# Контракт собственного 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).
|