Рабочую машину Ева правит руками, а не однострочниками #1
Loading…
Reference in a new issue
No description provided.
Delete branch "eva-hands"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Серверная рука файловых инструментов (
src/tools/server_fs.rs) переезжает наeva-hands — демон со своим протоколом,
который сам слушает и сам аутентифицирует.
Транспорт
Демон слушает свой порт и пускает внутрь только владельца приватного ssh-ключа,
публичная половина которого лежит в его
authorized_keys. Ssh-демон на машинедля этого не нужен, ssh-бинарь у ядра — тоже.
Своей криптографии нет. Транспорт и аутентификация — готовая реализация
протокола SSH (
russh, серверная сторона внутри демона и клиентская в ядре):обмен ключами, шифр, проверка подписи, проверка ключа хоста. Наше — только
кого пускать и что течёт внутри канала.
Ключ машины заводится сам при первом запуске; ядро может его запинать
(
host_keyв конфиге) и тогда не примет чужого, вставшего на тот же адрес.Без пиннинга демон честно пишет об этом в лог при каждом соединении.
Что меняется
Раньше каждая операция поднимала свой
ssh, содержимое возилось base64 черезcat/dd/tail/head, а код возврата конвейера принадлежал последнейкоманде — и пропавший файл легко выглядел пустым. Теперь:
нему вперемешку, у каждой свой
id;переводы строк и не-UTF8, и не зависит от набора утилит той стороны
(
dd oflag=seek_bytes,base64 -w0есть не везде);not_found,too_large,denied, …):пропавший файл больше не может выглядеть пустым;
renameвместо обрубка на местепрежнего содержимого, права существующего файла переживают замену;
визуальной новеллы больше не едет по проводу ради четырёх байт. Потоковое
чтение с перекрытием окна и обрывом по лимиту находок переехало в демон как
есть;
~разворачивается — путь в кавычках шелла оставался тильдой, и файл ненаходился по вине кавычек;
без шелла: одна реализация на оба случая.
Новая секция конфига
shell.remote.hands—address(host:portдемона),key(приватный ssh-ключ ядра, явным полем, а не-iвнутриargs),user(по умолчанию
eva),host_key(публичный ключ машины, его печатаетeva-hands host-key). Секции нет — файлы правятся шеллом, как и раньше.Что остаётся
поднят, порт закрыт, ключ не принят. Тогда ядро откатывается на прежнюю
реализацию (она вся сохранена в
struct Shell) и пробует руки снова черезпять минут; ssh для этого настроен всё равно, ради
shell. Роняет назапасной путь только недоступность рук: отказ самой операции — честный
ответ машины, и обходить его нельзя. Это разделение под тестом. Отказ в
аутентификации тоже уводит на запасной путь, но пишет в лог
warn— молчатакое не проходит.
on,те же гейты. Мостам показывать нечего.
про машину. Там же остались отказ записи за концом файла и окно поиска
запасного пути (
Shell.chunk) — обе правки из свежего разбора ревью.Новых операций протокола (список каталога, метаданные, mkdir/remove/rename)
ядро пока не показывает модели — это отдельная фича, не этот MR.
shellтожепока ходит своим ssh; перевести его на
execрук — очевидный следующий шаг,и он же уберёт последнюю нужду в ssh-демоне на той машине.
Как разворачивать
На рабочей машине поднять руки — флейк
eva/handsдаёт пакет иNixOS-модуль:
Порт лучше держать во внутренней сети: ключ — не повод светить его наружу.
Публичный ключ машины после первого старта —
eva-hands host-key.Ядру дать приватный ключ (sops) и секцию
shell.remote.handsс адресом,путём к ключу и
host_keyс прошлого шага.Порядок не важен и откат безопасен: ядро без рук работает шеллом, руки без
ядра просто никем не зовутся.
Инфраструктура (
viendesu/infra) не тронута — это на Господина.Проверки
cargo testядра — 169 тестов зелёные. Вserver_fsдобавлены: кругзапасным путём целиком; отказ операции не уводит на обход; недоступность рук
уводит и оставляет их в покое. Тест на стык окон поиска из разбора ревью
сохранён и переведён на запасной путь (у рук свой такой же).
nix build .#eva-kernelсобирается, хэш git-зависимости вoutputHashesобновлён.
смещению, пропавший файл, атомарность записи, изгородь корней, и отдельно
tests/network.rs, где демон слушает настоящий порт, клиент приходит по сетисо своим ключом, чужой ключ получает отказ, а подменённый ключ машины не
проходит пиннинг.
Co-Authored-By: Eva
b281f6ea48toe71f3647fee71f3647feto150bac78e2View command line instructions
Manual merge helper
Use this merge commit message when completing the merge manually.
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.