Генерация ключей на клиенте

На вашей локальной машине (не на сервере) выполните:

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

Ed25519 надёжнее RSA и короче по длине. Если нужна совместимость со старыми системами: ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Программа предложит путь сохранения (оставьте ~/.ssh/id_ed25519) и парольную фразу. Парольную фразу можно не задавать, но тогда ключ не будет защищён локально.

После выполнения появятся два файла:

  • ~/.ssh/id_ed25519 — приватный ключ (никогда не передавайте его)
  • ~/.ssh/id_ed25519.pub — публичный ключ (копируйте на сервер)

Копирование ключа на сервер

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip

Введите пароль один раз — программа скопирует публичный ключ в ~/.ssh/authorized_keys на сервере.

Проверьте подключение: ssh -i ~/.ssh/id_ed25519 user@server_ip

Если ssh-copy-id недоступен

Скопируйте публичный ключ: cat ~/.ssh/id_ed25519.pub

На сервере:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "содержимое_ключа" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Отключение входа по паролю

Важно: убедитесь, что SSH-ключ работает, прежде чем отключать пароли.

Отредактируйте /etc/ssh/sshd_config:

PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

Проверка конфигурации: sudo sshd -t

Если ошибок нет: sudo systemctl restart sshd

Откат при проблемах

Если застряли, зайдите на сервер через консоль провайдера (VNC, web-terminal) и верните PasswordAuthentication yes.

Защита от брутфорса

sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo fail2ban-client status sshd

Дополнительные настройки sshd_config

PermitRootLogin prohibit-password
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2

Это запретит вход root'у по паролю (только ключ), ограничит попытки и отключает зависшие сессии.

Мультифакторная аутентификация (опционально)

AuthenticationMethods publickey,password

Клиенту придётся сначала пройти проверку ключа, потом ввести пароль.