Генерация 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 порт для лучшей безопасности.