Предыстория Link to heading

Долгое время хранил SSH-ключи в виде файлов на диске. Это неудобно и небезопасно: файлы могут быть украдены, забыты на разных устройствах, да и бэкапить их — отдельная головная боль.

Пользуюсь Bitwarden, а точнее Vaultwarden сервером с десктопным клиентом на компе. Через него храню пароли, TOTP и т.д. Но в Bitwarden можно хранить ещё и SSH-ключи, а встроенный SSH Agent позволяет использовать их без сохранения на диск.

Зачем это нужно? Link to heading

  • Безопасность — приватные ключи не лежат в файлах на диске
  • Централизованное хранение — все ключи в одном месте, с доступом со всех устройств
  • Автоматизация — SSH сам перебирает ключи, правда Bitwarden не сопоставляет ключи по имени хоста. Он просто предлагает все доступные ключи по очереди. Сервер сам выбирает подходящий.
  • Синхронизация — добавил ключ в Bitwarden, и он доступен на всех устройствах

Что понадобится Link to heading

  • Bitwarden Desktop для macOS. Поставить его можно через Homebrew: brew install bitwarden
  • Немного свободного времени

Шаг 1: Включаем SSH Agent в Bitwarden Link to heading

  1. Открываем Bitwarden Desktop приложение
  2. Переходим в Settings → SSH Agent
  3. Включаем опцию “Enable SSH Agent”

После включения Bitwarden создаст Unix-сокет для работы с SSH. На macOS путь к сокету:

~/.bitwarden-ssh-agent.sock

Шаг 2: Добавляем SSH-ключи в Bitwarden Link to heading

  1. В Bitwarden создаём новый элемент типа SSH Key

Публичный ключ при этом должен быть добавлен на серверы в ~/.ssh/authorized_keys — как обычно.

Шаг 3: Настраиваем окружение Link to heading

Теперь нужно указать системе использовать сокет Bitwarden вместо стандартного SSH-агента macOS.

Открываем ~/.zshrc и добавляем:

export SSH_AUTH_SOCK="$HOME/.bitwarden-ssh-agent.sock"

Применяем изменения:

source ~/.zshrc

Шаг 4: Обновляем SSH config Link to heading

Открываем ~/.ssh/config и убираем IdentityFile (если у вас были уже добавлены, если нет, добавляем с нуля) для хостов, которые будут использовать ключи из Bitwarden.

Было:

Host LinuxServer
    Hostname 192.168.1.11
    user root
    port 22
    IdentityFile ~/LinuxServer.key

Должно стать:

Host LinuxServer
    Hostname 192.168.1.11
    user root
    port 22
    AddKeysToAgent yes

Bitwarden SSH Agent сам предложит все доступные ключи при подключении.

Шаг 5: Проверяем работу Link to heading

Перед проверкой убедитесь, что Bitwarden запущен и разблокирован. Ключи доступны только после разблокировки хранилища.

Проверяем, что Bitwarden отдал ключи:

ssh-add -l

Вывод должен показать ключи из Bitwarden:

256 SHA256:i0DqblPzC/00lDAJzetqI53EYzzr+DF@#CDFDF@ LinuxServer (ED25519)
256 SHA256:uFCDz4H6b+dfYb+Od4VilIlOF7FZKCwNA99PgdXdyj0 LinuxServer2 (ED25519)

Подключаемся к серверу:

ssh LinuxServer

Примечание: После подключения в Bitwarden-клиенте появится запрос на разрешение использования ключа. Но если надоедает это, можно поставить настройку, чтобы не спрашивал, пока не будет заблокировано хранилище.

Как это работает Link to heading

  1. При подключении SSH (ssh LinuxServer) сервер отправляет список допустимых ключей
  2. Bitwarden SSH Agent получает запрос и перебирает все разблокированные SSH-ключи
  3. Сервер принимает тот ключ, который есть в ~/.ssh/authorized_keys

Важно: Bitwarden не сопоставляет ключи по имени хоста. Он просто предлагает все доступные ключи по очереди. Сервер сам выбирает подходящий.

Заключение Link to heading

Теперь все SSH-ключи хранятся только в Bitwarden, без файлов на диске. Подключение происходит автоматически, без лишних действий.

Это безопаснее, удобнее и проще в управлении. Особенно если у вас много ключей для разных серверов.