В одном посте Telegram канала меня привлекла запись, что создавать ключи SSH небезопасно выбирая RSA менее 1024 бит, рекомендуют использовать протокол Ed25519 (Ed25519 — схема подписи EdDSA использующая SHA-512 и Curve25519) и еще у него один из плюсов, что приватные и публичные ключи получаются менее (содержат всего 68 символов, в отличие от RSA 3072 с их длиной 544 символа.) длинными.

Свое знакомство в данной заметке я предпочту для начала использовать на LTS релизах Ubuntu, к примеру, сейчас на Ubuntu 22.04 Server.

ekzorchik@srv-home:~$ ssh -V
OpenSSH_8.9p1 Ubuntu-3ubuntu0.5, OpenSSL 3.0.2 15 Mar 2022
ekzorchik@srv-home:~$

Шаг №1: За доступ к системе через SSHключи (не забываем отключить вход по связки логин и пароль) отвечает параметр (в конфигурационном файле: sshd_config)

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
PasswordAuthentication no

Шаг №2: Чтобы проверить доступные SSHключи на текущей системе:

ekzorchik@srv-home:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ekzorchik/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ekzorchik/.ssh/id_rsa
Your public key has been saved in /home/ekzorchik/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:UC4P73sqTb2T/rxaXBKaOydG34cTR4rfQ4giIl4XL7A ekzorchik@srv-home
The key's randomart image is:
+---[RSA 3072]----+
|        .        |
|       o         |
|     .+..   .   .|
|      o*o  o.o.o |
|   . E +S++.o.+..|
|  . o o.+.o+ =.= |
|   .   o. =o= =.o|
|      . .o=*   o.|
|       .o+o++.   |
+----[SHA256]-----+
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ for key in ~/.ssh/id_*; do ssh-keygen -l -f "${key}"; done | uniq
3072 SHA256:UC4P73sqTb2T/rxaXBKaOydG34cTR4rfQ4giIl4XL7A ekzorchik@srv-home (RSA)
ekzorchik@srv-home:~$

На заметку:

  • DSA: небезопасен и не поддерживается OpenSSH с версии 7.
  • RSA: зависит от длины ключа. Если она 3072 или 4096 бит, тогда ещё нормально, но если меньше, то вам следует проапгрейдить их. Длина 1024 бит небезопасна.
  • ECDSA: зависит от того как хорошо ваша машина умеет генерировать случайные числа для создания подписи. Также существует проблема достоверности кривых NIST, используемых ECDSA.
  • Ed25519: наиболее рекомендованный алгоритм на сегодня.

Шаг №3: Чтобы создать ключ Ed25519:

ekzorchik@srv-home:~$ ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519 -C "ekzorchik@srv-home"
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): задаю пароль на доступ к приватному ключу, в рамках текущей заметки указываю, к примеру 712mbddr@
Enter same passphrase again: подтверждаю задаваемый пароль на доступ к приватному ключу.
Your identification has been saved in /home/ekzorchik/.ssh/id_ed25519
Your public key has been saved in /home/ekzorchik/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:sdLs802sPsrrkNu9yQ6iOd8M1L02ujtwcSRPWWtntEE ekzorchik@srv-home
The key's randomart image is:
+--[ED25519 256]--+
|           o..E  |
|        . +  o o |
|        .=  o +  |
|       +.+o. o   |
|      o So.      |
|     ..+.  o     |
|      =o+ + o    |
|    .o X.O.*     |
|    ooo.%OXo.    |
+----[SHA256]-----+

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

  • -o : указывает сохранить приватный ключ с использованием нового OpenSSH формата вместо PEM. На самом деле, эта опция по умолчанию включена при генерации ключа Ed25519.
  • -a : указывает количество циклов KDF (Key Derivation Function, функции формирования ключа). Высокие значения приведут к замедлению проверки парольной фразы, увеличивая её устойчивость к перебору при краже приватного ключа.
  • -t : указывает тип создаваемого ключа, в нашем случае это Ed25519.
  • -f : указывает имя файла для сохранения ключа. Если вы хотите, чтобы ключ подхватывался автоматически вашим SSH-агентом, то он должен быть сохранён в дефолтной директории "~/.ssh" домашней директории вашего пользователя.
  • -C : указывает комментарий. Он несёт исключительно информационный смысл и может содержать что угодно. Обычно он заполняется данными <login>@<hostname> того, кто сгенерировал ключ

На заметку: Для аутентификации на удаленных системах через ключи на удаленной системе прописываем публичный ключ, не приватный.

ekzorchik@srv-home:~$ for key in ~/.ssh/id_*; do ssh-keygen -l -f "${key}"; done | uniq
256 SHA256:sdLs802sPsrrkNu9yQ6iOd8M1L02ujtwcSRPWWtntEE ekzorchik@srv-home (ED25519)
3072 SHA256:UC4P73sqTb2T/rxaXBKaOydG34cTR4rfQ4giIl4XL7A ekzorchik@srv-home (RSA)
ekzorchik@srv-home:~$

Шаг №4: Копируем на удаленную систему публичный ключ в основе которого лежит тип созданного ключа – это Ed25519:

  • srv-home (Текущая система) (172.33.33.117)
  • srv-vpn (172.33.33.126)
ekzorchik@srv-vpn:~$ sudo nano /etc/ssh/sshd_config
Include /etc/ssh/sshd_config.d/*.conf
Port 22
PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
PasswordAuthentication yes
PermitEmptyPasswords no
KbdInteractiveAuthentication no
UsePAM yes
AllowTcpForwarding yes
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp  /usr/lib/openssh/sftp-server
AllowGroups sshauth
ekzorchik@srv-vpn:~$ sudo service ssh restart

Копирую публичный ключа с srv-home на srv-vpn:

ekzorchik@srv-home:~$ ssh-copy-id -i ~/.ssh/id_ed25519.pub ekzorchik@172.33.33.126
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ekzorchik/.ssh/id_ed25519.pub"
The authenticity of host '172.33.33.126 (172.33.33.126)' can't be established.
ED25519 key fingerprint is SHA256:ZsYY5t/AOFxxZ4RHjM/ST60hVbC82nPT9iY3b5Eqyrc.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ekzorchik@172.33.33.126's password: ввожу пароль на учетную запись Login: ekzorchik удаленной системы 172.33.33.126 (т.е srv-vpn)

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'ekzorchik@172.33.33.126'"
and check to make sure that only the key(s) you wanted were added.

ekzorchik@srv-home:~$

Проверяю, что, подключившись по ключу с srv-home к srv-vpn могу, к примеру, выполнить определенную команду:

ekzorchik@srv-home:~$ ssh ekzorchik@172.33.33.126 "uname -a"
Enter passphrase for key '/home/ekzorchik/.ssh/id_ed25519': запрашивается пароль на использование приватного ключа, я его задал когда создавал связку публичный и приватный ключ на основе протокола Ed25519, к примеру у меня это 712mbddr@
Linux srv-vpn 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
ekzorchik@srv-home:~$

Итого, все работает также, как если бы я использовал дефолтный ключ RSA (3072) и копировал бы его на удаленную систему (ssh-copy-id -i ~/.ssh/id_rsa.pub ekzorchik@172.33.33.126).

На этом вот такая вот заметка завершена, я приобщился к использованию протокола Ed25519, постараюсь впредь использовать только его.

Если создавать связку публичный и приватный ключ через утилиту PuTTY Key Generator, то с учетом данных этой заметки на этапе генерации теперь буду указывать:

  • Type of key to generate: EdDSA
  • Curve to use for generating this key: Ed25519 (255 bits)

а уже после нажимать Generate (Generate a public/private key pair) + если возникнет надобность подключаться с Ubuntu системы, то не забывать пересохранить приватный ключ, на этот счет см. заметки:

На заметку: При подключении с Windows системы версия клиента Putty.exe должна быть не ниже 0.78, а лучше использовать самую последнюю, т.к. сегодня (13.03.2024) был случай когда настраивали доступ по ключу в момент подключения пишет:

Unable to load key file "D:\go-prj\klisuns@srv-us2204a.firma.local_private_key.ppk" (PuTTY key format too new)

Usingn username "klisuns"

klisuns@srv-us2204a.firma.local's password: - т.е. не воспринимается ключ, идет запрос на пароль, хотя используется доступ исключительно по ключам.

Все дело было в версии Putty.exe, у него стояла 0.73, поставил 0.80 и сразу все заработало, а я использую 0.78 и тоже работает, но после я обновился, чтобы все было самое актуальное.

С уважением автор блога Олло Александр aka ekzorchik.