Протокол SSH: как работает, порт 22 и защита сервера

Протокол SSH: как работает, порт 22 и защита сервера Полезное

SSH (Secure Shell) — это сетевой протокол прикладного уровня для удаленного управления компьютером через незащищенную сеть: он шифрует весь трафик между клиентом и сервером, включая логин и пароль. В статье разберем, чем протокол SSH отличается от программы OpenSSH и от SSH-ключа, как проходит подключение, какие команды нужны в первую очередь и как закрыть сервер от подбора пароля.

SSH, OpenSSH и SSH-ключ: три вещи под одним названием

Три термина часто путают, хотя они относятся к разным уровням одной технологии.

  • SSH — сам протокол: описание правил, по которым клиент и сервер согласуют шифрование, проверяют друг друга и обмениваются данными. Протокол не привязан к конкретной программе.
  • OpenSSH — свободная реализация протокола: набор программ ssh, sshd, scp, sftp, ssh-keygen. Стоит по умолчанию на большинстве дистрибутивов Linux, в macOS и в Windows начиная с версии 10. Есть и другие реализации, например клиент PuTTY для Windows.
  • SSH-ключ — пара файлов (приватный и публичный), один из способов аутентификации внутри протокола. Ключ не протокол и не программа — это учетные данные, которыми пользуется клиент.

Действующая версия протокола — SSH-2, она вытеснила уязвимую SSH-1 и стандартизована IETF в RFC 4251-4254. Современные клиенты и серверы по умолчанию работают только по SSH-2.

Как проходит подключение: от TCP-соединения до сессии

Установление SSH-сессии проходит в четыре шага, и каждый следующий зависит от успеха предыдущего.

  1. TCP-соединение. Клиент открывает TCP-соединение с сервером на порту 22 (или на том, что задан явно).
  2. Согласование алгоритмов. Клиент и сервер обмениваются списками поддерживаемых алгоритмов шифрования и договариваются об общем наборе.
  3. Проверка сервера. Сервер присылает хост-ключ. При первом подключении клиент спрашивает подтверждение отпечатка и сохраняет его в ~/.ssh/known_hosts; при другом отпечатке на повторном подключении SSH откажется соединяться — защита от подмены сервера.
  4. Аутентификация клиента. Сервер проверяет, что подключается тот, за кого себя выдает клиент: по паролю или по паре ключей.

После успешной аутентификации открывается зашифрованный канал, через который идут команды, вывод терминала и передаваемые файлы.

Аутентификация: пароль или ключ

У SSH два основных способа подтвердить личность клиента, и они не равноценны по устойчивости к перебору.

Признак Пароль Публичный ключ
Что хранится на сервере Хеш пароля Публичный ключ в authorized_keys
Что нужно клиенту Знать пароль Приватный ключ (под passphrase)
Устойчивость к перебору по сети Низкая, пароль подбирают боты Приватный ключ по сети не передается и не подбирается
Риск при утечке базы сервера Пароль скомпрометирован сразу Публичный ключ безопасно раскрывать, приватный на сервер не попадает
Рекомендация для продакшена Отключать Основной способ

Ключевое различие: пароль пересылается на сервер для сверки, пусть и по шифрованному каналу. При аутентификации по ключу сервер лишь проверяет, что клиент владеет приватным ключом, не получая его — клиент подписывает им проверочные данные.

Преимущества и недостатки SSH

Плюсы Минусы
Шифрует весь трафик, включая пароль Ключ без passphrase небезопасен на скомпрометированном ноутбуке
Передает файлы (scp, sftp) в том же канале Порт 22 постоянно сканируют боты — нужна доп. защита
Проверяет целостность данных Root на сервере может прочитать чужую сессию на этом хосте
Пробрасывает порты и туннелирует другие протоколы Пароль + разрешенный root-логин снимают почти все преимущества
Клиент есть почти в любой ОС «из коробки» Не защищает от слабого пароля или утечки ключа — ответственность администратора

Подключение: Linux, macOS, Windows

На Linux и macOS команда ssh встроена в систему, отдельно ставить ничего не нужно:

ssh exampleuser@203.0.113.10

Здесь exampleuser — имя пользователя на сервере, 203.0.113.10 — его IP-адрес (документационный диапазон RFC 5737, для реального сервера подставляется собственный адрес). При первом подключении терминал попросит подтвердить отпечаток хост-ключа, затем — ввести пароль или passphrase от ключа.

В Windows 10 и новее команда ssh доступна прямо из PowerShell — это тот же OpenSSH-клиент, что и на Linux. Отдельный клиент вроде PuTTY нужен только для графического интерфейса с сохраненными профилями подключений.

Аутентификация по ключу: генерация и подключение

Ниже — минимальный рабочий пример: создать пару ключей, скопировать публичный ключ на сервер и подключиться без пароля.

ssh-keygen -t ed25519 -C "user@example.com"

Команда создаст пару файлов: ~/.ssh/id_ed25519 (приватный, никому не передавать) и ~/.ssh/id_ed25519.pub (публичный). При генерации она попросит задать passphrase — пропускать этот шаг не стоит: без него кража файла с ноутбука равносильна краже пароля.

ssh-copy-id -i ~/.ssh/id_ed25519.pub exampleuser@203.0.113.10

Утилита один раз запросит пароль пользователя на сервере и добавит содержимое id_ed25519.pub в файл ~/.ssh/authorized_keys этого пользователя. После этого:

ssh -i ~/.ssh/id_ed25519 exampleuser@203.0.113.10

Подключение проходит без пароля: клиент запросит passphrase самого ключа (или возьмет его из ssh-agent, если сессия уже разблокирована), и сразу откроется командная строка сервера.

Частые команды SSH и производных утилит

Команда Что делает
ssh user@host Подключение к удаленному серверу
ssh -p 2222 user@host Подключение на нестандартный порт
scp file.txt user@host:/tmp/ Копирование файла на сервер по SSH-каналу
sftp user@host Интерактивная сессия передачи файлов
ssh-keygen -t ed25519 Генерация пары ключей
ssh-copy-id -i key.pub user@host Публикация публичного ключа на сервере
ssh-agent / ssh-add Хранение расшифрованного ключа в памяти на время сессии
ssh user@host "команда" Выполнение одной команды на сервере без интерактивной сессии

Команды ls, cd, cat, grep в таблице не показаны — это обычные команды shell на сервере, а не часть протокола SSH.

Защита SSH-сервера: чем закрыть перебор

Самый частый из недостатков в таблице выше — открытость сервера для подбора учетных данных ботами по сети — устраняется настройками, а не самим протоколом. Остальные минусы настройками сервера не закрываются: от утечки расшифрованного ключа с ноутбука защищает только passphrase на самом ключе, а от чтения чужой сессии root-ом на хосте — разграничение доступа к серверу, это отдельная задача. Ниже — порядок с откатом только для той части, что решается конфигом: перед перезапуском службы держите открытой текущую SSH-сессию и по возможности вторую (или доступ через консоль хостинга), чтобы не остаться без доступа при ошибке в конфиге.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

Далее в /etc/ssh/sshd_config меняются три параметра:

PasswordAuthentication no
PermitRootLogin no
Port 2222
  • PasswordAuthentication no — главная мера: отключает вход по паролю, оставляя только аутентификацию по ключу. Без этого шага смена порта и остальные меры почти бесполезны — боты просто сканируют весь диапазон портов.
  • PermitRootLogin no — запрещает прямой вход под root по SSH; администратор заходит под обычным пользователем и повышает права через sudo, когда это нужно.
  • Port 2222 — смена порта с 22 на нестандартный снижает шум от автоматических сканеров в логах, но это не защита, а маскировка: адресный скан по всем портам ее обходит. Менять порт стоит только вместе с двумя пунктами выше, не вместо них.

Перед перезапуском службы проверяется синтаксис, затем применяется конфигурация:

sudo sshd -t
sudo systemctl restart sshd

Если sshd -t вернул ошибку, конфиг не применяется — служба остается на старых настройках. Если после restart новая сессия не открывается, конфиг возвращается из резервной копии через уже открытую сессию: sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config && sudo systemctl restart sshd.

Дополнительный слой — fail2ban, который сам блокирует IP-адрес после нескольких неудачных попыток входа:

sudo apt install fail2ban
sudo systemctl enable --now fail2ban

Он анализирует логи sshd и добавляет правило файрвола для адреса, который слишком часто ошибается с аутентификацией. Это защита от онлайн-перебора, отдельная от отключения пароля, которое защищает от кражи учетных данных иным путем — через утечку базы или фишинг.

Выводы

  • SSH — протокол шифрованного удаленного доступа; OpenSSH — его конкретная реализация; SSH-ключ — один из способов аутентификации внутри протокола, это три разных уровня одной технологии.
  • Подключение проходит четыре шага: TCP-соединение, согласование алгоритмов, проверка хост-ключа сервера, аутентификация клиента.
  • Аутентификация по ключу устойчивее к перебору по сети, чем по паролю, потому что приватный ключ не передается на сервер.
  • Порт 22 сам по себе не проблема; проблема — разрешенный вход по паролю и под root. Смена порта маскирует сервер, но не заменяет PasswordAuthentication no, PermitRootLogin no и fail2ban.
  • Перед изменением sshd_config нужна резервная копия и открытая вторая сессия — иначе ошибка в конфиге отрежет доступ к серверу.

Где применяется / связь с практикой

Освойте тему на практике

Настройка SSH-доступа и защита сервера от перебора — базовая задача сетевого администратора и любого, кто держит хотя бы один сервер под управлением. Разобраться в этом системно, вместе с маршрутизацией, VPN и мониторингом сети, поможет курс Network Engineer в Otus.

Освойте тему на практике

Проверить формат занятий и посмотреть, как построена программа, можно на бесплатных открытых уроках Otus.

FAQ

Чем SSH отличается от SSL/TLS?
Оба протокола шифруют трафик, но решают разные задачи: SSH создан для удаленного управления сервером и туннелирования, а SSL/TLS — для защиты соединения между браузером и веб-сервером (HTTPS) и не дает интерактивной командной строки.

Что делать, если забыл passphrase от приватного ключа?
Расшифровать существующий приватный ключ без passphrase невозможно — это и есть смысл защиты. Остается сгенерировать новую пару ключей и заново добавить публичный ключ на сервер через любой оставшийся рабочий способ входа (второй ключ, пароль, консоль хостинга).

Почему SSH-подключение зависает, хотя порт открыт?
Обычно это не проблема самого протокола, а сеть: неверный IP или порт, файрвол, который принимает TCP-пакет, но не пропускает данные дальше, или разрыв на маршруте. Быстрая проверка — ssh -v для подробного лога и nc -zv host port для проверки доступности порта отдельно от SSH.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)