Приветствую!
В этот раз поговорим про удалённые подключения с помощью безопасного протокола 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 происходит следующее:
- Установка 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 с этим отпечатком:
После подключения, на вид в консоли ничего не изменилось. Но этом потому что мы подключились к самому себе. При подключении к другой машине, мы бы увидел другой 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:
- Любой 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 ключей.
В будущих постах мы рассмотрим тонкую настройку клиента и отдельно сервера. Не пропустите)
Спасибо, что читаете. Всех благ!
Полезные источники
Мои ссылки:
- Мой основной сайт - r4ven.me
- Мой телеграм - t.me/r4ven_me
#linux #linux_mint #ssh #sshd #openssh #вороний_блог #r4ven.me #virtualbox #debian12 #debian