Пароли для SSH — это прошлый век. Я перевёл все свои серверы на ключи ещё в 2019 году, и с тех пор не было ни одного случая несанкционированного доступа, хотя боты ломятся на порт 22 каждые несколько секунд — это видно в логах.
Почему пароли для SSH — плохая идея
Честно говоря, я удивляюсь, когда вижу сервер с парольной аутентификацией в 2026 году. Это как оставлять ключ под ковриком у двери. Да, удобно. Но все знают, где искать.
Брутфорс-атаки на SSH — это автоматизированный процесс. Боты сканируют весь диапазон IPv4 за несколько часов, находят открытый 22 порт и начинают перебирать пароли. У меня был клиент — небольшой интернет-магазин на Битрикс, VPS на Ubuntu 20.04. Зашли в панель хостинга, смотрим логи auth.log — 47 000 неудачных попыток входа за одни сутки. 47 тысяч! И это не DDoS, это просто фоновый шум интернета. Пароль у них был "Qwerty2022!" — угадайте, как долго бы он продержался.
SSH-ключи решают проблему принципиально иначе. Даже если злоумышленник знает ваш логин и перебирает варианты — без приватного ключа он никуда не попадёт. Математически. RSA-4096 или Ed25519 — это не пароль, который можно угадать за миллион попыток. Это криптография, которую не сломать перебором.
Если тема безопасности сервера для вас важна, рекомендую также почитать статью про настройку Firewall — там я разбирал iptables и ufw в связке с защитой SSH-порта.
Типы SSH-ключей: что выбрать в 2026 году
Есть несколько алгоритмов. Я использую два: Ed25519 для большинства задач и RSA-4096 там, где нужна совместимость со старым оборудованием или провайдерами. Разберём каждый.
Ed25519
Мой фаворит. Ключ короткий, операции быстрые, безопасность высокая. Основан на эллиптической криптографии. Размер публичного ключа — около 68 символов против 700+ у RSA-4096. Поддерживается OpenSSH начиная с версии 6.5, то есть везде, где вы сейчас работаете. Если у вас Ubuntu 22.04, Debian 12, CentOS Stream 9 — Ed25519 работает из коробки.
RSA-4096
Классика. Работает абсолютно везде, включая легаси-системы. Если вам нужно подключаться к старому серверу с OpenSSH 5.x (встречается на совсем древних CentOS 6) — RSA ваш вариант. Ключ в 4096 бит достаточно надёжен, хотя и медленнее Ed25519.
ECDSA и DSA
ECDSA — неплохой вариант, но есть нюансы с реализацией. DSA — забудьте про это, он устарел и отключён в современных версиях OpenSSH по умолчанию. Не используйте DSA в 2026 году, это реально плохая идея.
Генерация SSH-ключей: пошаговая инструкция
Генерируем на локальной машине — не на сервере. Это принципиально. Приватный ключ никогда не должен покидать вашу рабочую станцию.
Linux и macOS
# Ed25519 — рекомендуемый вариант
ssh-keygen -t ed25519 -C "pavel@webfull.ru" -f ~/.ssh/id_ed25519_myserver
# RSA-4096 — если нужна совместимость
ssh-keygen -t rsa -b 4096 -C "pavel@webfull.ru" -f ~/.ssh/id_rsa_myserver
# Флаги:
# -t тип алгоритма
# -b размер ключа (только для RSA)
# -C комментарий (обычно email или описание)
# -f путь к файлу ключа
Система спросит passphrase — пароль для защиты самого ключа. Я настоятельно рекомендую его задать. Да, придётся вводить при каждом подключении (или использовать ssh-agent), но если ноутбук украдут — без passphrase ключ сразу скомпрометирован.
После генерации у вас будет два файла: id_ed25519_myserver (приватный, никому не показывайте) и id_ed25519_myserver.pub (публичный, его копируем на сервер).
Windows
На Windows 10/11 OpenSSH встроен начиная с версии 1809. Открываете PowerShell и выполняете те же команды. Если по каким-то причинам OpenSSH не установлен — устанавливается через "Дополнительные компоненты" в настройках системы. PuTTYgen тоже работает, но я рекомендую нативный OpenSSH — он совместим с остальными инструментами без танцев с бубном.
Копирование публичного ключа на сервер
Есть несколько способов. Самый простой — команда ssh-copy-id. Но она работает только если у вас ещё есть доступ по паролю (то есть при первоначальной настройке).
# Способ 1: ssh-copy-id (самый удобный)
ssh-copy-id -i ~/.ssh/id_ed25519_myserver.pub user@192.168.1.100
# Способ 2: ручной (если ssh-copy-id недоступен)
cat ~/.ssh/id_ed25519_myserver.pub | ssh user@192.168.1.100 \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
cat >> ~/.ssh/authorized_keys && \
chmod 600 ~/.ssh/authorized_keys"
# Способ 3: через буфер обмена и nano
# Копируете содержимое .pub файла
# Заходите на сервер по паролю
# nano ~/.ssh/authorized_keys
# Вставляете ключ, сохраняете
Обратите внимание на права доступа. Это критически важно. Папка ~/.ssh должна иметь права 700, файл authorized_keys — 600. Если права выставлены неправильно, SSH просто проигнорирует ключи и продолжит требовать пароль. Я несколько раз видел эту проблему у новичков — потратили час на настройку, а дело было в chmod.
Настройка SSH config на клиенте
Чтобы не вводить каждый раз длинную команду с указанием ключа и пользователя, создаём файл ~/.ssh/config:
# ~/.ssh/config
Host myserver
HostName 192.168.1.100
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_myserver
IdentitiesOnly yes
Host staging
HostName staging.myproject.ru
User www-data
Port 22
IdentityFile ~/.ssh/id_ed25519_staging
IdentitiesOnly yes
ForwardAgent no
После этого подключение выглядит просто: ssh myserver. Никаких флагов, никаких длинных команд. Флаг IdentitiesOnly yes говорит SSH использовать только указанный ключ, а не перебирать все доступные — это ускоряет подключение и делает поведение предсказуемым.
Настройка sshd_config: отключаем пароли, усиливаем безопасность
Вот здесь начинается самое интересное. После того как вы убедились, что вход по ключу работает — отключаем парольную аутентификацию. Редактируем /etc/ssh/sshd_config:
# /etc/ssh/sshd_config
# Отключаем парольную аутентификацию
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
# Отключаем вход под root (обязательно!)
PermitRootLogin no
# Разрешаем только конкретных пользователей
AllowUsers deploy pavel
# Меняем порт (опционально, но снижает шум в логах)
Port 2222
# Таймаут для неактивных соединений
ClientAliveInterval 300
ClientAliveCountMax 2
# Ограничиваем число попыток аутентификации
MaxAuthTries 3
# Отключаем X11 Forwarding если не нужен
X11Forwarding no
# Только протокол SSH2
Protocol 2
# Разрешённые алгоритмы (современные)
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group14-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com
После изменений обязательно проверяем конфиг перед перезапуском:
sshd -t
# Если нет вывода — конфиг валидный
# Перезапускаем sshd
systemctl reload sshd
# или
systemctl restart ssh # на Ubuntu/Debian
Смена порта SSH и настройка Fail2Ban
Смена стандартного порта 22 на нестандартный — это не панацея, но реально снижает количество мусора в логах. С порта 22 на 2222 или любой другой в диапазоне 1024-65535. После смены порта в sshd_config не забудьте открыть его в файрволе и закрыть 22.
# UFW (Ubuntu/Debian)
ufw allow 2222/tcp
ufw delete allow 22/tcp
ufw reload
# iptables
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
iptables-save > /etc/iptables/rules.v4
Но даже с ключами я всегда устанавливаю Fail2Ban. Это дополнительный уровень защиты — если кто-то пытается подобрать ключи или делает много неудачных попыток подключения, IP блокируется автоматически.
# Установка
apt install fail2ban -y # Debian/Ubuntu
yum install fail2ban -y # CentOS/RHEL
# Создаём локальный конфиг (не редактируем jail.conf!)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Редактируем /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.local
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 ВАШ_ДОМАШНИЙ_IP
[sshd]
enabled = true
port = 2222
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 86400
После настройки: systemctl enable fail2ban && systemctl start fail2ban. Проверить заблокированные IP: fail2ban-client status sshd.
Кстати, про комплексную защиту сервера я писал подробнее в статье про защиту сайта от взлома — там есть ещё несколько практических советов, которые дополняют настройку SSH.
SSH-agent и Agent Forwarding: удобство без потери безопасности
SSH-agent — это демон, который хранит расшифрованные ключи в памяти. Один раз вводите passphrase при запуске агента, дальше подключаетесь без ввода пароля. Это не снижает безопасность при правильном использовании.
# Запуск агента
eval "$(ssh-agent -s)"
# Добавление ключа (попросит passphrase)
ssh-add ~/.ssh/id_ed25519_myserver
# Список загруженных ключей
ssh-add -l
# На macOS можно сохранить в Keychain
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_myserver
На Linux удобно добавить в ~/.bashrc или ~/.zshrc автозапуск агента. Или использовать keychain — он сохраняет агент между сессиями.
Agent Forwarding — осторожно
Agent Forwarding позволяет использовать ваши локальные ключи на промежуточных серверах. Например: локалка → staging → production. Удобно для деплоя. Но есть риск: если промежуточный сервер скомпрометирован, злоумышленник может использовать ваш агент пока соединение активно.
Мой подход: включаю ForwardAgent только для конкретных хостов в ~/.ssh/config, не глобально. И только для серверов, которым полностью доверяю.
# ~/.ssh/config
Host staging.myproject.ru
ForwardAgent yes # только для этого хоста
Host *
ForwardAgent no # для всех остальных — выключено
Организация ключей для команды: authorized_keys и принципы
Когда с сервером работает команда из 5-10 человек, управление ключами становится отдельной задачей. У меня в практике несколько подходов в зависимости от размера проекта.
Для небольших команд — просто файл authorized_keys с комментариями. Каждый разработчик присылает свой публичный ключ, я добавляю его с комментарием: кто, когда добавлен. Когда человек уходит из команды — удаляю его строку. Просто и понятно.
# ~/.ssh/authorized_keys
# Pavel Ivanov - добавлен 2025-01-15
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGx... pavel@webfull.ru
# Dmitry Petrov - добавлен 2025-03-20
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOk... dmitry@company.ru
# Sergey Sidorov - ЗАБЛОКИРОВАН 2025-11-01
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIQm... sergey@old.ru
Для больших команд или множества серверов — уже нужны инструменты: Ansible, HashiCorp Vault, или специализированные решения типа Teleport. Это отдельная тема, но суть та же: централизованное управление ключами с аудитом доступа.
Ещё один важный момент — ротация ключей. Я рекомендую менять ключи раз в год или при любом подозрении на компрометацию. Генерируете новую пару, добавляете новый публичный ключ на сервер, убеждаетесь что новый ключ работает, удаляете старый. Процедура занимает 5 минут.
Частые ошибки и диагностика проблем
За годы практики я видел одни и те же ошибки снова и снова. Разберу самые распространённые.
Ключ не принимается, хотя всё правильно
Первым делом проверяю права доступа. Это виновник в 80% случаев:
# Правильные права
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
# Проверить текущие права
ls -la ~/.ssh/
# Проверить владельца (должен быть ваш пользователь, не root)
ls -lan ~/.ssh/
Вторая причина — SELinux или AppArmor блокирует доступ к файлу. На CentOS/RHEL с SELinux нужно проверить контекст:
ls -laZ ~/.ssh/authorized_keys
# Должно быть: system_u:object_r:ssh_home_t:s0
# Если контекст неправильный — восстановить
restorecon -Rv ~/.ssh/
Отладочный режим
Если непонятно что происходит — подключаемся с флагом -vvv. Три буквы v дают максимальный уровень отладки:
ssh -vvv -i ~/.ssh/id_ed25519_myserver user@server
# На стороне сервера смотрим логи
tail -f /var/log/auth.log # Ubuntu/Debian
tail -f /var/log/secure # CentOS/RHEL
journalctl -u sshd -f # systemd
Проблема с StrictHostKeyChecking
При первом подключении к новому серверу SSH спрашивает подтвердить fingerprint. Если сервер переустанавливался, а запись в known_hosts осталась — получите ошибку. Решение:
# Удалить старую запись
ssh-keygen -R hostname_or_ip
# Или удалить конкретную строку из known_hosts
# nano ~/.ssh/known_hosts
Безопасность приватного ключа: бэкапы и хранение
Приватный ключ — это ваш пропуск. Потеряли ключ без доступа по паролю — потеряли доступ к серверу. Скомпрометировали ключ — потеряли безопасность. Оба варианта плохие.
Мой подход к хранению ключей:
- Основная рабочая станция — ключи с passphrase, в ~/.ssh/
- Резервная копия — зашифрованный USB-накопитель в сейфе (звучит параноидально, но для критической инфраструктуры оправдано)
- Для команды — менеджер паролей с поддержкой SSH-ключей (1Password, Bitwarden Business)
- Никогда в облаке без шифрования
И никогда — я повторю это ещё раз — никогда не храните приватные ключи в репозитории. Даже в приватном. Даже на секунду. Я видел как разработчик случайно закоммитил ключ в публичный GitHub-репозиторий. Через 8 минут сервер был скомпрометирован — боты мониторят GitHub в реальном времени.
Если такое случилось — немедленно отзываете ключ (удаляете из authorized_keys), генерируете новый, меняете пароли от всех сервисов на этом сервере и проверяете логи на предмет несанкционированных действий. По опыту могу сказать, что настройка мониторинга логов в таких ситуациях помогает быстро понять масштаб проблемы.
SSH-ключи для автодеплоя: CI/CD и деплой-ключи
Отдельная история — ключи для автоматических систем. GitHub Actions, GitLab CI, Jenkins — все они подключаются к серверам по SSH. И здесь нужен отдельный подход.
Правило простое: для каждой автоматизированной системы — отдельный ключ без passphrase (иначе автоматизация не работает), с минимальными правами. Не используйте один ключ для деплоя и для ручного доступа.
# Генерируем деплой-ключ (без passphrase!)
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/id_ed25519_deploy -N ""
# На сервере создаём отдельного пользователя для деплоя
adduser --disabled-password --gecos "" deploy
usermod -aG www-data deploy
# Добавляем ключ только для этого пользователя
mkdir -p /home/deploy/.ssh
cat id_ed25519_deploy.pub >> /home/deploy/.ssh/authorized_keys
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
В GitHub Actions приватный ключ добавляете в Secrets репозитория как SSH_PRIVATE_KEY, и используете в workflow:
# .github/workflows/deploy.yml
- name: Setup SSH
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Deploy to server
run: |
ssh -o StrictHostKeyChecking=no deploy@myserver.ru \
"cd /var/www/myproject && git pull && php artisan migrate --force"
Обратите внимание на StrictHostKeyChecking=no — в CI/CD окружении это часто необходимо, но добавьте fingerprint сервера в known_hosts для продакшна. Безопаснее явно указать fingerprint через ssh-keyscan в начале pipeline.
Если вы работаете с Битрикс или WordPress и вам нужна помощь в настройке безопасной инфраструктуры — я занимаюсь этим в рамках технической поддержки Битрикс и поддержки WordPress-сайтов. Включая настройку SSH, деплой-процессов и мониторинга.
Итоговый чеклист настройки SSH-ключей
Пройдёмся по всему, что нужно сделать для правильной настройки. Я сам использую этот список каждый раз при настройке нового сервера.
- Сгенерировать Ed25519 ключ на локальной машине с passphrase
- Скопировать публичный ключ на сервер через
ssh-copy-id - Проверить права:
~/.ssh— 700,authorized_keys— 600 - Убедиться что вход по ключу работает (не закрывая текущую сессию)
- В
sshd_config: отключить PasswordAuthentication, запретить root-логин - Сменить порт SSH с 22 на нестандартный
- Открыть новый порт в файрволе, закрыть 22
- Установить и настроить Fail2Ban
- Перезапустить sshd, проверить подключение
- Настроить
~/.ssh/configна клиенте для удобства - Для CI/CD — отдельные ключи без passphrase, отдельный пользователь
- Бэкап приватного ключа в надёжное место
По опыту скажу: правильно настроенный SSH с ключами, сменённым портом и Fail2Ban закрывает 99% векторов атак на административный доступ к серверу. Остальной процент — это уязвимости в самом OpenSSH (случаются крайне редко, закрываются обновлениями) или социальная инженерия. Обновляйте систему регулярно, используйте сильные passphrase для ключей, не давайте ключи посторонним — и будете спать спокойно.
Если нужна помощь с настройкой сервера, деплой-процессов или комплексной безопасностью проекта — обращайтесь через страницу доработки сайта, разберёмся с любой конфигурацией.
Хотите защитить свой сервер от несанкционированного доступа?
Наши специалисты настроят SSH-ключи и обеспечат максимальную безопасность вашего сервера в кратчайшие сроки.