SSH-ключи на Ubuntu — генерация, настройка, безопасность
Как настроить SSH-ключи на Ubuntu: ssh-keygen ed25519, ~/.ssh/config, права файлов, agent forwarding, fail2ban. Практический гайд.
SSH-ключи — это пара криптографических файлов (приватный + публичный), заменяющая парольную аутентификацию при подключении к серверу. Ключ ed25519 длиной 256 бит взломать перебором невозможно — в отличие от пароля qwerty123, который подбирается за секунды. Если вы настраиваете VPS с нуля, SSH-ключи — один из первых шагов после базовой подготовки сервера.
Генерация SSH-ключей (ssh-keygen)
ssh-keygen — утилита для создания SSH-ключей, встроенная в OpenSSH на Ubuntu. Для новых серверов используйте алгоритм Ed25519:
ssh-keygen -t ed25519 -C "deployer@myproject"
Флаг -C добавляет комментарий — удобно, когда ключей несколько. По умолчанию ключи сохраняются в ~/.ssh/:
~/.ssh/id_ed25519 — приватный ключ (никому, никогда)
~/.ssh/id_ed25519.pub — публичный ключ (копируется на серверы)
Passphrase при генерации — дополнительный уровень защиты. Если кто-то получит файл приватного ключа, без passphrase он бесполезен. Для серверных ключей, используемых в CI/CD, passphrase обычно не ставят — иначе пайплайн не сможет подключиться автоматически.
Ed25519 vs RSA — что выбрать
| Параметр | Ed25519 | RSA-4096 |
|---|---|---|
| Длина ключа | 256 бит | 4096 бит |
| Безопасность | Равнозначная | Равнозначная |
| Скорость подписи | В 20–30 раз быстрее | Медленнее |
| Размер подписи | 64 байта | 512 байт |
| Поддержка | OpenSSH 6.5+ (2014) | Везде |
Ed25519 предпочтительнее: короче, быстрее, не подвержен атакам на слабые параметры (в отличие от DSA и ECDSA с NIST-кривыми). RSA-4096 нужен только если сервер старше 2014 года или используется устаревшее ПО, не поддерживающее Ed25519.
Помню, в одном из проектов столкнулся с тем, что legacy-сервер на CentOS 6 не принимал ed25519 — пришлось генерировать отдельный RSA-ключ только для него:
ssh-keygen -t rsa -b 4096 -C "legacy-server" -f ~/.ssh/id_rsa_legacy
Копирование ключа на сервер
ssh-copy-id — стандартный способ добавить публичный ключ на удалённый сервер:
ssh-copy-id -i ~/.ssh/id_ed25519.pub deployer@YOUR_SERVER_IP
Команда добавляет содержимое .pub-файла в ~/.ssh/authorized_keys на сервере. Если ssh-copy-id недоступен (Windows без WSL), то вручную:
# С локальной машины
cat ~/.ssh/id_ed25519.pub | ssh deployer@YOUR_SERVER_IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
После копирования проверить вход по ключу в новом терминале, не закрывая текущую сессию:
ssh deployer@YOUR_SERVER_IP
Если вход прошёл без запроса пароля (или с запросом passphrase от ключа) — ключ работает.
Права на файлы — частая причина «ключ не работает»
OpenSSH отказывается использовать ключи, если права на файлы слишком широкие. Это защита от чтения ключей другими пользователями системы. Правильные значения:
# На локальной машине
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 644 ~/.ssh/config
# На сервере
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Если после ssh-copy-id подключение всё равно просит пароль — в 80% случаев проблема именно в правах. Проверить на сервере:
ls -la ~/.ssh/
Владелец всех файлов в ~/.ssh/ должен совпадать с пользователем, под которым логинитесь. Если файлы принадлежат root, а заходите как deployer — SSH откажет молча.
Отключение парольной аутентификации
После того как ключ работает и проверен, парольный вход нужно отключить — иначе ключи не защищают от брутфорса:
sudo vim /etc/ssh/sshd_config
Три директивы:
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
sudo sshd -t # проверить конфиг на ошибки
sudo systemctl restart sshd
sshd -t — аналог nginx -t, проверяет синтаксис конфига до перезапуска. Кстати, мало кто обращает внимание на эту команду, а она спасает от блокировки собственного доступа к серверу.
Не закрывать текущую SSH-сессию до проверки нового подключения. Если конфиг содержит ошибку — текущая сессия останется рабочей и позволит откатить изменения.
~/.ssh/config — управление подключениями
SSH-конфиг на локальной машине позволяет заменить длинные команды на короткие алиасы. Вместо:
ssh -i ~/.ssh/id_ed25519 -p 2222 deployer@185.120.33.47
Достаточно:
ssh myproject
Файл ~/.ssh/config:
Host myproject
HostName 185.120.33.47
User deployer
Port 22
IdentityFile ~/.ssh/id_ed25519
Host staging
HostName 185.120.33.48
User deployer
Port 22
IdentityFile ~/.ssh/id_ed25519
Host legacy
HostName 10.0.0.5
User admin
IdentityFile ~/.ssh/id_rsa_legacy
# Старый сервер — не поддерживает ed25519
Конфиг работает не только для ssh — его подхватывают scp, rsync, git, ssh-copy-id и другие инструменты, использующие OpenSSH.
Wildcard-правила
Общие параметры для всех серверов:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
ServerAliveInterval 60 отправляет keepalive-пакет каждые 60 секунд — спасает от обрыва SSH-сессии при неактивности. На практике это выглядит проще, чем кажется: добавил три строки один раз — забыл про «Connection reset by peer».
SSH-agent — не вводить passphrase каждый раз
SSH-agent хранит расшифрованные ключи в памяти на время сессии. Без него каждое подключение запрашивает passphrase:
# Запустить agent (обычно запускается автоматически)
eval "$(ssh-agent -s)"
# Добавить ключ
ssh-add ~/.ssh/id_ed25519
На Ubuntu с графическим окружением ssh-agent обычно работает через GNOME Keyring и запускается автоматически. На чистом сервере — добавить в ~/.bashrc:
if [ -z "$SSH_AUTH_SOCK" ]; then
eval "$(ssh-agent -s)" > /dev/null
ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi
Agent Forwarding — ключи через промежуточный сервер
Если с рабочего сервера нужно подключиться к другому (например, pull из приватного Git-репозитория) — agent forwarding пробрасывает ключи с локальной машины:
ssh -A deployer@server1
# На server1 теперь доступны ключи с вашей машины
git clone git@github.com:yourorg/private-repo.git
В ~/.ssh/config:
Host server1
HostName 185.120.33.47
User deployer
ForwardAgent yes
Agent forwarding безопасен, пока вы доверяете серверу. Если сервер скомпрометирован — злоумышленник может использовать проброшенный ключ для подключения к другим серверам, пока ваша сессия активна. Не включайте forwarding для серверов, которым не доверяете полностью.
fail2ban — защита от брутфорса
fail2ban анализирует логи и блокирует IP-адреса после серии неудачных попыток входа. Даже с отключённой парольной аутентификацией fail2ban полезен: он снижает нагрузку от ботов и уменьшает шум в логах.
sudo apt install -y fail2ban
Создать локальный конфиг (не редактировать jail.conf — он перезаписывается при обновлении):
sudo vim /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
Настройки: 5 неудачных попыток за 10 минут → бан на 1 час. Для production-серверов стоит иметь в виду один нюанс: можно увеличить bantime до 86400 (24 часа) и снизить maxretry до 3.
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Проверить статус
sudo fail2ban-client status sshd
Вывод покажет количество текущих банов и список заблокированных IP. На свежем VPS через пару часов уже будут первые записи — боты сканируют SSH-порты постоянно.
Смена стандартного порта SSH
Смена порта 22 на нестандартный не является защитой от целенаправленной атаки (nmap просканирует все порты за минуты), но отсекает 95% автоматических ботов, которые стучатся только на 22:
sudo vim /etc/ssh/sshd_config
Port 2222
sudo sshd -t
sudo systemctl restart sshd
До перезапуска — открыть новый порт в firewall:
sudo ufw allow 2222/tcp comment 'SSH custom'
sudo ufw delete allow 22/tcp
Порядок критичен: сначала открыть новый порт, потом перезапустить sshd, потом проверить подключение, и только после этого закрыть старый порт 22.
Обновить ~/.ssh/config на локальной машине:
Host myproject
HostName 185.120.33.47
Port 2222
...
FAQ
Какой алгоритм SSH-ключа выбрать в 2026 году?
Ed25519 — для всех новых серверов. Ключ в 20–30 раз быстрее RSA с эквивалентной криптостойкостью, занимает 68 символов вместо 700+. RSA-4096 — только для legacy-систем, не поддерживающих Ed25519 (OpenSSH < 6.5).
Можно ли использовать один SSH-ключ для всех серверов?
Технически — да. Практически — не рекомендуется. Если ключ утечёт, компрометируются все серверы. Минимальная гигиена: отдельный ключ для production, отдельный для staging, отдельный для Git. В ~/.ssh/config задаётся, какой ключ для какого хоста.
Забыл passphrase от ключа — как восстановить?
Никак. Passphrase не хранится и не восстанавливается. Единственный вариант — сгенерировать новый ключ (ssh-keygen -t ed25519) и заменить публичный ключ на всех серверах, где использовался старый. Именно поэтому пароль от ключа стоит хранить в менеджере паролей.
fail2ban нужен, если пароли отключены?
Да. Отключённые пароли защищают от взлома, но не от нагрузки. Бот, пытающийся подключиться 10 000 раз в минуту, нагружает sshd и засоряет /var/log/auth.log. fail2ban блокирует IP после первых попыток, снижая шум до нуля.
Как пробросить порт через SSH для доступа к pgAdmin?
Для безопасного доступа к сервисам, которые не должны быть открыты в интернет (pgAdmin, Grafana, RabbitMQ), используйте SSH-туннелирование. Подробный гайд с примерами — в статье про SSH Port Forwarding.
Полезные ссылки
- Настройка VPS для production — 8 шагов — полный цикл подготовки сервера, включая firewall, Docker, Nginx, SSL
- SSH Port Forwarding: безопасный доступ к серверным приложениям — туннелирование для pgAdmin, Grafana, админ-панелей
- Сравнение облачных провайдеров России 2026 — Timeweb vs SpaceWeb vs Selectel
- OpenSSH Manual Pages
- fail2ban Documentation