Бесплатная миграция IT-инфраструктуры в облако

Как настроить аутентификацию на основе ключей SSH на сервере Linux

Миша Курушин
Миша Курушин
Технический писатель
27 ноября 2024 г.
25
12 минут чтения
Средний рейтинг статьи: 5

SSH («Secure Socket Shell» или «Безопасная оболочка сокета») — это защищенный сетевой протокол, с помощью которого можно безопасно подключаться к удаленным серверам и выполнять произвольные команды.

Говоря проще, SSH предоставляет защищенную (зашифрованную и аутентифицированную) оболочку командной строки для взаимодействия нескольких удаленных хостов друг с другом.

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

По этой причине SSH-протокол идеально подходит для управления обширной сетевой инфраструктурой.

Соответственно, в момент SSH-соединения существует две стороны:

  • Сервер. Это постоянно работающий демон, размещенный на удаленной машине, который прослушивает 22 порт и обрабатывает команды от авторизованных пользователей.

  • Клиент. Это утилита, запущенная на локальной машине, через которую выполняется подключение и отправка консольных команд удаленному серверу.

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

Все показанные в этом руководстве примеры запускаются на облачном сервере Timeweb Cloud под управлением операционной системы Ubuntu 22.04.

Установка SSH

В операционных системах на базе Linux существует бесплатная утилита для работы с SSH-протоколом — OpenSSH. С помощью нее можно создавать как SSH-клиенты, так и SSH-серверы.

В некоторых дистрибутивах OpenSSH по умолчанию отсутствует, поэтому ее потребуется установить вручную. Для этого сперва необходимо обновить список актуальных репозиториев пакетного менеджера APT:

sudo apt update

После чего выполнить установку OpenSSH:

sudo apt install ssh

Далее можно проверить возможность совершать SSH-подключения:

ssh

Если SSH присутствует в системе, то в консольном терминале появится короткая справка по доступных командам:

usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command [argument ...]]

Для проверки, активен ли SSH-сервер, можно попытаться выполнить подключение по SSH к локальному хосту:

ssh localhost

Если сервер запущен, то в консольном терминале появится сообщение, требующее ввести root-пароль:

root@localhost's password:

Либо можно запросить статус SSH-службы:

sudo service ssh status

Если сервер активен, то в терминале появится соответствующее сообщение со статусом состояния «Active»:

 ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-11-20 12:09:02 MSK; 2 days ago

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

В SSH-протоколе существует несколько способов авторизации (аутентификации):

Способ

Настройка

Авторизация

Пароль

Не требуется

Ввод пароля

SSH-ключ

Требуется генерация SSH-ключа и копирование открытой части на сервер

Ввод фразы-пароля или без ввода

В этом руководстве пойдет речь о более эффективном и безопасном способе авторизации — с помощью SSH-ключа.

Устройство SSH-ключа

Ключ для SSH-соединения на самом деле представляет собой пару ключей (если быть точнее, то пару частей одного ключа), связанных между собой алгоритмически:

  • Открытый (Публичный). Хранится на сервере. Используется для шифрования сообщений и аутентификации.

  • Закрытый (Приватный). Хранится на клиенте в защищенном виде. Никому не показывается и никому не передается. Компрометация этого ключа может привести к взлому.

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

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

SSH-ключ генерируется на локальном компьютере с помощью специальной утилиты — keygen (генератор ключей). По умолчанию она генерирует пару 2048-битных ключей основе криптографического алгоритма RSA.

В большинстве операционных систем (Windows, Linux, macOS) процесс генерации ключа идентичен, поэтому его можно запустить одной и той же командой:

ssh-keygen

В консоли появится сообщение о начале генерации открытого и закрытого ключей:

Generating public/private rsa key pair.

Далее терминал предложит ввести путь, по которому необходимо сохранить сгенерированные ключи. Указание пути можно пропустить — в этом случае ключи окажутся в стандартной директории /root/.ssh:

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

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

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Однако ввод фразы-пароля можно пропустить, нажав два раза Enter. В этом случае в будущем не придется вводить фразу-пароль при каждом подключении по SSH.

После этого консольный терминал сообщит об успешном создании SSH-ключа и покажет дополнительную информацию о нем:

Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Y3UP7EgXpWFViECapj2OFX2FC09BoAl6ErHrVm1Q2gs root@3798037-yn55665.twc1.net
The key's randomart image is:
+---[RSA 3072]----+
|    o.. ..++**+o.|
|     + = *.o+=.  |
|    + E O ++B.   |
|     + B = *oo   |
|    . o S . . .  |
|   . . * o       |
|    o . .        |
|   .             |
|                 |
+----[SHA256]-----+

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

vds

Добавление SSH-ключа 

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

Способ 1. Через панель управления

Чтобы добавить открытую часть SSH-ключа на облачный сервер через панель управления Timeweb Cloud, необходимо:

  1. Перейти во вкладку «Доступ» на странице управления облачным сервером.

  1. Найти раздел «SSH-ключи» и нажать на кнопку «Изменить».

  1. На открывшейся странице кликнуть по кнопке «Загрузить новый ключ».

  1. Открытую часть ключа вставить в специальное текстовое поле для ключа и нажать на кнопку «Добавить».

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

Image2

Страница настроек доступа в панели управления облачным сервером Timeweb Cloud

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

/root/.ssh/id_rsa.pub

Если же локальный компьютер управляется операционной системой Windows, то открытый ключ размещается в этом файле:

C:\Users\ПОЛЬЗОВАТЕЛЬ\.ssh\id_rsa.pub

При этом вместо слова ПОЛЬЗОВАТЕЛЬ указывается имя пользователя на локальной машине.

Сам открытый ключ выглядит примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCKC3Qf3NFmqaXU1+6JtTEurhw6iSQ7YTsYQ4ZqPoAwaWM5czzaqJTi6z5Nt6c1jPjyc3eVed5pqff2Yp8Q92TyXX+p2GNorhqZWJLeaIdGBa6l5Nb8YyQRTxuwp/M3qM2/i+AvGu6S97iKceGEg33l6YMId9bpaKCYmVLElN9/Wy/db0tgDA5ALYIB4mylo3NnzoQ27qzENvtzuFUXwtEUD9EDnJQgvUR0z7IL4AGPfFVJIoBJIud744lNBoiui3d4e6FPfoOFpL0dIcQKOHFEW08TfwKpLgBvTgsLm/3UZ1Z4FefBVyHlmh4Y2mg/nzrZvqQHtzUzR7bJRal1NG4zOOMjhUCmNL5P4Xj6QOTIBjjYdIh2HjMP2mYUHfLtpU3TseEkOd672k0x/wMnCyMltBCu5gl97jXwFJd1K7wCpZjtJFcfd2AYCraBfCQqR7Im2G5WIugkofD+31G+be/WMhVwJmjcv6/YNcq5KXESUcsL1MhKpBTA3yqku0PmsxE= root@3798037-yn55665.twc1.net

Обратите внимание на его завершение:

root@3798037-yn55665.twc1.net

Оно содержит полное имя локальной машины, которое также является названием ключа в панели управления Timeweb Cloud.

Image1

Всплывающее окно для добавления открытого SSH-ключа в панели управления облачным сервером Timeweb Cloud

Способ 2. Через утилиту ssh-copy-id

Более классический, но менее наглядный способ добавления открытого ключа на удаленную машину — утилита ssh-copy-id, которая являются частью пакета OpenSSH и работает через консольный терминал.

Схема команды, которая копирует открытый ключ на удаленную машину, выглядит следующим образом:

ssh-copy-id ПОЛЬЗОВАТЕЛЬ@ХОСТ

При этом:

  • ПОЛЬЗОВАТЕЛЬ. Имя системного пользователя на удаленной машине.

  • ХОСТ. IP-адрес удаленной машины.

Таким образом, команда может выглядеть так:

ssh-copy-id root@45.10.41.189

При первом выполнении команды в консольном терминале появится сообщение об установлении соединения с новым хостом:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '45.10.41.189 (45.10.41.189)' can't be established.
ED25519 key fingerprint is SHA256:T1rJ9M8jip2lRS3aRpAvecEknDQzcU0RvNRHXP8w0IA.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:1: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Чтобы продолжить, в консольный терминал необходимо ввести yes. Далее появится сообщение о поиске ранее сгенерированного SSH-ключа (как открытого, так и закрытого) на локальной машине:

/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

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

root@45.10.41.189's password:

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

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@45.10.41.189'"
and check to make sure that only the key(s) you wanted were added.

Способ 3. Через ручное копирование

Если на удаленной машине есть пользователь с паролем (например, root), то можно выполнить ручное копирование SSH-ключа от его имени.

Для этого нужно выполнить несколько действий:

  1. Открыть файл с открытым ключом (/root/.ssh/id_rsa.pub) и скопировать его содержимое.

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

  1. Создать каталог /root/.ssh на удаленной машине, если он еще не существует.

  1. Создать файл /root/.ssh/authorized_keys и вставить в него ранее скопированный ключ.

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

cat ~/.ssh/id_rsa.pub | ssh ПОЛЬЗОВАТЕЛЬ@ХОСТ "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

При этом:

  • Символ | используется для перенаправления потоков ввода и вывода.

  • Символ >> используется для дополнения содержимого файла, а не его полной перезаписи.

После выполнения команды в консольном терминале появится сообщение о новом SSH-подключении и вопросом о необходимости его продолжения:

The authenticity of host '194.87.118.235 (194.87.118.235)' can't be established.
ED25519 key fingerprint is SHA256:s5/VTZMxE++3wOXERdbHuaJ82bWCQVFRXo8XUR5su6k.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Если ввести утвердительный ответ yes, консольный терминал попросит ввести пароль пользователя, под которым выполняется подключение к удаленной машине:

root@194.87.118.235's password:

Если копирование SSH-ключа прошло успешно, то в консольном терминале ничего не появится.

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

Аутентификация по SSH-ключу

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

ssh root@IP_АДРЕС

Слово IP_АДРЕС нужно заменить на IP-адрес удаленной машины, к которой выполняется подключение.

Таким образом, команда подключения может выглядеть так:

ssh root@45.10.41.189

При этом, если файл с закрытым SSH-ключом на локальной машине был сохранен не в каталоге по умолчанию (/root/.ssh/id_rsa), то к команде подключения нужно добавить дополнительный флаг -i, явно указывающий на файл с закрытым ключом:

ssh -i /otherfolder/id_rsa root@45.10.41.189

Далее есть три варианта развития событий:

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

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

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

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

cat ~/.ssh/authorized_keys

В консольном терминале появится ранее добавленный открытый SSH-ключ.

Внутри этого файла все ключи последовательно записаны сплошным текстом без разделителей. Таким образом удаленная машина аутентифицирует пользователей на основе тех открытых ключей, которые находятся в файле /root/.ssh/authorized_keys.

Очистка этого файла приведет к необходимости повторного добавления открытого ключа на удаленную машину.

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

Разверните свой Linux VDS в Timeweb Cloud

Заключение

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

  • Генерация на локальной машине пары SSH-ключей — открытого (публичного) и закрытого (приватного).

  • Добавление открытого ключа на удаленную машину в специальный файл /root/.ssh/authorized_keys.

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

  • Способ 1. Через графический интерфейс панели управления Timeweb Cloud.

  • Способ 2. Через специальную консольную утилиту ssh-copy-id.

  • Способ 3. Через ручное копирование.

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

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
27 ноября 2024 г.
25
12 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев