notby.NET Logo

Авторизация SSH через ключ

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

В статье будет затрагиватся только авторизация через ключ, то как настроить SSH сервер в Linux / FreeBSD и подключение к нему с разных устройств читай https://notby.net/nastroyka-ssh-servera-v-linux-freebsd

1. Создание SSH-ключей

Создание приватного и публичного ключа происходит через утилиту ssh-keygen на локальном компьютере. Утилита по умолчанию уже установлена в Linux / FreeBSD / Windows 10+. Для телефона (Android) существует приложение ConnectBot. Устанавливаем его из F-Droid или Google Play если необходимо.

Используй алгоритм Ed25519 для генерации ключей. Он самый быстрый, безопасный и современный.

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

1.1. Генерация ключей в Linux / FreeBSD

Запускаем процесс создания ключей

ssh-keygen -t ed25519

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

По умолчанию ключи создаются в каталоге ~/.ssh (~ — домашний каталог пользователя). Оставляем без изменения чтобы ключ автоматически подхватывался при подключении к SSH-серверу.

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

Создание ключей командой  "ssh-keygen -t ed25519" в Debian. Ключи успешно созданы.

Успешно создан приватный ключ /home/user/.ssh/id_ed25519 и публичный ключ /home/user/.ssh/id_ed25519.pub, где user имя пользователя.

1.2. Генерация ключей в Windows

Открываем PowerShell и запускаем процесс создания ключей

ssh-keygen -t ed25519

Процесс происходит аналогично как в Linux.

Создание ключей в PowerShell командой  "ssh-keygen -t ed25519" в Windows 11. Ключи успешно созданы.

Успешно создан приватный ключ C:\Users\User\.ssh\id_ed25519 и публичный ключ C:\Users\User\.ssh\id_ed25519.pub, где User имя пользователя.

1.3. Генерация ключей в Android

Устанавливаем приложение ConnectBot из F-Droid или Google Play и запускаем.

Нажимаем и выбираем Управление открытыми ключами. Нажимаем + (Добавить новый публичный ключ).

Приложение ConnectBot (Android), процесс создания новой пары ключей для SSH.

Псевдоним: Android (имя ключа, любое) 
Тип: Ed25519 (алгоритм шифрования) 
Бит: (не поддерживается для Ed25519) 
Пароль: (защита ключа паролем, оставляем пустой если не нужна) 
Загружать ключ при старте: ∨(ключ автоматически будет загружатся при запуске приложения и использоватся всеми подключениями)

Нажимаем ГЕНЕРИРОВАТЬ и водим пальцем по экрану до завершения создания ключей.

2. Перенос публичного ключа на сервер

2.1. Утилита ssh-copy-id в Linux / FreeBSD

Утилита установлена и доступна только в Linux / FreeBSD. Через эту утилиту происходит автоматическое копирование публичного ключа на SSH сервер. Также проходит проверка ключа и наличии дубликата.

Копируем публичный ключ на сервер

ssh-copy-id -i ~/.ssh/id_ed25519.pub root@80.95.110.25

Параметр -i указывает путь до публичного ключа который ранее был создан, root - логин пользователя SSH сервера, 80.95.110.25 - адрес сервера (IP адрес).

Если SSH сервер имеет порт отличный от стандартного 22 порта, то добавляем параметр -p с указанием порта (обязательно перед пользователь@IP-адрес).

ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 root@80.95.110.25

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

Debian. Приватный ключ успешно добавлен на SSH сервер через утилиту ssh-copy-id.

Пробуем подключится

ssh root@80.95.110.25

Должна пройти авторизации через ключ. Будет запрошен пароль от ключа если указывался.

Если приватный ключ находится в нестандартном месте, но необходимо при подключении добавить параметр -i и указать путь до ключа.

ssh -i /home/user/Documents/id_ed25519 root@80.95.110.25

2.2. Перенос ключа командой в Windows 10/11

В Windows 10/11 нет утилиты для автоматического переноса публичного ключа на SSH сервер.

Открываем PowerShell и выполняем команду

type $env:USERPROFILE/.ssh/id_ed25519.pub | ssh root@80.95.110.25 "mkdir -m 0700 -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 0600 ~/.ssh/authorized_keys"

Данная команда сработает в следующий последовательности:

  1. считает содержимое публичного ключа C:\Users\User\.ssh\id_ed25519.pub, где User имя пользователя.
  2. подключится к SSH серверу по адресу 80.95.110.25 от root пользователя
  3. необходимо будет ввести пароль для авторизации SSH
  4. если не существует каталог .ssh в домашней директории SSH-пользоталея(в моем случае это root), то он будет создан с правами 0700
  5. будет дописана строчка с публичным ключом который был считан в 1 пункте в файл ~/.ssh/authorized_keys
  6. изменит права доступа на 0600 к файлу authorized_keys
  7. закроет соединение с SSH сервером.

Пробуем подключится

ssh root@80.95.110.25

Должна пройти авторизации через ключ. Будет запрошен пароль от ключа если указывался.

Если приватный ключ находится в нестандартном месте, но необходимо при подключении добавить параметр -i и указать путь до ключа.

ssh -i "C:\Users\User\Documents\key" root@80.95.110.25

2.3. Копирование ключа вручную

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

В операционных системах, где создавали ключи через ssh-keygen откроем текстовым редактором файл публичного ключа id_ed25519.pub и скопируем его строку.

В случае с телефоном, в приложении ConnectBot открываем раздел Управление открытыми ключами, держим пальцем на ключе и выбираем Копирование открытого ключа.

Подключаемся к серверу

ssh root@80.95.110.25

После подключения мы оказываемся в домашнем каталоге пользователя от которого подключились.

Проверяем что каталог .ssh существует с правами rwx только для владельца(в моем случае root)

ls -lh
drwx------  2 root wheel  512B Feb  4 09:06 .ssh

Если каталог .ssh отсутствует, создаем его и выставляем 0700 права доступа

mkdir  -p .ssh
chmod 0700 .ssh

Переходим в каталог .ssh

cd .ssh

Открываем файл authorized_keys (если файл не существует, текстовый редактор nano создаст его)

nano authorized_keys

Вставляем ранее скопированный публичный ключ в файл.

Редактирование файла authorized_keys через текстовый редактор nano в FreeBSD. В файле три публичных ключа в три строчки.

Каждая строка в файле authorized_keys это отдельный публичный ключ. Для каждого устройства должен быть свой ключ, так правильнее.

Сохраняем файл.

Проверяем что у файла authorized_keys права только чтение и запись для владельца.

ls -lh
-rw-------  1 root wheel  279B Feb  4 10:33 authorized_keys

Если права файла другие, изменяем их

chmod 0600 authorized_keys

Пробуем подключится через OpenSSH клиент

ssh root@80.95.110.25

Или пробудем с телефона через приложения ConnectBot

Выбираем подключение к SSH серверу и пробуем подключит. Если при создании ключа была поставлена галочка “Загружать ключ при старте”, то ключ автоматически будет подцеплятся ко всем подключениям.

Если ключ защищен пароль, его необходимо предварительно разблокировать в разделе со списком ключей.

Чтобы указать ключ только для конкретного SSH сервера, нажимаем пальцем и держим на подключение, в открывшимся меню выбираем Редактировать сервер

В параметре Использовать авторизацию по открытому ключу выбираем необходимый ключ авторизации (в моем случае это Android).

Приложение ConnectBot (Android), процесс редактирование подключения SSH, выбор ключа авторизации.

Сохраняем параметры подключения. Теперь при подключении будет использоватся выбранный ключ авторизации.

3. Отключение авторизации по паролю

Если больше авторизации через пароль на SSH сервере ну нужна, её можно для безопасности полностью отключить.

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

Заходим на сервер и открываем файл конфигурации SSH сервера

nano /etc/ssh/sshd_config

Изменяем следующие параметры

# Встроенную авторизацию по паролю
PasswordAuthentication no
# Авторизация по паролю через keyboard-interactive authentication.
KbdInteractiveAuthentication no

Вносим необходимые изменения, сохраняем файл.

Перезапускаем OpenSSH сервер в Linux / FreeBSD

service sshd restart

Попробуем подключится к SSH серверу с устройства на котором нет ключа, в ответ будет выведено сообщение Permission denied (publickey). и оно означает что возможна авторизация только через публичный ключ.

Авторизация через пароль полностью отключена. Теперь авторизоватся на SSH серверу можно только ключ.