diff --git a/README.md b/README.md index 56c9e4d..82054c3 100644 --- a/README.md +++ b/README.md @@ -64,15 +64,16 @@ sudo ochenstarik-smm node-code home sudo ochenstarik-smm node-code server2 ``` -4. На каждом вторичном сервере запустите `sudo ./ochenstarik-server-monitor-manager.sh node`, вставьте SSH-ключ приложения и код именно этого узла. Белый IP вторичным серверам не нужен. -5. В приложении добавьте главный сервер с пользователем `ochenstarik-monitor` и отметьте `Это главный Mesh Hub`. -6. Нажмите обновление в панели связей, выберите источник и цель, затем `Разрешить` или `Отключить`. +4. На каждом вторичном сервере запустите `sudo ./ochenstarik-server-monitor-manager.sh node`, вставьте SSH-ключ приложения и код именно этого узла. Node локально создаст WireGuard-ключ и покажет запрос `SMMREQ1`. +5. На Hub выполните `sudo ochenstarik-smm node-enroll`, вставьте запрос по скрытому приглашению и верните полученный `SMMACK1` в установщик Node. Белый IP вторичным серверам не нужен. +6. В приложении добавьте главный сервер с пользователем `ochenstarik-monitor` и отметьте `Это главный Mesh Hub`. +7. Нажмите обновление в панели связей, выберите источник и цель, затем `Разрешить` или `Отключить`. Приватный ключ хранится в локальном каталоге packaged-приложения Windows. Первый SSH-host key принимается в режиме `accept-new`, затем проверяется по отдельному `known_hosts` приложения. Для предварительной проверки вместо запуска через pipe скачайте файл, выполните `bash -n` и просмотрите его содержимое. -Код Node содержит приватный ключ WireGuard узла. Считайте его секретом, используйте только на предназначенном сервере и не сохраняйте в Git или истории сообщений. +Enrollment-код действует 10 минут и погашается после первой успешной регистрации. Приватный WireGuard-ключ создаётся и остаётся только на Node. ## Принципы безопасности diff --git a/docs/installer-contract.md b/docs/installer-contract.md index b7dac97..20ae4c6 100644 --- a/docs/installer-contract.md +++ b/docs/installer-contract.md @@ -34,7 +34,7 @@ - локально генерирует WireGuard keypair; - принимает одноразовый enrollment token; - отправляет Hub только публичный ключ; -- получает внутренний адрес и подписанную конфигурацию; +- получает внутренний адрес и аутентифицированное подтверждение конфигурации; - создаёт только исходящее WireGuard-соединение; - не требует белого IP или входящего публичного порта. diff --git a/docs/roadmap.md b/docs/roadmap.md index 4b54143..07be447 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -36,10 +36,10 @@ ## Этап 3 — безопасная регистрация -- [ ] локальная генерация WireGuard-ключа на Node; -- [ ] одноразовый enrollment token; -- [ ] срок действия не более 10 минут; -- [ ] атомарное погашение token; +- [x] локальная генерация WireGuard-ключа на Node; +- [x] одноразовый enrollment token; +- [x] срок действия не более 10 минут; +- [x] атомарное погашение token; - [ ] отзыв и повторная регистрация Node; - [ ] подтверждение fingerprint Hub; - [ ] защита desktop SSH-ключа через DPAPI. diff --git a/docs/security-model.md b/docs/security-model.md index cdea62e..a013bd5 100644 --- a/docs/security-model.md +++ b/docs/security-model.md @@ -24,7 +24,7 @@ Windows-клиент использует отдельный Ed25519-ключ т 1. На Hub создаётся случайный enrollment token со сроком жизни не более 10 минут. 2. Node локально генерирует WireGuard-ключ. 3. Node предъявляет token и публичный ключ по защищённому каналу. -4. Hub атомарно помечает token использованным, назначает адрес и возвращает подписанную конфигурацию. +4. Hub атомарно помечает token использованным, регистрирует адрес и возвращает подтверждение, которое связывает token, публичный ключ и все параметры конфигурации. 5. Повторное использование, просроченный token и смена публичного ключа отклоняются. До появления mTLS enrollment выполняется через отдельную ограниченную SSH-команду. Token не должен содержать приватный WireGuard-ключ.