Инструкция по настройке защищенного SSH подключения с использованием SSH ключей.

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

Использование SSH ключа крайне полезно для обеспечения безопасности вашего VPS или безопасносности отправления кода на любой git сервер (github, gitlab, forgejo, codeberg, etc.)

Для его генерации используется команда ssh-keygen. При генерации ключа дается выбор из нескольких видов шифрования. Самыми распространенными видами шифрования для использования в ssh ключе являются rsa и ed25519.

Пример команды для генерации ssh ключа:

ssh-keygen -t ed25519 -a 100

При генерации ключа сначала запросится путь для сохранения ключа на диске (по умолчанию /home/<user>/.ssh/id_ed25519), после - пароль для ключа.

По завершении генерации ключа на экране отобразится отпечаток ключа и randomart изображение. В указанной вами директории для сохранения ключа будут находиться два файла - <имя ключа> и <имя ключа>.pub - первый из которых является приватным ключом, а второй - публичным.

Note

По умолчанию <имя ключа> имеет значение id_<вид шифрования>, т.е., в данном случае, id_ed25519

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

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

Использование ключа

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

  • Для указания ключа (он же файл идентификации) при выполнении команды ssh добавляется аргумент -i, после которого следует указание пути к нужному приватному ключу.

    Пример:

    ssh -i .ssh/id_ed25519 user@server.domain
  • Для указания постоянного использования определенного ключа используется значение IdentityFile в конфиге .ssh/config.

    Пример:

    Host *
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_ed25519

Конфигурация SSH на сервере

Если у вас на сервере существует только root пользователь, обязательно создайте нового, non-root пользователя. (контекстная инструкция - debian)

adduser <username>
apt install sudo
usermod -aG sudo <username>

Info

После завершения настройки ssh на сервере у вас все еще будет доступ к root пользователю, только для логина в него придется использовать команду sudo su -, которая запросит пароль вашего non-root пользователя.

Для настройки безопасного подключения к SSH серверу сначала требуется передать на сервер публичный ключ. Это делается командой ssh-copy-id:

ssh-copy-id -i .ssh/id_ed25519 user@server.domain

В данном случае в качестве файла идентификации используется ключ id_ed25519, сгенерированный по инструкции выше.

При выполнении данной команды ssh запросит у вас пароль для авторизации в указанного юзера на указанном сервере. После успешной авторизации команда завершится, предлагая вам попробовать залогиниться на сервер. Если все сделано и сработало правильно, то при первой же попытке залогиниться в сервер у вас будет запрошен уже не пароль пользователя, а пароль от вашего ключа.

После успешной отправки вашего ключа на сервер можно приступить к настройке sshd на сервере.

Откройте текстовым редактором на сервере файл /etc/ssh/sshd_config. В нем нас интересуют следующие поля:

Include /etc/ssh/sshd_config.d/*.conf
 
Protocol 2 ## Эту строчку надо добавить
 
Port 1111 ## Эту строчку надо раскомментировать, если она закомментирована,
           # и поменять значение 22 на любое случайное четырехзначное число.
           # Главное - не оставлять его стандартным 22
..
PermitRootLogin no ## Раскомментируем строчку и обязательно ставим значение no
..
PubkeyAuthentication yes ## Раскомментируем строчку и
                          # обязательно ставим значение yes - разрешаем авторизацию по ключам
..
PasswordAuthentication no ## Раскомментируем строчку и ставим значение no
                           # - запрещаем авторизацию по паролю
PermitEmptyPasswords no ## Запрещаем пустые пароли

После редактирования описанных выше строк сохраняем изменения в файле, закрываем текстовый редактор и перезапускаем сервис ssh на сервере:

sudo systemctl restart ssh

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

ssh -p 1111 user@server.domain