В одном посте 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.