Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

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

3303
12 минут чтения
Средний рейтинг статьи: 1.8

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

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

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

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

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

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

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

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

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

Установка SSH

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

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

    

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

    

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

    

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

    

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

    

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

    

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

    

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

    

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

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

Способ

Настройка

Авторизация

Пароль

Не требуется

Ввод пароля

SSH-ключ

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

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

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

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

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

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

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

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

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

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

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

    

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

    

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

    

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

    

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

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

    

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

VDS и VPS

Гибкие виртуальные серверы с почасовым
биллингом по всему миру: Россия, Азия и Европа.

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

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

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

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

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

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

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

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

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

Image2

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

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

    

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

    

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

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

    

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

    

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

Image1

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

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

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

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

    

При этом:

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

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

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

    

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

    

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

    

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

    

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

    

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

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

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

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

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

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

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

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

    

При этом:

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

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

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

    

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

    

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

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

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

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

    

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

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

    

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

    

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

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

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

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

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

    

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

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

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

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

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

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

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

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

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

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

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

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

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

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

3303
12 минут чтения
Средний рейтинг статьи: 1.8
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server