<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director

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

Миша Курушин
Миша Курушин
Технический писатель
27 ноября 2024 г.
380
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 г.
380
12 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев