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

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

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

Состав пакета 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:

  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:

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 с этим отпечатком:

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

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

w

tty

pgrep -af ssh

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

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

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

В чём суть. Мы только что выполнили “проброс” порта (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:

Для Windows:

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

Выводы

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

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

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

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

Подписаться
Уведомить о
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии