sshkeeper v0.7.0: SSH-профили, туннели, сессии и зашифрованная синхронизация

Я выпустил sshkeeper v0.7.0. За последние несколько релизов проект заметно вырос: из удобного локального менеджера SSH-профилей он превратился в полноценное рабочее место для повседневной работы с серверами — с маршрутами через bastion-host’ы, туннелями, постоянными сессиями, быстрым поиском и теперь ещё с зашифрованной синхронизацией между устройствами.

При этом основная идея не изменилась: sshkeeper не заменяет OpenSSH. Он хранит и организует всё, что нужно для подключения, а само соединение по-прежнему выполняет системный ssh.

sshkeeper — менеджер SSH-подключений, маршрутов и туннелей

Что такое sshkeeper

Если серверов два-три, обычно хватает ~/.ssh/config. Когда их становится больше, появляются bastion-host’ы, разные ключи, пароли, группы, port forwarding, временные туннели и команды, которые постоянно приходится вспоминать, конфигурация довольно быстро перестаёт быть удобным интерфейсом.

sshkeeper — консольный менеджер поверх OpenSSH. Он хранит профили серверов в локальной SQLite-базе, секреты — в зашифрованном vault, а для ежедневной работы даёт TUI и CLI.

Это не Ansible и не система управления конфигурацией: sshkeeper не разворачивает ПО на серверах, не меняет их состояние и не пытается заменить обычные SSH-инструменты. Его задача проще — помнить, как добраться до нужной машины, и быстро запустить правильное SSH-подключение.

Что умеет sshkeeper

  • хранить профили серверов, группы, теги и заметки;
  • работать с авторизацией по ключу, через ssh-agent, по паролю и с key passphrase;
  • хранить пароли и passphrase в локальном зашифрованном vault;
  • строить ProxyJump-маршруты и цепочки из нескольких bastion-host’ов;
  • создавать Local, Remote и SOCKS port-forward правила;
  • запускать SSH-туннели в foreground и background и следить за их состоянием;
  • держать постоянные SSH-сессии через необязательный tmux;
  • создавать шаблоны команд;
  • искать серверы по имени, alias, host, пользователю, группе, тегам, заметкам, маршрутам и даже портам forwarding;
  • сортировать список по имени, последнему использованию или группам;
  • проверять один сервер или сразу все видимые/отмеченные профили;
  • импортировать существующий ~/.ssh/config;
  • работать через TUI или полноценный CLI;
  • использовать русский или английский интерфейс.

Что изменилось за последние версии

Последняя опубликованная версия — v0.7.0, но значительная часть нынешнего sshkeeper появилась за несколько релизов подряд.

0.4.x — нормальная модель маршрутов и Linux-пакеты

В 0.4 я довольно серьёзно переделал внутреннюю модель. Раньше маршрут через jump-host частично жил как текст, частично — как отдельная структура, и эти представления могли расходиться.

Теперь маршрут — это нормальная цепочка связанных профилей. Если bastion переименовать, зависимые серверы не ломаются: внутри хранится стабильная ссылка на профиль, а не его текущее имя. sshkeeper проверяет циклы, дублированные hops и не даёт удалить профиль, если он ещё используется в маршруте.

Профиль, используемый как jump-host, больше не обязан отдельно существовать в ~/.ssh/config: sshkeeper сам получает его host/user/port/key из своей базы и формирует временную конфигурацию OpenSSH.

Тогда же появились отдельный Manage-раздел, редактор маршрутов, выбор существующих ключей, групп, тегов и шаблонов прямо из формы, а Linux-релизы получили нативные .deb и .rpm пакеты.

0.5.x — постоянные сессии, удобнее туннели и русский интерфейс

В 0.5 появился опциональный режим Persistent Sessions на базе tmux. Можно открыть SSH-соединение в отдельном tmux-window, уйти из него, подключиться к другому серверу и потом вернуться — соединение продолжит жить.

При этом tmux не стал обязательной зависимостью. Если его нет, sshkeeper просто не показывает связанные с Sessions функции, а обычные подключения и туннели работают как раньше.

В 0.5.2 был приведён в порядок сценарий запуска туннелей: из экрана port-forward правил можно сразу запустить background tunnel или выбрать режим, а интерфейс объясняет, почему конкретный вариант сейчас недоступен.

В 0.5.3 появился русский и английский интерфейс. По умолчанию язык берётся из системной locale, но его можно выбрать вручную в настройках.

0.6.0 — новый рабочий dashboard

В 0.6 основное внимание ушло в ежедневную работу с большим списком серверов.

Появился живой fuzzy-поиск: нажимаешь / и просто начинаешь печатать. Поиск идёт не только по имени сервера, но и по alias, host, пользователю, группе, тегам, заметкам, маршрутам и port-forward правилам.

Список можно сортировать по имени, последнему подключению или группе. Группы сворачиваются, в отдельной колонке видно результат последнего теста, работающий tunnel и открытую tmux-сессию. Клавиша T проверяет все видимые или отмеченные серверы параллельно.

Сам интерфейс тоже был переработан: адаптивная светлая/тёмная палитра, компактные подсказки горячих клавиш, отдельный ASCII-режим для терминалов без нормальной поддержки box drawing и более информативная правая панель.

Текущий dashboard sshkeeper

0.7.0 — зашифрованная синхронизация между устройствами

Главное изменение новой версии — синхронизация sshkeeper между несколькими компьютерами.

Синхронизируются:

  • профили серверов и маршруты;
  • группы и теги;
  • port-forward правила;
  • шаблоны команд;
  • секреты из vault;
  • приватные ключи, на которые ссылаются профили.

При этом локальные вещи — время последнего подключения, результаты тестов, запущенные туннели, язык интерфейса и порядок сортировки — остаются локальными и между машинами не ездят.

Куда синхронизировать данные

Есть два варианта.

Общая папка. Это может быть Syncthing, Nextcloud, Dropbox, сетевой диск или любой другой способ сделать одну папку доступной нескольким компьютерам.

Git. Можно использовать приватный Git-репозиторий. sshkeeper хранит свои данные в отдельной ветке, не смешивая их с остальным содержимым репозитория.

Настройки синхронизации sshkeeper v0.7.0

Как подключается новое устройство

Первое устройство создаёт sync-space и показывает recovery key, который стоит сохранить отдельно.

Для подключения следующего устройства на уже настроенной машине выбирается Add device. sshkeeper показывает шестизначный код, действующий десять минут. На новом компьютере вводятся этот код и мастер-пароль устройства, которое его выдало.

Сам по себе шестизначный код бесполезен. Он используется вместе с мастер-паролем, а после применения удаляется. При Git-синхронизации обмен для pairing идёт через временную ветку, которая не попадает в постоянную историю.

При включённом Auto sync TUI синхронизируется при запуске и примерно через три секунды после изменений.

Что видит хранилище

Перед отправкой всё содержимое упаковывается в один файл и шифруется XChaCha20-Poly1305 случайным 256-битным sync key. Ключ синхронизации хранится только внутри vault на подключённых устройствах.

То есть Nextcloud, Syncthing-сервер или Git-хостинг не получают список серверов, адреса, имена профилей или сами секреты — только зашифрованный blob и служебный минимум, необходимый для формата.

Есть ещё несколько предохранителей:

  • синхронизация не запускается при заблокированном vault;
  • существующий локальный приватный ключ никогда автоматически не перезаписывается другим ключом с тем же путём;
  • изменения объединяются по отдельным сущностям, а удаления тоже распространяются между устройствами;
  • для восстановления после потери всех устройств предусмотрен recovery key.

Установка v0.7.0

Для Debian/Ubuntu x86-64:

sudo apt install ./sshkeeper_0.7.0-1_amd64.deb

Для Fedora/RHEL-family x86_64:

sudo dnf install ./sshkeeper-0.7.0-1.x86_64.rpm

Есть пакеты для ARM64, обычные tar.gz для Linux и macOS и экспериментальная Windows-сборка.

Основная обязательная зависимость — системный OpenSSH. tmux нужен только для Persistent Sessions, а системный git — только если для синхронизации выбран Git backend.

Проверить, какой бинарник реально запускается после обновления:

command -v sshkeeper
sshkeeper --version

Немного о безопасности

Локальный vault использует XChaCha20-Poly1305, ключ из мастер-пароля получается через Argon2id. Пароли и passphrase не передаются через аргументы командной строки.

Но у проекта пока не было независимого аудита безопасности. Для обычной собственной инфраструктуры я сам использую эту модель, но для особо критичных сред реализацию и threat model стоит изучить отдельно.

Ссылки

Страница проекта sshkeeper
Исходный код
sshkeeper v0.7.0 на GitHub
Руководство

Оставить комментарий

Email не публикуется. Поля, отмеченные *, обязательны.