Привет. Это мой самостоятельный перевод некогда случайно найденной мной оригинальной статьи Upgrade Your SSH Key to Ed25519, автор — Risan Bagja, ныне веб-разработчик из Швеции.
Благодаря ей я когда-то чуть скорректировал свой взгляд на SSH и стал использовать именно такие ключи. В современном мире они без проблем генерируются и принимаются буквально где угодно, без каких-либо настроек. Читатель моего блога, должно быть, заметил, что я использовал этот алгоритм при настройке Termux.
В статье идёт речь о том, как сгенерировать и использовать ключи с алгоритмом, отличным от набившего оскомину RSA, почему следует отказываться от RSA и что даёт этот ваш Ed25519.
Следует обратить внимание на дату оригинальной статьи — ноябрь 2017. За прошедшие до сего момента 5 лет что-то могло существенно измениться.
Далее — текст перевода.
Если вы DevOps-инженер или веб-разработчик, то довольно высока вероятность, что вы уже знакомы с аутентификацией по ключам и давно её используете. Например, для входа на удалённый сервер или при отправке коммитов в репозиторий. Они обеспечивают большую безопасность, чем классическая аутентификация по паролю.
Но когда вы в последний раз создавали или обновляли свой SSH-ключ? А использовали ли вы последний актуальный алгоритм для публичных ключей? Если это произошло более пяти лет назад и вы генерировал ключи с дефолтными настройками, вероятно у вас алгоритм RSA с длиной ключа менее 2048 бит.
Проверьте доступные ssh-ключи на вашем устройстве
Для этого запустите указанную команду в терминале:
for key in ~/.ssh/id_*; do ssh-keygen -l -f "${key}"; done | uniq
Ваши ключи могут использовать следующие алгоритмы:
- DSA: небезопасен и не поддерживается OpenSSH с версии 7.
- RSA: зависит от длины ключа. Если она 3072 или 4096 бит, тогда ещё нормально, но если меньше, то вам следует проапгрейдить их. Длина 1024 бит небезопасна.
- ECDSA: зависит от того как хорошо ваша машина умеет генерировать случайные числа для создания подписи. Также существует проблема достоверности кривых NIST, используемых ECDSA.
- Ed25519: наиболее рекомендованный алгоритм на сегодня.
Некоторые преимущества Ed25519
Алгоритм введён в OpenSSH с версии 6.5. Это реализация EdDSA с использованием скрученных кривых Эдвардса. Там использована криптография на эллиптических кривых, что даёт большую безопасность и производительность по сравнению с DSA или EcDSA. (Прим. пер.: больше информации на русском языке можно узнать здесь.)
Сегодня RSA является наиболее широко распространённым алгоритмом для SSH-ключей. Но по сравнению с Ed25519, он медленнее и менее безопасен при длине ключа менее 2048 бит.
Ключи Ed25519 короче. Они содержат всего 68 символов, в отличие от RSA 3072 с их длиной 544 символа. Генерация ключа настолько же быстрая, как процесс подписи. Также с Ed25519 получается быстрее выполнять пакетную проверку подписей. Он устойчив к коллизиям. Коллизии хэш-функции не сломают систему.
Вы готовы перейти на Ed25519?
Создание ключа Ed25519
Возможно, у вас уже есть несколько ключей на устройстве, поэтому вы можете оставить их и просто сгенерировать новый ключ Ed25519. Таким образом, вы всё ещё сможете заходить на свои удалённые машины, постепенно, один за одним, заменяя на них свои старые авторизованные ключи своим новым алгоритмом.
Откройте терминал и впишите указанную команду для генерации нового ключа:
ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519 -C "john@example.com"
У вас будет запрошена парольная фраза для нового ключа, рекомендуется использовать наиболее сложную. Однако вы можете использовать и ту же, которая задана для старых ключей.
-o
: указывает сохранить приватный ключ с использованием нового OpenSSH формата вместо PEM. На самом деле, эта опция по умолчанию включена при генерации ключа Ed25519.-a
: указывает количество циклов KDF (Key Derivation Function, функции формирования ключа). Высокие значения приведут к замедлению проверки парольной фразы, увеличивая её устойчивость к перебору при краже приватного ключа.-t
: указывает тип создаваемого ключа, в нашем случае это Ed25519.-f
: указывает имя файла для сохранения ключа. Если вы хотите, чтобы ключ подхватывался автоматически вашим SSH-агентом, то он должен быть сохранён в дефолтной директории.ssh
домашней директории вашего пользователя.-C
: указывает комментарий. Он несёт исключительно информационный смысл и может содержать что угодно. Обычно он заполняется данными<login>@<hostname>
того, кто сгенерировал ключ.
Добавление ключа в SSH-агента
Вы можете найти свежесозданный приватный ключ в файле ~/.ssh/id_ed25519
и публичный ключ в файле ~/.ssh/id_ed25519.pub
. Всегда помните, что для аутентификации на удалённых хостах следует прописывать именно публичный ключ.
Прим. пер.: как показывает практика, на ОС Ubuntu 20.* следующие шаги совершенно необязательны и новый ключ подхватывается клиентом автоматически при дефолтных настройках.
Перед добавлением вашего нового приватного ключа в агента, убедитесь в том, что он работает, следующей командой:
eval "$(ssh-agent -s)"
Далее выполните эту команду для добавления ключа Ed25519:
ssh-add ~/.ssh/id_ed25519
Если вы хотите добавить ещё ключи из дефолтной директории .ssh
, просто запустите:
ssh-add
Примечание для пользователей MacOS
Если вы используете MacOS Sierra 10.12.2 или более свежую, для автозагрузки ключей и сохранения парольных фраз в Keychain вам следует скорректировать файл ~/.ssh/config
:
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
IdentityFile ~/.ssh/id_rsa # Keep any old key files if you want
После сохранения конфига добавьте приватный ключ в ваш агент:
ssh-add -K ~/.ssh/id_ed25519
Указание конкретного ключа при кодключении к удалённому серверу
Протокол SSH позволяет клиенту хранить несколько разных ключей и предлагать их серверу при подключении, а он выберет наиболее подходящий. Однако мы можем сразу указать какой именно использовать ключ для аутентификации таким образом:
ssh -i ~/.ssh/id_ed25519 john@198.222.111.33
Либо вы можете добавить в файл ~/.ssh/config
параметры подключения к конкретным серверам:
Host awesome
HostName 198.222.111.33
User john
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
После сохранения конфига вы сможете подключаться к серверам ещё проще:
ssh awesome
Круто, не так ли?