
SSH (Secure Shell) — протокол для безопасного удалённого доступа к серверам. Он шифрует весь трафик между клиентом и сервером, защищая от перехвата данных. Помимо удалённой командной строки SSH предоставляет целый набор инструментов: передачу файлов, проброс портов, монтирование удалённых файловых систем. В этом посте — подробный разбор всех ключевых возможностей.
Аутентификация по ключу
Пароль для входа на сервер — это удобно ровно до первого инцидента. Серверы с открытым SSH постоянно подвергаются брутфорсу: боты безостановочно перебирают стандартные логины и пароли. Аутентификация по ключу решает эту проблему по тому же принципу, что и WebAuthn : криптографическая пара ключей вместо пароля.
Генерация ключей и подключение
Весь процесс — три команды:
# Генерация пары ключей
ssh-keygen -t ed25519
# Копирование публичного ключа на сервер
ssh-copy-id user@server
# Подключение — пароль больше не нужен
ssh user@server
ssh-keygen создаёт два файла: приватный ключ (~/.ssh/id_ed25519) и публичный (~/.ssh/id_ed25519.pub). Приватный ключ остаётся на локальной машине и никогда не передаётся по сети. Публичный ключ копируется на сервер в файл ~/.ssh/authorized_keys.
При подключении сервер отправляет challenge — случайную строку. Клиент подписывает её приватным ключом, сервер проверяет подпись публичным ключом. Если подпись верна — доступ разрешён.
Какой тип ключа выбрать
- Ed25519 — рекомендуемый вариант. Короткие ключи (256 бит), быстрая подпись, современная эллиптическая криптография на кривой Curve25519
- RSA (4096 бит) — для совместимости со старыми системами, где Ed25519 не поддерживается
- ECDSA — не рекомендуется. Зависит от качества генератора случайных чисел, слабый генератор может привести к утечке приватного ключа
Защита приватного ключа passphrase
При генерации ключа ssh-keygen предлагает задать passphrase — пароль, которым шифруется приватный ключ на диске. Без passphrase любой, кто получит доступ к файловой системе (вредоносное ПО, украденный ноутбук), получит и приватный ключ. С passphrase файл ключа бесполезен без пароля.
ssh-agent
Вводить passphrase при каждом подключении неудобно. ssh-agent хранит расшифрованный ключ в памяти на время сессии:
# Запуск агента (если не запущен автоматически)
eval $(ssh-agent)
# Добавление ключа — passphrase вводится один раз
ssh-add ~/.ssh/id_ed25519
# Все последующие подключения проходят без запроса passphrase
ssh user@server
Большинство дистрибутивов Linux и macOS запускают ssh-agent автоматически при входе в систему.
Отключение парольной аутентификации
После настройки ключа важно отключить парольную аутентификацию на сервере. Без этого брутфорс паролей остаётся возможным:
# /etc/ssh/sshd_config
PasswordAuthentication no
После изменения конфигурации перезапускаем SSH-сервер:
sudo systemctl restart sshd
SSH-конфигурация
Файл ~/.ssh/config позволяет задать псевдонимы для серверов и параметры подключения. Вместо запоминания IP-адресов, портов и имён пользователей — короткие имена:
Host prod
HostName 192.168.1.100
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_work
Host dev
HostName dev.example.com
User developer
ForwardAgent yes
Теперь вместо ssh -p 2222 -i ~/.ssh/id_ed25519_work deploy@192.168.1.100 достаточно:
ssh prod
Полезные опции:
ForwardAgent yes— проброс ssh-agent на удалённый сервер, позволяет с него подключаться к другим серверам без копирования ключейServerAliveInterval 60— отправка keepalive-пакетов каждые 60 секунд, предотвращает разрыв соединения при неактивностиIdentityFile— путь к конкретному приватному ключу для этого хоста
Можно использовать wildcard для общих настроек:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
Проброс портов
SSH умеет пробрасывать порты через зашифрованный туннель. Это полезно для доступа к сервисам, которые слушают только на localhost удалённого сервера.
Локальный проброс (-L)
Пробрасывает порт с удалённого сервера на локальную машину:
ssh -L 5432:localhost:5432 user@server
Теперь PostgreSQL на удалённом сервере доступен как localhost:5432 на локальной машине. Это безопаснее, чем открывать порт базы данных в интернет.
Ещё пример — доступ к веб-интерфейсу, который слушает только на localhost:
ssh -L 8080:localhost:3000 user@server
Приложение на порту 3000 удалённого сервера становится доступным на localhost:8080 локально.
Удалённый проброс (-R)
Работает в обратную сторону — пробрасывает локальный порт на удалённый сервер:
ssh -R 8080:localhost:3000 user@server
Локальное приложение на порту 3000 становится доступным на порту 8080 удалённого сервера. Полезно, например, для демонстрации локально запущенного приложения коллегам.
Динамический проброс (-D)
Создаёт SOCKS-прокси через SSH-туннель:
ssh -D 1080 user@server
Весь трафик, направленный через localhost:1080 (SOCKS5), проходит через удалённый сервер. Можно настроить браузер на использование этого прокси.
SCP — копирование файлов
SCP (Secure Copy) — простейший способ копировать файлы между машинами через SSH:
# Копирование файла на сервер
scp file.txt user@server:/home/user/
# Копирование файла с сервера
scp user@server:/var/log/app.log ./
# Рекурсивное копирование директории
scp -r ./project user@server:/home/user/
# Копирование с нестандартным портом
scp -P 2222 file.txt user@server:/home/user/
SCP использует SSH для аутентификации и шифрования — отдельная настройка не требуется. Если работает ssh user@server, будет работать и scp.
SCP подходит для быстрого копирования одного-двух файлов. Для более сложных сценариев лучше использовать SFTP или rsync.
SFTP — интерактивная передача файлов
SFTP (SSH File Transfer Protocol) — полноценный протокол передачи файлов поверх SSH. В отличие от SCP, SFTP предоставляет интерактивный сеанс с возможностью навигации по файловой системе:
sftp user@server
Внутри SFTP-сессии доступны привычные команды:
sftp> ls # Список файлов на сервере
sftp> cd /var/log # Переход в директорию на сервере
sftp> lcd /tmp # Переход в директорию на локальной машине
sftp> get app.log # Скачать файл с сервера
sftp> put config.yaml # Загрузить файл на сервер
sftp> mget *.log # Скачать несколько файлов по маске
sftp> mkdir backups # Создать директорию на сервере
sftp> rm old-file.txt # Удалить файл на сервере
sftp> exit
SFTP также работает в неинтерактивном режиме:
# Скачать файл одной командой
sftp user@server:/var/log/app.log ./
# Выполнить набор команд из файла
sftp -b commands.txt user@server
SCP vs SFTP
- SCP — быстрое копирование известных файлов. Минимальный синтаксис, ничего лишнего
- SFTP — когда нужно просмотреть содержимое директорий, выборочно скачать файлы или работать интерактивно. Также поддерживает возобновление прерванных передач
Оба протокола используют SSH для шифрования и аутентификации. Настройки из ~/.ssh/config применяются к обоим.
SSHFS — монтирование удалённой файловой системы
SSHFS позволяет смонтировать директорию удалённого сервера как локальную:
# Установка (Debian/Ubuntu)
sudo apt install sshfs
# Установка (Arch Linux)
sudo pacman -S sshfs
# Создание точки монтирования
mkdir ~/remote-server
# Монтирование
sshfs user@server:/home/user ~/remote-server
# Теперь можно работать с файлами как с локальными
ls ~/remote-server
vim ~/remote-server/project/main.py
# Размонтирование
fusermount -u ~/remote-server
Когда использовать SSHFS
- Редактирование конфигурационных файлов на сервере в локальном редакторе
- Просмотр логов без постоянного скачивания
- Быстрый доступ к файлам на удалённой машине без настройки NFS или Samba
SSHFS работает через FUSE (Filesystem in Userspace) — не требует прав суперпользователя для монтирования. Скорость зависит от качества сетевого соединения, поэтому для интенсивной работы с большими файлами лучше подходит локальная копия.
Безопасность
Несколько рекомендаций для защиты SSH-сервера:
- Отключить вход под root —
PermitRootLogin noв/etc/ssh/sshd_config - Сменить стандартный порт —
Port 2222. Не защита сама по себе, но снижает количество автоматизированного брутфорса в логах - Ограничить пользователей —
AllowUsers deploy developerразрешает подключение только указанным пользователям - Использовать fail2ban — автоматическая блокировка IP-адресов после нескольких неудачных попыток входа
Этот пост также доступен в Telegram

