cover.png
SSH — безопасный доступ к удалённым серверам

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-сервера:

  • Отключить вход под rootPermitRootLogin no в /etc/ssh/sshd_config
  • Сменить стандартный портPort 2222. Не защита сама по себе, но снижает количество автоматизированного брутфорса в логах
  • Ограничить пользователейAllowUsers deploy developer разрешает подключение только указанным пользователям
  • Использовать fail2ban — автоматическая блокировка IP-адресов после нескольких неудачных попыток входа

Этот пост также доступен в Telegram

Copyright 2026. All rights reserved.

Привет, друг! Coding Overhead — это мой личный блог о современных технологиях и полезных утилитах.