SSH («Secure Socket Shell» или «Безопасная оболочка сокета») — это защищенный сетевой протокол, с помощью которого можно безопасно подключаться к удаленным серверам и выполнять произвольные команды.
Говоря проще, SSH предоставляет защищенную (зашифрованную и аутентифицированную) оболочку командной строки для взаимодействия нескольких удаленных хостов друг с другом.
Таким образом с помощью SSH можно выполнять консольные команды на удаленной машине так, как если бы они вводились на локальной машине.
По этой причине SSH-протокол идеально подходит для управления обширной сетевой инфраструктурой.
Соответственно, в момент SSH-соединения существует две стороны:
Сервер. Это постоянно работающий демон, размещенный на удаленной машине, который прослушивает 22 порт и обрабатывает команды от авторизованных пользователей.
Клиент. Это утилита, запущенная на локальной машине, через которую выполняется подключение и отправка консольных команд удаленному серверу.
В этом руководстве мы разберем основы устройства SSH-соединения, а также настроим клиент и сервер таким образом, чтобы они могли выполнять безопасное общение друг с другом с использованием SSH-ключей.
Все показанные в этом руководстве примеры запускаются на облачном сервере Timeweb Cloud под управлением операционной системы Ubuntu 22.04.
В операционных системах на базе 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-ключ генерируется на локальном компьютере с помощью специальной утилиты — 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-ключа на облачный сервер через панель управления Timeweb Cloud, необходимо:
Перейти во вкладку «Доступ» на странице управления облачным сервером.
Найти раздел «SSH-ключи» и нажать на кнопку «Изменить».
На открывшейся странице кликнуть по кнопке «Загрузить новый ключ».
Открытую часть ключа вставить в специальное текстовое поле для ключа и нажать на кнопку «Добавить».
При этом поле с названием ключа заполнится автоматически на основе содержимого самого ключа.
Страница настроек доступа в панели управления облачным сервером 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.
Всплывающее окно для добавления открытого SSH-ключа в панели управления облачным сервером Timeweb Cloud
Более классический, но менее наглядный способ добавления открытого ключа на удаленную машину — утилита 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.
Если на удаленной машине есть пользователь с паролем (например, root
), то можно выполнить ручное копирование SSH-ключа от его имени.
Для этого нужно выполнить несколько действий:
Открыть файл с открытым ключом (/root/.ssh/id_rsa.pub
) и скопировать его содержимое.
Выполнить SSH-подключение к удаленной машине и авторизоваться по паролю.
Создать каталог /root/.ssh
на удаленной машине, если он еще не существует.
Создать файл /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 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-ключу в качестве дополнительной меры безопасности поддерживает указание фразы-пароля, который вводится в консольный терминал в момент подключения.