В этой статье я хочу рассказать о нескольких способах хранения и использования 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.
Далее:
- Заходим в «Настройки -> SSH-агент» и ставим галочку «Включить интеграцию с SSH-агентом».
- Переходим в редактирование записи с созданным ранее паролем в KeePassXC
- В боковом меню кликаем на “Дополнительные” и жмем “Добавить файл” -> “Загрузить с диска” -> выбираем пару ключей -> загружаем
- В боковом меню кликаем на “SSH-агент”, под заголовком “Приватный ключ” выбираем “Вложение” и в выпадающем списке выбираем файл приватного ключа, который мы загрузили на прошлом шаге.
- Ставим галочки напротив “Добавить ключ в агент при открытии / разблокировке базы данных” и “Убрать ключ из агента при закрытии / блокировке базы данных”
- Сохраняем запись
- Стираем с диска приватный ключ
С этого момента приватный ключ хранится в зашифрованной базе 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>'
Тут:
-k p-256-ne: тип ключа.- p-256 — эллиптическая кривая NIST P-256 (ECDSA). Это единственная кривая для ECDSA-ключей в Secure Enclave, и OpenSSH поддерживает её как security key.
-neозначает non-exportable: ключ генерируется внутри Secure Enclave, и его нельзя извлечь или скопировать, даже с правами root. Потеряли Mac или стёрли его — ключ пропал навсегда.
-t bio: политика доступа к ключу.bioозначает, что каждая операция с ключом (подпись, например при SSH-подключении) требует подтверждения биометрией, то есть Touch ID.-l '<name>': метка (label), то есть имя ключа, просто произвольное название.
Проверим, что ключ создан:
$ 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 появятся два файла:
id_ecdsa_sk_rk.pub— публичный ключ, его мы копируем в~/.ssh/authorized_keysна удаленном сервере.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). После онбординга нужно:
- Создать новый секрет (кнопка
+в правом верхнем углу, либо менюФайл->Новый секрет). - Дать секрету имя, а в уровне защиты выбрать “Требовать аутентификацию”.
- Скопировать на удаленный сервер публичный ключ (отображается в приложении).
- В
~/.ssh/configдобавить для нужного хоста строку вида:Host myserver IdentityAgent ~/Library/Containers/com.maxgoedjen.Secretive.SecretAgent/Data/socket.ssh
После этого подключение к этому хосту будет требовать аутентификации через Secretive.
Итог
Выбирайте способ, который вам больше подходит, а еще лучше — комбинируйте! Ключ из Secure Enclave нельзя сохранить в резервную копию, поэтому обязательно имейте запасной вариант доступа, например, через SSH-ключ в базе данных KeePass (ведь зашифрованную базу можно выгрузить на внешний диск или даже в iCloud).
Надеюсь, эта статья была полезна. Хорошего дня!