![SSH - Безопасное подключение к удалённым хостам: введение](https://r4ven.me/wp-content/uploads/2023/07/ssh.jpg)
SSH – Безопасное подключение к удалённым хостам: введение
Обновлено 23.02.2024
Приветствую!
В этот раз поговорим про удалённые подключения с помощью безопасного протокола SSH, в частности его открытой реализации OpenSSH.
Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram .
Немного теории
О протоколе SSH и его реализации OpenSSH
SSH (Secure Shell) – это сетевой протокол безопасного удаленного подключения к компьютерам и передачи данных через интернет. Он помогает защитить передаваемую информацию от несанкционированного доступа.
OpenSSH – это набор программ с открытым исходным кодом, предназначенных для реализации протокола SSH. OpenSSH является одной из самых популярных таких реализаций. Данный проект был создан в рамках другого проекта, unix-подобной ОС – OpenBSD.
SSH используется в различных ситуациях, когда нужно работать с компьютером издалека. Например, системные администраторы могут использовать SSH для управления серверами без необходимости физически находиться рядом с ними. Это позволяет выполнять команды, копировать файлы и настраивать систему на удалённо.
Протокол SSH появился в 1995 году и имеет две версии: SSH-1 и SSH-2. Первая версия имела изъяны в безопасности, поэтому не получила широко распространения. А вот вторая считается более безопасной и признана общественностью. Про неё и будет идти речь в данной статье.
SSH является протоколом уровня приложения (7-й уровень) в стандартной модели OSI (Open Systems Interconnection). Он работает поверх протокола TCP для обеспечения безопасной удаленной связи между клиентом и сервером. По умолчанию используется TCP порт 22, но он может быть с легкостью изменен в файлах конфигурации.
При установке соединения посредством протокола SSH происходит следующее:
- Установка TCP-соединения: клиент и сервер устанавливают соединение с использованием протокола TCP (Transmission Control Protocol). Протокол TCP обеспечивает надежную передачу данных, разбивая их на пакеты и устанавливая подтверждение доставки.
- Инициация протокола SSH: после установления TCP-соединения клиент и сервер запускают протокол SSH. Клиент отправляет запрос на подключение к серверу и инициирует процесс аутентификации.
- Аутентификация: процесс аутентификации в SSH может включать различные методы, такие как парольная аутентификация или использование ключей. Клиент и сервер обмениваются данными для проверки подлинности клиента.
- Организация защищенного канала: после успешной аутентификации клиент и сервер устанавливают защищенный канал, который шифрует данные, передаваемые между ними. Шифрование обеспечивает конфиденциальность и целостность передаваемых данных.
- Взаимодействие клиента и сервера: после установления защищенного канала клиент и сервер могут взаимодействовать друг с другом. Клиент может отправлять команды или запросы на сервер, а сервер отвечать на них или передавать запрошенные данные.
Состав пакета OpenSSH
Вот краткое и полное описание основных утилит и команд из пакета OpenSSH (кликните на спойлер, для просмотра подробностей):
sshd
: Обрабатывает входящие подключения к серверу по SSH.sshd (SSH Daemon) – это серверная программа, которая работает на удаленной машине и обрабатывает входящие подключения по протоколу SSH. Она отвечает за аутентификацию пользователей, управление сеансами SSH и обработку запросов на удаленное выполнение команд.ssh
: Устанавливает безопасное удаленное подключение к серверу.Команда ssh используется для установки защищенного SSH-подключения к удаленному серверу. Она позволяет работать с удаленным компьютером, как будто вы находитесь рядом с ним.ssh-keygen
: Генерирует и управляет ключами SSH.Утилита ssh-keygen помогает создавать и управлять ключами SSH, которые используются для аутентификации при подключении по SSH. Она позволяет генерировать пары ключей (публичный и приватный) и выполнять операции с ключами, такие как создание, импорт, экспорт, удаление и т. д.ssh-copy-id
: Копирует публичный ключ SSH на удаленный сервер для аутентификации без пароля.Команда ssh-copy-id используется для копирования публичного ключа SSH на удаленный сервер, чтобы обеспечить аутентификацию без ввода пароля при подключении.ssh-agent
: Хранит приватные ключи SSH и предоставляет их при необходимости для автоматической аутентификации.ssh-agent – это программа, которая хранит ваш приватный ключ SSH и предоставляет его при необходимости при подключении по SSH. Он помогает автоматически выполнять аутентификацию, когда вы пытаетесь подключиться к удаленному серверу. Часто используется, если приватный ключ зашифрован паролем.ssh-add
: Добавляет приватный ключ SSH в ssh-agent для автоматической аутентификации.Утилита ssh-add добавляет приватный ключ SSH в ssh-agent, программу, которая управляет аутентификационными ключами SSH. После добавления ключа в ssh-agent, не нужно будет каждый раз вводить пароль при подключении по SSH для расшифровки приватного ключа.scp
: Копирует файлы между компьютером и удаленным сервером по SSH.Утилита scp (Secure Copy) предоставляет способ безопасно копировать файлы между локальным компьютером и удаленным сервером через SSH. Она позволяет передавать файлы и даже директории с помощью командной строки.sftp-server
: Обрабатывает запросы на передачу файлов по протоколу SFTP.sftp-server – это серверная часть SFTP, которая обрабатывает запросы на передачу файлов между клиентом (локальным компьютером) и сервером через SSH. Она обеспечивает безопасную передачу файлов и директорий между компьютером и сервером.sftp
: Передает файлы между компьютером и сервером через интерактивный протокол SFTP.sftp (SSH File Transfer Protocol) – это интерактивный протокол передачи файлов, который позволяет управлять файлами на удаленном сервере через SSH. Он предоставляет удобный интерфейс для загрузки, скачивания, переименования и удаления файлов на удаленной машине.ssh-keyscan
: Сканирует удаленные хосты и получает их публичные ключи SSH.Утилита ssh-keyscan позволяет сканировать удаленные хосты и получать их публичные ключи SSH. Это полезно для проверки и сохранения публичных ключей удаленных серверов, чтобы предотвратить подделку и обеспечить безопасное подключение.ssh-keysign
: Используется для подписи протокола хоста SSH.Утилита ssh-keysign используется для подписи протокола хоста SSH. Она используется в распределенных системах аутентификации и обеспечивает безопасность и целостность протокола хоста при подключении по SSH.
Конфигурационные файлы SSH в Linux
Конфиги SSH в файловой системе Linux делятся на два типа: системные и пользовательские.
Системные файлы конфигурации SSH:
/etc/ssh/sshd_config
– настройки сервера SSH. Определяет параметры, такие как порт прослушивания, ограничения доступа, аутентификацию и шифрование;/etc/ssh/ssh_config
– глобальные настройки клиента SSH. Определяет параметры, такие как адрес сервера, порт, аутентификацию и шифрование;/etc/ssh/ssh_known_hosts
– хранит публичные ключи удаленных серверов, с которыми ранее устанавливалось соединение;/etc/ssh/sshrc
– содержит команды и настройки, выполняемые при каждом подключении к удаленному серверу;- Приватные ключи сервера SSH (
/etc/ssh/ssh_host_*_key
) – содержат приватные ключи хоста SSH, используемые сервером SSH для аутентификации.
Пользовательские файлы конфигурации SSH (хранятся в домашнем каталоге):
~/.ssh/config
– пользовательские настройки клиента SSH. Определяет параметры для конкретных удаленных хостов или групп хостов;~/.ssh/known_hosts
– записи публичных ключей удаленных серверов, с которыми устанавливалось соединение;~/.ssh/id_rsa
,~/.ssh/id_dsa
,~/.ssh/id_ecdsa
,~/.ssh/id_ed25519
– приватные ключи аутентификации пользователя;~/.ssh/id_*.pub
– публичные ключи аутентификации пользователя;~/.ssh/authorized_keys
– публичные ключи, разрешенные для аутентификации на удаленных серверах.
Практика
Проверка статуса сервиса sshd
в Linux Mint 21
В Linux Mint из коробки работает сервер и клиент OpenSSH. Сервер запускается с помощью юнита systemd – ssh.service
, на который указывает симлинк /etc/systemd/system/sshd.service
:
Выполним проверку статуса сервиса sshd
командой и проверим открытость порта 22:
systemctl status sshd
sudo ss -tlnp | grep 22
*sudo
для второй команды нужен, чтобы увидеть название процесса, который слушает порт
Утилита
ss
(Socket Statistics) в Linux предоставляет информацию о сетевых соединениях, сокетах и других сетевых структурах. Это мощный инструмент для отслеживания и анализа сетевой активности в Linux системе.Про ключи утилиты:
-t
– показать информацию о TCP соединениях;-l
– вывести список прослушиваемых портов;-n
– не использовать разрешение DNS, выводит информацию об адресах и портах в числовом формате;-p
– показывает имя процесса, использующего сетевое соединение (для просмотра нуженsudo
).
Если интересно, что делает systemd юнит, выполните в терминале:
systemctl cat sshd
Как видим, файл юнита запускает исполняемый файл /usr/bin/sshd
. Также файл сервиса включает в себя различные условия запуска.
Если у вас по какой-то причине сервис не запущен, то запускаем:
sudo systemctl start sshd
Если пакет OpenSSH не установлен, то устанавливаем:
sudo apt install openssh-client openssh-server
Подключение по SSH к localhost
Давайте попробуем подключится по SSH к самим себе, т.е. к localhost (127.0.0.1):
ssh localhost
По умолчанию, если для SSH в качестве аргументов указать только имя хоста для подключения, будет использовано имя текущего пользователя оболочки и стандартный порт – 22.
Что происходит при первом подключении:
- SSH проверяет, подключались ли мы ранее к данном хосту, если нет, предупреждает нас об этом и для подтверждения просит ввести слово
yes
; - После программа добавит публичный ключ удаленного хоста в уже известный нам файл
~/.ssh/known_hosts
; - Далее программа запросит у нас пароль пользователя для авторизации. В данном случае это наш локальный пароль.
Если ранее никаких подключений по SSH не выполнялось, то после подтверждения отпечатка хоста подключения автоматически создаться файл known_hosts
с этим отпечатком:
![](https://r4ven.me/wp-content/uploads/2023/07/image-12.png)
После подключения, на вид в консоли ничего не изменилось. Но этом потому что мы подключились к самому себе. При подключении к другой машине, мы бы увидел другой prompt командной строки.
Чтобы проверить, что мы подключены по SSH выполняем:
w
tty
pgrep -af ssh
echo $SSH_CONNECTION
![](https://r4ven.me/wp-content/uploads/2023/07/image-13.png)
- Команда
w
– выводит список подключенных пользователей, в т.ч. и тех, кто подключен поssh
; - Команда
tty
– выводит название терминального устройства текущей сессии, которое подключено к стандартному вводу; - Команда
pgrep -af ssh
– выводит список процессов, отфильтрованных по названию; - Команда
echo $SSH_CONNECTION
содержит информацию подключении: IP PROT источника и IPR PORT удаленного хоста.
Как видим, подключившись по ssh
, система выделила для нас псевдотерминал (pts) для работы в оболочке. С помощью команд выше мы проверили, что мы работаем в консоли через SSH соединение.
Выйти из сеанса SSH можно аналогичным способом, как и в обычной терминальной сессии: перезагрузить компьютер командой exit
или Ctrl+d
:
Подключение к виртуальной машине (VirtualBox) Debian 12 по SSH
В прошлых постах мы устанавливали гипервизор VirtualBox в Linux Mint 21 и создавали виртуальную машину с ОС Debian 12 на борту.
Сегодня, в качестве примера мы настроим подключение по SSH к нашему виртуальному серверу.
По умолчанию в VirtualBox всем виртуальным машинам сетевые настройки выдаются с использованием протокола DHCP, а доступ в сеть посредством технологии NAT. Т.е. внутри VirtualBox работает своеобразный роутер со своей внутренней сетью, который получает доступ в интернет через хостовую (ваш компьютер) систему. Отсюда следует, что прямого доступа из хостовой системы в гостевую (ВМ с Debian) нет.
Тут есть два решения: 1-е – настроить проброс сетевого порта из хоста в гостя; 2-е подключить ВМ к сети хоста через сетевой мост, чтобы гость получил сетевые настройки от вашего основного роутера. Но так, как 2-й вариант не всегда безопасен, мы просто пробросим сетевой порт и оставим нашу ВМ изолированной.
Проброс порта в VirtualBox
Запускаем VirtualBox и при выключенной ВМ переходим в её настройки, в раздел Сеть –> Дополнительно –> Проброс портов:
![](https://r4ven.me/wp-content/uploads/2023/07/image-15.png)
![](https://r4ven.me/wp-content/uploads/2023/07/image-16.png)
В открывшемся окне нажимаем зеленый плюс справа, появится новая строчка правила проброса. Тут указываем произвольный номер порта хоста (желательно не из стандартных), в нашем случае это 2222, и порт на гостевой ОС, это стандартный порт сервера SSH – 22:
![](https://r4ven.me/wp-content/uploads/2023/07/image-17.png)
![](https://r4ven.me/wp-content/uploads/2023/07/image-18.png)
После два раза нажимаем Ок.
В чём суть. Мы только что выполнили “проброс” порта (2222) с нашей основной ОС до стандартного порта, который слушает сервис SSH (22) на виртуальной машине. Т.е. обращения на порт 2222 нашего локального компьютера будут перенаправлены на 22-й порт нашей виртуальной машины.
Проверить доступность можно так:
nc -zv 127.0.0.1 2222
sudo ss -tlnp | grep 2222
nc
(netcat) – это утилита командной строки в Linux, которая позволяет устанавливать сетевые соединения и обмениваться данными через TCP или UDP протоколы.Про ключи:
-z
используется для сканирования портов на удаленном хосте без установления фактического соединения;-v
(от verbose) используется для включения подробного режима вывода.
Видим, что порт занят процессом VirtualBoxVM.
Подключение по SSH к ВМ с помощью терминала Linux
Теперь, когда мы всё настроили пробуем подключится к ВМ по SSH через терминал в Linux Mint:
ssh ivan@127.0.0.1 -p 2222
Где:
ivan
– имя удаленного пользователя, под которым мы подключается к серверу;@
– символ разделитель;127.0.0.1
– loopback адрес нашей локальной ОС (он же localhost);-p 2222
– ключ-p
используется для указания порта, отличного от стандартного.
*Вместо loopback адреса обычно используется IP адрес целевого хост. Он может быть как приватный (серый), так и публичный (белый). Главное, чтобы с ним была сетевая связность.
Так, как к данному хосту (ВМ) мы ранее не подключались, SSH запрашивает у нас подтверждение, что мы доверяем этому хосту и нужно добавить цифровой отпечаток данного сервера в known_hosts
. Вводим yes
и Enter
:
Как видим приглашение командной строки несколько отличается от того, что на нашем локальном компе (другой hostname). Выполним проверку подключения, как мы делали ранее:
w
whoami
hostnamectl
cat /etc/os-release
И так мы подключены по безопасному каналу к нашей виртуальной машине с Debian 12. Теперь мы можем делать с ней всё то же самое, что и с локальным компьютером с помощью командной строки Linux.
Такой тип подключения к удалённым серверам с Unix-подобными системам является самым распространённым. Аналогичным образом можно подключаться к различным виртуальным серверам в облаках или физическим серверам, находящимся в любой точке мира и доступным, к примеру через интернет.
Настройка авторизации на основе криптографических ключей
Одной из “ключевых” возможностей SSH – это настройка авторизации посредством криптографических ключей асимметричного шифрования.
В данном примере мы создадим пару таких ключей и настроим подключением к ВМ с их помощью, для авторизации без ввода пароля.
Для создания ключей используется утилита ssh-keygen
. Если выполнить её без параметров она сгенерирует пару приватного и публичного ключей алгоритма RSA – самого распространенного на сегодняшний день, хоть и уже устаревшего.
ssh-keygen
Затем нас попросят указать местоположение будущих файлов. Ничего не указываем, жмём Enter
и файлы будут иметь стандартные расположение и название. Затем нас попросят создать пароль для шифрования создаваемых ключей. Это необходимо, чтобы ключи не хранились в незашифрованном виде. Но т.к. мы хотим подключаться к удаленному хосту без пароля, придётся пренебречь данной мерой безопасности. Также дважды жмём Enter
:
В директории ~/.ssh
появятся два новых файла:
id_rsa
– приватный ключid_rsa.pub
– публичный ключ
Обратите внимание, что данные ключи работают в паре. Публичный ключ импортируется на удаленные системы, а с помощью приватного производится само подключение к удалённому хосту.
Выполняем импорт нашего публичного ключа на удалённую систему с помощью утилиты ssh-copy-id
:
ssh-copy-id -p 2222 ivan@127.0.0.1
После выполнения авторизации по паролю наш ключ успешно добавился на удалённую систему. Теперь, как нас просят, попробуем подключится к нашей ВМ без пароля. Пробуем:
ssh ivan@127.0.0.1 -p 2222
Как видим, авторизация прошла без запроса пароля.
Более тонкую настройку сервера и клиента SSH я рассмотрю в отдельных постах. А то статья и так выходит довольного объемной)
Список популярных GUI клиентов SSH Linux/Windows
В завершение приведу список популярных GUI реализаций клиентов SSH для Linux и ладно уж Windows, т.к. из под неё нередко приходится подключаться к серверам Linux)
Для Linux:
- Любой Linux терминал);
- Gnome connection manager (open source);
- Asbru Connection Manager (open source).
Для Windows:
- Windows terminal (требуется нативный ssh клиент, open source);
- PuTTY (open source);
- MTPuTTY (freeware);
- Xshell (закрытый код).
Кроссплатформенные (electron):
Выводы
Сегодня мы с вами узнали что такое безопасная оболочка SSH и её популярная реализация OpenSSH. Изучили немного теории, узнали какие утилиты входят в состав пакета OpenSSH, какие конфигурационные файлы существуют. Также мы попрактиковались в подключении по протоколу SSH к локальной машине, к виртуальной машине и настроили подключение с помощью RSA ключей.
В будущих постах мы рассмотрим тонкую настройку клиента и отдельно сервера. Не пропустите)
Спасибо, что читаете. Всех благ!
Полезные источники
- Протокол SSH – Wikipedia
- Официальный сайт проекта OpenSSH
- OpenSSH – Wikipedia
- Установка VirtualBox в Linux Mint 21 – Вороний блог
- Установка сервера Debian 12 в VirtualBox – Вороний блог
- VirtualBox в Windows – Вороний блог