SSH — Безопасное подключение к удалённым хостам: введение
Приветствую!

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

Немного теории…

О протоколе 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 происходит следующее:

  1. Установка TCP-соединения: клиент и сервер устанавливают соединение с использованием протокола TCP (Transmission Control Protocol). Протокол TCP обеспечивает надежную передачу данных, разбивая их на пакеты и устанавливая подтверждение доставки.
  2. Инициация протокола SSH: после установления TCP-соединения клиент и сервер запускают протокол SSH. Клиент отправляет запрос на подключение к серверу и инициирует процесс аутентификации.
  3. Аутентификация: процесс аутентификации в SSH может включать различные методы, такие как парольная аутентификация или использование ключей. Клиент и сервер обмениваются данными для проверки подлинности клиента.
  4. Организация защищенного канала: после успешной аутентификации клиент и сервер устанавливают защищенный канал, который шифрует данные, передаваемые между ними. Шифрование обеспечивает конфиденциальность и целостность передаваемых данных.
  5. Взаимодействие клиента и сервера: после установления защищенного канала клиент и сервер могут взаимодействовать друг с другом. Клиент может отправлять команды или запросы на сервер, а сервер отвечать на них или передавать запрошенные данные.

Состав пакета OpenSSH

Вот краткое и полное описание основных утилит и команд из пакета OpenSSH (кликните на спойлер, для просмотра подробностей):

Конфигурационные файлы SSH в Linux

Конфиги SSH в файловой системе Linux делятся на два типа: системные и пользовательские.

Системные файлы конфигурации SSH:

  1. /etc/ssh/sshd_config — настройки сервера SSH. Определяет параметры, такие как порт прослушивания, ограничения доступа, аутентификацию и шифрование;
  2. /etc/ssh/ssh_config — глобальные настройки клиента SSH. Определяет параметры, такие как адрес сервера, порт, аутентификацию и шифрование;
  3. /etc/ssh/ssh_known_hosts — хранит публичные ключи удаленных серверов, с которыми ранее устанавливалось соединение;
  4. /etc/ssh/sshrc — содержит команды и настройки, выполняемые при каждом подключении к удаленному серверу;
  5. Приватные ключи сервера SSH (/etc/ssh/ssh_host_*_key) — содержат приватные ключи хоста SSH, используемые сервером SSH для аутентификации.

Пользовательские файлы конфигурации SSH (хранятся в домашнем каталоге):

  1. ~/.ssh/config — пользовательские настройки клиента SSH. Определяет параметры для конкретных удаленных хостов или групп хостов;
  2. ~/.ssh/known_hosts — записи публичных ключей удаленных серверов, с которыми устанавливалось соединение;
  3. ~/.ssh/id_rsa, ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 — приватные ключи аутентификации пользователя;
  4. ~/.ssh/id_*.pub — публичные ключи аутентификации пользователя;
  5. ~/.ssh/authorized_keys — публичные ключи, разрешенные для аутентификации на удаленных серверах.

Практика!

Проверка статуса сервиса sshd в Linux Mint 21

В Linux Mint из коробки работает сервер и клиент OpenSSH. Сервер запускается с помощью юнита systemdssh.service, на который указывает симлинк /etc/systemd/system/sshd.service:

Выполним проверку статуса сервиса sshd командой и проверим открытость порта 22:

BASH
systemctl status sshd

sudo ss -tlnp | grep 22
Нажмите, чтобы развернуть и увидеть больше

*sudo для второй команды нужен, чтобы увидеть название процесса, который слушает порт

Если интересно, что делает systemd юнит, выполните в терминале:

BASH
systemctl cat sshd
Нажмите, чтобы развернуть и увидеть больше

Как видим, файл юнита запускает исполняемый файл /usr/bin/sshd. Также файл сервиса включает в себя различные условия запуска.

Если у вас по какой-то причине сервис не запущен, то запускаем:

BASH
sudo systemctl start sshd
Нажмите, чтобы развернуть и увидеть больше

Если пакет OpenSSH не установлен, то устанавливаем:

BASH
sudo apt install openssh-client openssh-server
Нажмите, чтобы развернуть и увидеть больше

Подключение по SSH к localhost

Давайте попробуем подключится по SSH к самим себе, т.е. к localhost (127.0.0.1):

BASH
ssh localhost
Нажмите, чтобы развернуть и увидеть больше

По умолчанию, если для SSH в качестве аргументов указать только имя хоста для подключения, будет использовано имя текущего пользователя оболочки и стандартный порт — 22.

Что происходит при первом подключении:

Если ранее никаких подключений по SSH не выполнялось, то после подтверждения отпечатка хоста подключения автоматически создаться файл known_hosts с этим отпечатком:

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

Чтобы проверить, что мы подключены по SSH выполняем:

BASH
w

tty

pgrep -af ssh

echo $SSH_CONNECTION
Нажмите, чтобы развернуть и увидеть больше

Как видим, подключившись по 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 и при выключенной ВМ переходим в её настройки, в раздел Сеть —> Дополнительно —> Проброс портов:

В открывшемся окне нажимаем зеленый плюс справа, появится новая строчка правила проброса. Тут указываем произвольный номер порта хоста (желательно не из стандартных), в нашем случае это 2222, и порт на гостевой ОС, это стандартный порт сервера SSH — 22:

После два раза нажимаем Ок.

В чём суть. Мы только что выполнили «проброс» порта (2222) с нашей основной ОС до стандартного порта, который слушает сервис SSH (22) на виртуальной машине. Т.е. обращения на порт 2222 нашего локального компьютера будут перенаправлены на 22-й порт нашей виртуальной машины.

Проверить доступность можно так:

BASH
nc -zv 127.0.0.1 2222

sudo ss -tlnp | grep 2222
Нажмите, чтобы развернуть и увидеть больше

Видим, что порт занят процессом VirtualBoxVM.

Подключение по SSH к ВМ с помощью терминала Linux

Теперь, когда мы всё настроили пробуем подключится к ВМ по SSH через терминал в Linux Mint:

BASH
ssh ivan@127.0.0.1 -p 2222
Нажмите, чтобы развернуть и увидеть больше

Где:

*Вместо loopback адреса обычно используется IP адрес целевого хост. Он может быть как приватный (серый), так и публичный (белый). Главное, чтобы с ним была сетевая связность.

Так, как к данному хосту (ВМ) мы ранее не подключались, SSH запрашивает у нас подтверждение, что мы доверяем этому хосту и нужно добавить цифровой отпечаток данного сервера в known_hosts. Вводим yes и Enter:

Как видим приглашение командной строки несколько отличается от того, что на нашем локальном компе (другой hostname). Выполним проверку подключения, как мы делали ранее:

BASH
w

whoami

hostnamectl

cat /etc/os-release
Нажмите, чтобы развернуть и увидеть больше

И так мы подключены по безопасному каналу к нашей виртуальной машине с Debian 12. Теперь мы можем делать с ней всё то же самое, что и с локальным компьютером с помощью командной строки Linux.

Такой тип подключения к удалённым серверам с Unix-подобными системам является самым распространённым. Аналогичным образом можно подключаться к различным виртуальным серверам в облаках или физическим серверам, находящимся в любой точке мира и доступным, к примеру через интернет.

Настройка авторизации на основе криптографических ключей

Одной из «ключевых» возможностей SSH — это настройка авторизации посредством криптографических ключей асимметричного шифрования.

В данном примере мы создадим пару таких ключей и настроим подключением к ВМ с их помощью, для авторизации без ввода пароля.

Для создания ключей используется утилита ssh-keygen. Если выполнить её без параметров она сгенерирует пару приватного и публичного ключей алгоритма RSA — самого распространенного на сегодняшний день, хоть и уже устаревшего.

BASH
ssh-keygen
Нажмите, чтобы развернуть и увидеть больше

Затем нас попросят указать местоположение будущих файлов. Ничего не указываем, жмём Enter и файлы будут иметь стандартные расположение и название. Затем нас попросят создать пароль для шифрования создаваемых ключей. Это необходимо, чтобы ключи не хранились в незашифрованном виде. Но т.к. мы хотим подключаться к удаленному хосту без пароля, придётся пренебречь данной мерой безопасности. Также дважды жмём Enter:

В директории ~/.ssh появятся два новых файла:

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

Выполняем импорт нашего публичного ключа на удалённую систему с помощью утилиты ssh-copy-id:

BASH
ssh-copy-id -p 2222 ivan@127.0.0.1
Нажмите, чтобы развернуть и увидеть больше

После выполнения авторизации по паролю наш ключ успешно добавился на удалённую систему. Теперь, как нас просят, попробуем подключится к нашей ВМ без пароля. Пробуем:

BASH
ssh ivan@127.0.0.1 -p 2222
Нажмите, чтобы развернуть и увидеть больше

Как видим, авторизация прошла без запроса пароля.

Более тонкую настройку сервера и клиента SSH я рассмотрю в отдельных постах. А то статья и так выходит довольного объемной)

Список популярных GUI клиентов SSH Linux/Windows

В завершение приведу список популярных GUI реализаций клиентов SSH для Linux и ладно уж Windows, т.к. из под неё нередко приходится подключаться к серверам Linux)

Для Linux:

Для Windows:

Кроссплатформенные (electron):

Выводы

Сегодня мы с вами узнали что такое безопасная оболочка SSH и её популярная реализация OpenSSH. Изучили немного теории, узнали какие утилиты входят в состав пакета OpenSSH, какие конфигурационные файлы существуют. Также мы попрактиковались в подключении по протоколу SSH к локальной машине, к виртуальной машине и настроили подключение с помощью RSA ключей.

В будущих постах мы рассмотрим тонкую настройку клиента и отдельно сервера. Не пропустите)

Спасибо, что читаете. Всех благ!

Полезные источники

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/networking/ssh-bezopasnoe-podklyuchenie-k-udalyonnym-hostam-vvedenie/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша