главная

28 сентября 2026 г.

Безопасное хранение SSH-ключей

В этой статье я хочу рассказать о нескольких способах хранения и использования SSH-ключей, которые мне кажутся более безопасными по сравнению с классическим “держу пару ключей в ~/.ssh”. Первый способ применим к macOS, Windows и Linux, а второй и третий специфичны для macOS.

KeePassXC

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

Для начала создаём новую запись со сгенерированным паролем в KeePassXC. Пароль из неё станет парольной фразой SSH-ключа.

Далее генерируем обычную пару ключей (публичный и приватный):

$ ssh-keygen -t ed25519 -f ~/.ssh/your-key-filename -C "your-key-comment"

На просьбу ввести парольную фразу вводим тот пароль, который сгенерировали в KeePassXC.

Далее:

  1. Заходим в «Настройки -> SSH-агент» и ставим галочку «Включить интеграцию с SSH-агентом».
  2. Переходим в редактирование записи с созданным ранее паролем в KeePassXC
  3. В боковом меню кликаем на “Дополнительные” и жмем “Добавить файл” -> “Загрузить с диска” -> выбираем пару ключей -> загружаем
  4. В боковом меню кликаем на “SSH-агент”, под заголовком “Приватный ключ” выбираем “Вложение” и в выпадающем списке выбираем файл приватного ключа, который мы загрузили на прошлом шаге.
  5. Ставим галочки напротив “Добавить ключ в агент при открытии / разблокировке базы данных” и “Убрать ключ из агента при закрытии / блокировке базы данных”
  6. Сохраняем запись
  7. Стираем с диска приватный ключ

С этого момента приватный ключ хранится в зашифрованной базе KeePass, и он автоматически добавляется в SSH-агент, когда мы открываем приложение и разблокируем БД.

Secure Enclave

Для этого способа нужна версия macOS >= 26 Tahoe и устройство с Touch ID. Кроме того, ключи sk-ecdsa-sha2-nistp256@openssh.com поддерживаются только в OpenSSH 8.2 и новее. На старом сервере ключ из sc_auth молча не сработает.

Современные модели Mac (iPhone/iPad тоже, но сегодня только про маки) поддерживают интересную фичу: с помощью сопроцессора Secure Enclave можно генерировать неизвлекаемый ключ. Особенностью такого ключа будет то, что использовать его можно только через Secure Enclave, подтвердив операцию биометрией (или паролем, это конфигурируемо).

Кроме того, OpenSSH может работать с таким ключом через ssh-keychain.dylib как с FIDO/security-key. Каждое подключение подтверждается пальцем, а сам ключ никогда не покидает Secure Enclave.

Создаем ключ

В macOS есть встроенная утилита — sc_auth. Она помогает работать с пользовательскими ключами. Создать ключ можно с помощью команды:

$ sc_auth create-ctk-identity -k p-256-ne -t bio -l '<name>'

Тут:

Проверим, что ключ создан:

$ sc_auth list-ctk-identities
Key Type Public Key Hash                          Prot Label   Common Name Email Address Valid To       Valid
p-256-ne 96162668E4BA52B0728C40D8E463D42BE978CBDC bio  <name>  <name>                      9/28/27, 19:49 YES

Интегрируем с SSH

Есть два способа, как использовать сгенерированный ключ с SSH: через SSH-агент или выгрузкой ссылки на ключ в файл.

Использование через SSH-агент

Для того чтобы добавить в SSH-агент ключи, сгенерированные Secure Enclave, используем команду:

$ ssh-add -K -S /usr/lib/ssh-keychain.dylib

Команда попросит ввести PIN, можно просто нажать Enter. После этого проверяем вывод команды ssh-add -L. Там должна появиться строка вида:

sk-ecdsa-sha2-nistp256@openssh.com ...

Копируем эту строку в файл ~/.ssh/authorized_keys на сервере. После этого подключение к серверу потребует сканирования отпечатка пальца. Стоит отметить, что при перезагрузке агента команду ssh-add -K -S придется вводить заново.

Сохранение ссылки на ключ в файл

Чтобы выгрузить публичный ключ и ссылку на приватный, воспользуемся командой:

$ cd ~/.ssh
$ ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N ""

Опять вводим PIN или просто нажимаем Enter. В итоге в папке ~/.ssh появятся два файла:

  1. id_ecdsa_sk_rk.pub — публичный ключ, его мы копируем в ~/.ssh/authorized_keys на удаленном сервере.
  2. id_ecdsa_sk_rk — приватный ключ ссылка на приватный ключ.

Чтобы воспользоваться приватным ключом для авторизации на сервере, команде ssh нужно передать настройку SecurityKeyProvider=/usr/lib/ssh-keychain.dylib:

$ ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib -i ~/.ssh/id_ecdsa_sk_rk myserver

Её также можно задать в ~/.ssh/config:

Host myserver
    SecurityKeyProvider /usr/lib/ssh-keychain.dylib
    IdentityFile ~/.ssh/id_ecdsa_sk_rk

Или через переменную окружения SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib.

Secretive

Secretive — это, можно сказать, user-friendly альтернатива описанному ранее способу с sc_auth. Скачать его можно с GitHub: https://github.com/maxgoedjen/secretive. В отличие от sc_auth, Secretive не требует macOS 26 и может работать с более старыми версиями операционной системы. Кроме того, он создаёт обычные ключи ecdsa-sha2-nistp256, а не sk-ecdsa-sha2-nistp256@openssh.com, поэтому они работают и на серверах со старыми версиями OpenSSH.

При запуске приложение покажет, что нужно включить для его использования, и предложит варианты интеграции с разными инструментами (нас интересует в первую очередь SSH). После онбординга нужно:

  1. Создать новый секрет (кнопка + в правом верхнем углу, либо меню Файл -> Новый секрет).
  2. Дать секрету имя, а в уровне защиты выбрать “Требовать аутентификацию”.
  3. Скопировать на удаленный сервер публичный ключ (отображается в приложении).
  4. В ~/.ssh/config добавить для нужного хоста строку вида:
    Host myserver
        IdentityAgent ~/Library/Containers/com.maxgoedjen.Secretive.SecretAgent/Data/socket.ssh
    

После этого подключение к этому хосту будет требовать аутентификации через Secretive.

Итог

Выбирайте способ, который вам больше подходит, а еще лучше — комбинируйте! Ключ из Secure Enclave нельзя сохранить в резервную копию, поэтому обязательно имейте запасной вариант доступа, например, через SSH-ключ в базе данных KeePass (ведь зашифрованную базу можно выгрузить на внешний диск или даже в iCloud).

Надеюсь, эта статья была полезна. Хорошего дня!