# sshkeeper — Руководство пользователя ## Содержание 1. [Что такое sshkeeper](#что-такое-sshkeeper) 2. [Установка](#установка) 3. [Первый запуск](#первый-запуск) 4. [TUI — основной интерфейс](#tui--основной-интерфейс) 5. [Управление серверами](#управление-серверами) 6. [Маршруты и бастионы](#маршруты-и-бастионы) 7. [Port Forwards и Tunnels](#port-forwards-и-tunnels) 8. [CLI команды](#cli-команды) 9. [Vault — хранилище секретов](#vault--хранилище-секретов) 10. [Сценарии использования](#сценарии-использования) 11. [Справка по клавишам](#справка-по-клавишам) --- ## Что такое sshkeeper sshkeeper — это консольный менеджер SSH-подключений. Основная целевая платформа — Linux; сборки для macOS доступны, Windows-сборка пока экспериментальная. Он хранит профили серверов, секреты (пароли, фразы от ключей) и запускает системный `ssh` с нужными опциями. **Чем sshkeeper НЕ является:** - Это не Ansible — он не настраивает серверы и не пушит файлы - Это не замена SSH — он использует системный `/usr/bin/ssh` **Что он делает:** - Хранит профили серверов в локальной SQLite-базе - Хранит пароли в зашифрованном vault (XChaCha20-Poly1305) - Управляет маршрутами (бастионы, цепочки прыжков) - Управляет port forwards (локальные, удалённые, SOCKS) - Запускает туннели в фоне с отслеживанием PID - Предоставляет TUI (текстовый интерфейс) и CLI **Стек технологий:** - Go 1.25+ - Bubble Tea (TUI framework) - Cobra (CLI framework) - SQLite (modernc.org/sqlite) - XChaCha20-Poly1305 (шифрование vault) - Argon2id (KDF для мастер-пароля) **Исходники:** - Основной публичный репозиторий: [github.com/mirivlad/sshkeeper](https://github.com/mirivlad/sshkeeper) - Зеркало/рабочий репозиторий: `git@git.mirv.top:mirivlad/sshkeeper` --- ## Установка ### Из исходников (основной способ) ```bash git clone git@git.mirv.top:mirivlad/sshkeeper.git cd sshkeeper go build -o ~/.local/bin/sshkeeper . ``` Или через скрипт: ```bash ./build.sh # сборка в bin/ ./release.sh # сборка релизных архивов в dist/ ``` **Требования:** Go 1.25+ и системный OpenSSH. Статус платформ: | Платформа | Статус | Примечание | |-----------|--------|------------| | Linux | Основная целевая платформа | Архивы `linux/amd64` и `linux/arm64`. | | macOS | Сборки доступны, требуется проверка на целевых машинах | Архивы `darwin/amd64` и `darwin/arm64`, нужен системный `ssh`. Homebrew formula запланирована. | | Windows | Experimental | Нужен OpenSSH Client как `ssh.exe` в `PATH`; password/key-passphrase PTY-сценарии на Windows пока не подтверждены. | На Windows OpenSSH Client можно установить через Windows Optional Features или PowerShell: ```powershell Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 ``` ### Из релиза (после публикации v0.2.0) ```bash tar -xzf sshkeeper_v0.2.0_linux_amd64.tar.gz sudo install -m 0755 sshkeeper_v0.2.0_linux_amd64/sshkeeper /usr/local/bin/sshkeeper ``` --- ## Первый запуск При первом запуске sshkeeper создаёт конфигурацию, базу данных и vault: ```bash sshkeeper ``` Вы увидите приветствие и запрос на создание мастер-пароля: ``` Welcome to sshkeeper! No vault found. Let's create one. Create master password: ******** Repeat master password: ******** Vault created and unlocked for this command. You're ready to go! ``` **Важно:** запомните мастер-пароль. Без него секреты не восстановить. После создания vault откроется главный экран TUI со списком серверов (пока пустым). --- ## TUI — основной интерфейс Запуск TUI — просто `sshkeeper` без аргументов. ### Главный экран ``` sshkeeper 0 servers Vault unlocked | 0 OK | 0 FAIL NAME ALIAS ROUTE AUTH GROUP STATUS No servers yet. Press Ctrl+A to add one. Enter: connect | Ctrl+X: actions | Ctrl+A: add | Ctrl+E: edit Ctrl+F: search | Ins: select | ?: hotkeys | F1: help | Ctrl+Q: quit ``` **Столбцы:** | Столбец | Описание | |---------|----------| | NAME | Отображаемое имя сервера | | ALIAS | Уникальный идентификатор | | ROUTE | Маршрут подключения (● direct, → via, ⇒ chain) | | AUTH | Метод аутентификации (key/password/agent/key+phrase) | | GROUP | Группа сервера | | STATUS | Результат последнего теста (OK/FAIL/?) | **Навигация:** | Клавиша | Действие | |---------|----------| | `↑/↓` | Перемещение по списку | | `Enter` | Подключиться к серверу | | `Ctrl+A` | Добавить сервер | | `Ctrl+E` | Редактировать сервер | | `Ctrl+X` | Меню действий | | `Ctrl+F` | Поиск | | `Ins` | Выбрать/снять выбор | | `?` | Краткая справка по клавишам | | `F1` | Полная справка по приложению | | `Ctrl+Q` | Выход | ### Быстрая справка по клавишам Нажмите `?` на любом экране: ``` sshkeeper — Quick Help Navigation ↑/↓ Move through list PgUp/PgDn Scroll page Home/End Jump to start/end Actions Enter Select / Confirm / Open Esc Back / Cancel / Close Tab / ↓ Next field Shift+Tab / ↑ Previous field / Open dropdown picker Server list Enter Connect to server Ctrl+A Add server Ctrl+E Edit server Ctrl+F Search Ctrl+X Action menu Ins Select / deselect Port forwards Ctrl+A Add forward Enter / Ctrl+E Edit forward Ctrl+D Delete forward Other ? This quick help F1 Full documentation Esc / Enter / ? / q — close ``` ### Полная справка по приложению Нажмите `F1` на любом экране. Это полная документация по sshkeeper: ``` sshkeeper — Full Help What is sshkeeper sshkeeper is a console SSH connection manager. Linux is the primary target; macOS builds are available and Windows is experimental. It stores server profiles, secrets, and launches the system ssh client. Navigation ↑/↓ Move through list Tab/↓ Next field Shift+Tab/↑ Previous field / Open dropdown picker Global actions Enter Select / Confirm / Open Esc Back / Cancel / Close ? Quick help (hotkeys) F1 Full documentation Ctrl+Q Quit Server list Enter Connect to server Ctrl+A Add server Ctrl+E Edit server Ctrl+F Search Ctrl+X Action menu Ins Select / deselect ... ↑/↓ scroll — q/Esc/Enter close ``` **Навигация по полной справке:** | Клавиша | Действие | |---------|----------| | `↑/↓` | Прокрутка | | `PgUp/PgDn` | Прокрутка по странице | | `q` / `Esc` / `Enter` | Закрыть справку | --- ## Управление серверами ### Добавление сервера 1. Нажмите `Ctrl+A` на главном экране 2. Заполните поля: ``` Add Server Alias: mail.kp Display Name: Production mail Host: mail.example.org Port: 22 User: root Auth Method: key Identity File: ~/.ssh/id_ed25519 Route hops: bastion Group: KP Notes: Main mail server Startup Command: tmux attach -t ops Tags: prod, mail [ Test ] [ Save ] Tab/↓: next | ↑: prev | /: pick list | Enter: select | Esc: back ``` **Навигация по форме:** | Клавиша | Действие | |---------|----------| | `Tab` или `↓` | Следующее поле | | `Shift+Tab` или `↑` | Предыдущее поле | | `/` на Auth Method | Выбрать из списка (password/key/key_passphrase/agent) | | `/` на Group | Выбрать из существующих групп | | `Enter` на Test | Проверить подключение | | `Enter` на Save | Сохранить | | `Esc` | Отмена | ### Редактирование сервера 1. Выберите сервер стрелками 2. Нажмите `Ctrl+E` 3. Отредактируйте поля 4. Нажмите `Enter` на Save ### Удаление сервера 1. Выберите сервер стрелками 2. Нажмите `Ctrl+X` (меню действий) 3. Выберите "Delete" 4. Подтвердите: `Enter` или `Y` — да, `Esc` или `N` — нет ### Тест подключения 1. Выберите сервер стрелками 2. Нажмите `Ctrl+X` → "Test connection" 3. Результат отобразится в столбце STATUS (OK/FAIL) ### Поиск 1. Нажмите `Ctrl+F` 2. Введите запрос (поиск по alias, name, host, user, group, notes, tags, route hops, forward ports) 3. `Enter` — применить фильтр 4. `Esc` — сбросить --- ## Маршруты и бастионы ### Прямое подключение Сервер подключается напрямую: ``` ROUTE: ● direct → root@web.example.org:22 ``` ### Через бастион Сервер доступен через один jump host: ``` ROUTE: → bastion → root@internal.web:22 ``` ### Цепочка прыжков Сервер доступен через несколько jump hosts: ``` ROUTE: ⇒ bastion → dmz-gw → … → root@secure.internal:22 ``` ### Настройка маршрута **Через TUI:** 1. Добавьте/редактируйте сервер или выберите `Ctrl+X` → "Manage route" 2. В поле "Route hops" введите бастионы через запятую: `bastion,dmz-gw` 3. Или введите адрес напрямую: `user@bastion.example.com:2222` **Через CLI:** ```bash sshkeeper route set web --jumps bastion sshkeeper route set prod --jumps bastion,dmz-gw sshkeeper route show web sshkeeper route clear web ``` --- ## Port Forwards и Tunnels ### Ключевое различие - **Port Forward** — сохранённое правило проброса порта. Просто конфигурация, не запускает процесс. - **Tunnel** — запущенный SSH-процесс, который активирует один или несколько forwards. Аналогия: forward — это рецепт, tunnel — это готовое блюдо. ### Типы forwards | Тип | Описание | Пример | |-----|----------|--------| | **Local** | Порт на вашей машине → сервис за SSH-сервером | Локальный 5432 → удалённый PostgreSQL | | **Remote** | Порт на SSH-сервере → сервис на вашей машине | Удалённый 8080 → локальный dev-сервер | | **SOCKS** | Локальный SOCKS-прокси через SSH | Браузер → SOCKS → интернет через SSH-сервер | ### Управление forwards через TUI 1. Выберите сервер на главном экране 2. Нажмите `Ctrl+X` → "Manage port forwards" 3. Откроется список forwards: ``` Port Forwards — web NAME TYPE LISTEN TARGET ON Local PostgreSQL Local 127.0.0.1:15432 127.0.0.1:5432 yes Web Admin Local 127.0.0.1:18080 internal.web:80 yes SOCKS Proxy SOCKS 127.0.0.1:1080 SOCKS yes Selected Port 127.0.0.1:15432 on this machine will be forwarded through web to 127.0.0.1:5432. -L 127.0.0.1:15432:127.0.0.1:5432 -o ExitOnForwardFailure=yes Ctrl+A: add | Ctrl+E/Enter: edit | Ctrl+D: delete | Esc: back ``` **Действия:** | Клавиша | Действие | |---------|----------| | `Ctrl+A` | Добавить forward | | `Enter` или `Ctrl+E` | Редактировать выбранный | | `Ctrl+D` | Удалить (с подтверждением) | | `Esc` | Назад | ### Добавление forward 1. Нажмите `Ctrl+A` на экране forwards 2. Выберите тип (1/2/3 или Tab): ``` Add Port Forward Name: Local PostgreSQL Description: optional Type ▸ 1. Local port on my machine → service on SSH server 2. Remote port on SSH server → service on my machine 3. SOCKS local dynamic SOCKS proxy through SSH Opens a local port on this machine and forwards it through SSH to the target address. Listen Address: 127.0.0.1 Listen Port: 15432 Target Host: 127.0.0.1 Target Port: 5432 Preview -L 127.0.0.1:15432:127.0.0.1:5432 -o ExitOnForwardFailure=yes [ Save ] Tab/↓: next | ↑: prev | 1/2/3: select type | Enter: save | Esc: back ``` **Поля зависят от типа:** | Тип | Поля | |-----|------| | Local | Listen Address, Listen Port, Target Host, Target Port | | Remote | Remote Listen Addr, Remote Listen Port, Local Target Host, Local Target Port | | SOCKS | Listen Address, Listen Port (target поля скрыты) | **По умолчанию Listen Address = `127.0.0.1`** (только локальный доступ). Если введёте `0.0.0.0`, появится предупреждение. ### Запуск туннеля **Через TUI:** 1. Выберите сервер 2. Нажмите `Ctrl+X` → один из вариантов: - **Connect with tunnels** — SSH-сессия + все активные forwards - **Start tunnels only** — туннель на переднем плане, без shell - **Start tunnels in background** — туннель в фоне с PID **Через CLI:** ```bash # SSH-сессия с туннелями sshkeeper tunnel web # Только туннель (foreground) sshkeeper tunnel web --forward-only # Туннель в фоне sshkeeper tunnel web --background ``` Фоновый туннель запускается как `ssh -N`, требует хотя бы один включённый forward и сейчас поддерживает только `key` или `agent` auth. Для `password`/`key_passphrase` используйте foreground-режим (`sshkeeper tunnel web` или `--forward-only`), чтобы sshkeeper мог обработать PTY prompt и передать секрет из vault. ### Управление туннелями **Через TUI:** 1. Нажмите `Ctrl+X` → "Manage tunnels" 2. Список запущенных туннелей: ``` Tunnel Manager Tunnel to web PID 12345 running 2m30s Tunnel to prod PID 12346 running 1m15s Ctrl+D: stop | Ctrl+R: refresh | Esc: back ``` **Через CLI:** ```bash sshkeeper tunnel list sshkeeper tunnel stop sshkeeper tunnel stop-all ``` --- ## CLI команды ### Серверы ```bash # Добавление sshkeeper add web --host 10.0.0.10 --user deploy --auth key sshkeeper add prod --host 10.0.0.20 --user root --auth password sshkeeper add bastion --host bastion.example.org --user admin --auth key_passphrase --identity-file ~/.ssh/id_rsa # Интерактивный режим sshkeeper add # Просмотр sshkeeper list sshkeeper show web sshkeeper search prod # Подключение sshkeeper connect web sshkeeper c web # короткая форма # Выполнение команды sshkeeper run web "uptime" # Тест подключения sshkeeper test web # Редактирование sshkeeper edit web --tags prod,web --startup-command "tmux attach -t ops" # Удаление sshkeeper delete web ``` ### Маршруты ```bash sshkeeper route set web --jumps bastion sshkeeper route set prod --jumps bastion,dmz-gw sshkeeper route show web sshkeeper route clear web ``` ### Port Forwards ```bash # Добавление sshkeeper forward add web --name "Local PostgreSQL" --type local --local-port 15432 --remote-addr 127.0.0.1 --remote-port 5432 sshkeeper forward add bastion --name "SOCKS Proxy" --type dynamic --local-port 1080 # Список sshkeeper forward list web # Включить/выключить sshkeeper forward edit 1 --enabled=false # Удаление sshkeeper forward delete web 1 ``` ### Tunnels ```bash sshkeeper tunnel web # SSH + туннели sshkeeper tunnel web --forward-only # Только туннель sshkeeper tunnel web --background # Фоновый туннель sshkeeper tunnel list # Список туннелей sshkeeper tunnel stop # Остановить sshkeeper tunnel stop-all # Остановить все tracked туннели ``` ### Группы и шаблоны ```bash sshkeeper group list sshkeeper group rename old new sshkeeper group delete name sshkeeper template list sshkeeper template add uptime "uptime" sshkeeper template delete uptime sshkeeper run-template web uptime ``` ### Vault ```bash sshkeeper vault status sshkeeper vault unlock sshkeeper vault list sshkeeper vault delete web ssh_password sshkeeper vault change-password ``` ### Импорт/Экспорт ```bash sshkeeper import # Импорт из ~/.ssh/config sshkeeper export # Экспорт в stdout ``` --- ## Vault — хранилище секретов Vault хранит SSH-пароли и фразы от ключей в зашифрованном виде. **Шифрование:** XChaCha20-Poly1305, KDF: Argon2id (64 MiB, 3 iterations) **Когда нужен мастер-пароль:** - `connect`, `c` — для подключения с password/key_passphrase аутентификацией - `run`, `run-template` — для выполнения команд - `test` — для тестирования - `edit`, `delete` — для редактирования секретов - `vault` команды **Когда НЕ нужен:** - `list`, `show`, `search` — только метаданные - `add` с auth=key или auth=agent - `tunnel list`, `tunnel stop`, `tunnel stop-all` - `tunnel --background` - `export`, `ssh-config` --- ## Сценарии использования ### Сценарий 1: Подключение к серверу через бастион ```bash # 1. Добавляем бастион sshkeeper add bastion --host bastion.example.org --user admin --auth key # 2. Добавляем внутренний сервер с маршрутом через бастион sshkeeper add web --host 10.0.0.10 --user deploy --auth key sshkeeper route set web --jumps bastion # 3. Подключаемся sshkeeper connect web # Автоматически: ssh -J bastion deploy@10.0.0.10 ``` ### Сценарий 2: Локальный доступ к удалённой базе данных ```bash # 1. Добавляем сервер sshkeeper add db --host db.internal --user postgres --auth key # 2. Создаём forward sshkeeper forward add db --name "PostgreSQL" --type local --local-port 15432 --remote-addr 127.0.0.1 --remote-port 5432 # 3. Запускаем туннель в фоне sshkeeper tunnel db --background # ✓ Tunnel started [12345] PID 67890 → db # 4. Подключаемся локально psql -h 127.0.0.1 -p 15432 -U myuser mydb # 5. Когда не нужен — останавливаем sshkeeper tunnel stop 12345 ``` ### Сценарий 3: SOCKS-прокси для браузера ```bash # 1. Добавляем сервер sshkeeper add jump --host jump.example.org --user me --auth key # 2. Создаём SOCKS forward sshkeeper forward add jump --name "SOCKS" --type dynamic --local-port 1080 # 3. Запускаем туннель sshkeeper tunnel jump --background # 4. Настраиваем браузер: SOCKS5 127.0.0.1:1080 ``` ### Сценарий 4: Цепочка прыжков ```bash # Сервер за двумя бастионами sshkeeper add secure --host 10.10.10.10 --user root --auth key sshkeeper route set secure --jumps bastion,dmz-gw # Подключение sshkeeper connect secure # Автоматически: ssh -J bastion,dmz-gw root@10.10.10.10 ``` ### Сценарий 5: Групповые операции ```bash # В TUI: выбрать несколько серверов (Ins), затем: # Ctrl+X → Run template → выбрать шаблон # Команда выполнится на всех выбранных серверах ``` --- ## Справка по клавишам ### Главный экран | Клавиша | Действие | |---------|----------| | `Enter` | Подключиться к серверу | | `Ctrl+A` | Добавить сервер | | `Ctrl+E` | Редактировать сервер | | `Ctrl+F` | Поиск | | `Ctrl+X` | Меню действий | | `Ins` | Выбрать/снять выбор | | `?` | Краткая справка по клавишам | | `F1` | Полная справка по приложению | | `Ctrl+Q` | Выход | ### Меню действий (Ctrl+X) | Действие | Описание | |----------|----------| | Connect | Стандартное SSH-подключение | | Connect with tunnels | SSH + все активные forwards | | Start tunnels only | Туннель без shell | | Start tunnels in background | Фоновый туннель | | Manage port forwards | Управление forwards | | Manage tunnels | Список туннелей | | Manage route | Настройка маршрута | | Test connection | Проверка подключения | | Edit | Редактирование сервера | | Delete | Удаление (с подтверждением) | | Import | Импорт из `~/.ssh/config` и обновление списка | | Export | Выход в терминал и печать экспорта | | Vault: lock | Заблокировать vault в текущем процессе | | Vault: change password | Выход в терминал и смена master password | ### Формы (добавление/редактирование) | Клавиша | Действие | |---------|----------| | `Tab` / `↓` | Следующее поле | | `Shift+Tab` / `↑` | Предыдущее поле | | `/` | Выбрать из списка (Auth Method, Group) | | `Enter` | Действие / переход | | `Esc` | Назад / отмена | ### Список forwards | Клавиша | Действие | |---------|----------| | `↑/↓` | Навигация | | `Ctrl+A` | Добавить | | `Enter` / `Ctrl+E` | Редактировать | | `Ctrl+D` | Удалить (с подтверждением) | | `Esc` | Назад | ### Список туннелей | Клавиша | Действие | |---------|----------| | `Ctrl+D` / `s` | Остановить туннель | | `Ctrl+R` / `r` | Обновить список | | `Esc` | Назад | ### Диалог подтверждения | Клавиша | Действие | |---------|----------| | `Enter` / `Y` | Да | | `Esc` / `N` | Нет | --- ## Расположение данных | Данные | Путь | |--------|------| | Конфиг | `~/.config/sshkeeper/config.toml` | | База данных | `~/.local/share/sshkeeper/sshkeeper.db` | | Vault | `~/.local/share/sshkeeper/vault.bin` | | Туннели | `~/.local/share/sshkeeper/tunnels.json` | | OpenSSH config | `~/.ssh/config.d/sshkeeper.conf` | Если заданы `XDG_CONFIG_HOME` или `XDG_DATA_HOME`, данные хранятся в соответствующих поддиректориях. --- ## Сборка и тестирование ```bash # Тесты go test ./... # Сборка go build -o bin/sshkeeper . # Проверка релизной кросс-сборки make release-check # Или через скрипты ./build.sh # сборка в bin/ ./release.sh # релизные архивы в dist/ ``` ## Лицензия MIT. См. [LICENSE](LICENSE).