metalnikovg.ru
MetalnikovG.ru

Генерация SSH ключей, копирование и использование их для подключения

Опубликовано
Опубликовано
//
6 мин. чтения

Введение

Использование SSH-ключей — простой и надежный способ обеспечения безопасности соединения с сервером.  В отличие от пароля, взломать SSH-ключ практически невозможно. Сгенерировать SSH-ключ очень просто.

Генерация SSH ключей для Linux

Проверка доступных SSH ключей на устройстве:

for key in ~/.ssh/id_*; do ssh-keygen -l -f "${key}"; done | uniq

Ваши ключи могут использовать следующие алгоритмы:

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

Откройте терминал и выполните команду для генерации пары ключей RSA длиной 4096 бит:

ssh-keygen -t rsa -b 4096

Через флаг -t задаём алгоритм, на основе которого будут сгенерированы ключи, а через -b количество бит в сгенерированном ключе

Для генерации Ed25519 ключей выполните:

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

С помощью флага -f можно задать путь и имя файла, а с помощью -C комментарий ключа. По умолчанию комментарий будет иметь вид your_username@you_machine_name. Для удобства рекомендуется использовать более понятные комментарии. Комментарий в конце ключа не обязателен для корректной работы ключа, поэтому вы всегда можете изменить его.

На консоль будет выведен следующий диалог c предложением ввести имя файла в который будет сохранен ключ:

Enter file in which to save the key (/home/user/.ssh/id_rsa):

Нажмите на клавишу Enter чтобы оставить имя по умолчанию.  Далее система предложит ввести кодовую фразу для дополнительной защиты SSH-подключения:

Enter passphrase (empty for no passphrase):

Рекомендуется задать парольную фразу для повышения безопасности, если хотите пропустить это, нажмите клавишу Enter.

Ваш ключ SSH — это всего лишь крошечный файл на диске. Если ваш компьютер когда-либо будет утерян, украден или каким-либо образом скомпрометирован злоумышленником, файл будет довольно легко скопировать. Без шифрования с помощью парольной фразы его можно использовать напрямую. И если у кого-то есть доступ к вашему закрытому ключу SSH, у него, вероятно, есть доступ к вашей истории, и он будет знать, где его использовать.

Таким образом, важно защитить свой закрытый ключ SSH с помощью подходящей парольной фразы.

TIP

Вы можете использовать SSH агент чтобы вам не приходилось вводить парольную фразу каждый раз, когда вам нужно использовать ключ.

После этого ключ будет создан, а на консоль будет выведено следующее сообщение:

Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
476:b2:a8:7f:08:b4:c0:af:81:25:7e:21:48:01:0e:98 user@localhost
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
476:b2:a8:7f:08:b4:c0:af:81:25:7e:21:48:01:0e:98 user@localhost

The key's randomart image is:

+--[ RSA 2048]----+

|+.o.             |

|ooE              |

|oo               |

|o.+..            |

|.+.+..  S .      |

|....+  o +       |

|  .o ....        |

|  .  .. .        |

|    ....         |

+-----------------+

Далее выполните в терминале команду:

cat ~/.ssh/id_rsa.pub

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

Указание конкретного ключа при подключении к удалённому серверу

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

ssh -i ~/.ssh/id_ed25519 user@198.168.78.33

TIP

Вы можете использовать файл конфигурации SSH для того чтобы не делать это каждый раз вручную.

Копирование публичного ключа SSH на сервер

Выполните в терминале следующую команду, указав вместо user имя пользователя, созданного на сервере, а вместо server — IP-адрес вашего сервера.

Для Linux:

ssh-copy-id user@server

С флагом -p можно задать порт подключения SSH если ранее вы изменили его на другой а с помощью -i указать путь к ключу который мы хотим скопировать на сервер.

Например:

ssh-copy-id -p 2222 -i ~/.ssh/id_rsa user@server

Так же можно скопировать содержимое id_rsa.pub в файл authorized_keys, добавив его в конец файла:

cat id_rsa.pub >> ~/.ssh/authorized_keys

Для Windows:

type $env:USERPROFILE\.ssh\id_rsa.pub | ssh user@server "cat >> .ssh/authorized_keys"

Например:

type $env:USERPROFILE\.ssh\id_rsa.pub | ssh root@213.171.8.153 "cat >> .ssh/authorized_keys"

В результате содержимое файла с публичным ключом id_rsa.pub будет скопировано в файл ~/.ssh/authorized_keys на сервере

Настройка конфигурации OpenSSH для авторизации по ключу

После того как вы скопировали ключ на сервер необходимо внести изменения в конфигурацию OpenSSH на сервере, чтобы включить авторизацию по ключу и отключить авторизацию по паролю:

Откройте файл конфигурации OpenSSH:

nano /etc/ssh/sshd_config

Найдите и раскомментируйте следующие строки, чтобы активировать авторизацию по ключу, отключить нежелательные методы и полностью отключить авторизацию по паролю:

PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
HostbasedAuthentication no
PermitEmptyPasswords no
PasswordAuthentication no

NOTE

В Ubuntu 24.04 этот параметр может быть переопределён в отдельном конфигурационном файле /etc/ssh/sshd_config.d/50-cloud-init.conf. Внесите изменение там, если правка sshd_config не работает.

Если вы хотите использовать RSA ключ, то для Ubuntu 24.04 может потребоваться добавить следующий параметр, чтобы гарантировать поддержку алгоритма RSA:

PubkeyAcceptedAlgorithms +ssh-rsa

Настройка прав доступа на файлы ключей

Обеспечьте правильные права доступа к директориям и файлам SSH, чтобы только текущий пользователь мог их читать:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Изменение стандартного порта для SSH-подключения в Ubuntu и Debian

По умолчанию SSH-сервер принимает входящие подключения на TCP-порт 22. Этот порт хорошо известен, и злоумышленники часто атакуют его, пытаясь подобрать пароли (bruteforce). Изменение порта снижает риск таких атак, делая ваш сервер менее заметным для автоматизированных сканеров.

Убедитесь, что на вашем сервере установлены net-tools для проверки доступных портов:

sudo apt install net-tools

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

sudo ss -tuln | grep LISTEN

Для большинства версий Ubuntu и Debian откройте файл sshd_config и внесите изменения:

sudo nano /etc/ssh/sshd_config

Найдите строку #Port 22, уберите # и замените 22 на выбранный вами порт, например:

Port 2222

Сохраните файл и перезапустите SSH:

sudo systemctl restart ssh

NOTE

В Ubuntu 24.04 настройка порта требует изменений в двух местах: в основном файле sshd_config и в файле конфигурации сокета SSH.

Откройте файл конфигурации сокета SSH:

sudo nano /lib/systemd/system/ssh.socket

Найдите параметр ListenStream=22 и замените его на ваш новый порт:

ListenStream=2222

Сохраните изменения и выполните перезагрузку:

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
sudo systemctl restart ssh

Так же для безопасности рекомендуется закрыть неиспользуемые порты с помощью UFW.

Проверка подключения

Теперь SSH-сервер будет принимать подключения на новом порту. Подключитесь по новому порту, чтобы проверить доступ, и завершите настройку.

ssh -p 2222 username@server

Заключение

Мы сгенерировали SSH ключ, скопировали его на удаленный сервер, настроили авторизацию по нему и изменили стандартный SSH порт для лучшей безопасности.