Вход по SSH-ключу в Linux: настройка ключей ed25519 и отключение входа по паролю

14 мин чтения 3 просмотров 0
Содержание

Любой сервер с публичным IPv4 через несколько минут после запуска начинают атаковать боты, перебирающие SSH-пароли. В этой инструкции показано, как настроить вход по SSH-ключу в Linux с современным ключом ed25519, а затем отключить вход по паролю SSH и не потерять доступ к серверу. Шаги подходят для Debian 11/12, Ubuntu 20.04/22.04/24.04, CentOS 7 и Rocky Linux / AlmaLinux 8 и 9 — на облачных серверах JUSTG в Йоханнесбурге, Москве, Токио и Сеуле, а также на выделенных серверах.

Шаг 1: Создайте пару ключей ed25519 на своём компьютере

Ключ создаётся на том компьютере, с которого вы подключаетесь, а не на сервере. Ключи ed25519 короткие, быстрые и поддерживаются всеми актуальными версиями OpenSSH. Парольная фраза защитит закрытый ключ при утере ноутбука, а ssh-agent избавит от её повторного ввода.

# On your own computer (Linux, macOS, or Windows 10/11 PowerShell)
ssh-keygen -t ed25519 -C "laptop-2026"
# Press Enter to accept ~/.ssh/id_ed25519, then set a passphrase

Появятся два файла: id_ed25519 (закрытый ключ, никому не передавайте) и id_ed25519.pub (открытый ключ, его копируют на серверы).

Шаг 2: Скопируйте открытый ключ на сервер

В Linux и macOS проще всего использовать ssh-copy-id: утилита в последний раз войдёт по паролю и добавит ключ в ~/.ssh/authorized_keys на сервере.

ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
# Custom port example:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 [email protected]

В Windows ssh-copy-id нет, но ключ можно передать по конвейеру из PowerShell:

# Windows PowerShell (ssh-copy-id is not included on Windows)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Шаг 3: Добавьте ключ вручную и исправьте права на authorized_keys

Если вы хотите вставить ключ сами или работаете через VNC-консоль, создайте файл вручную. OpenSSH молча игнорирует authorized_keys, если каталог или файл доступны на запись другим пользователям, поэтому права важны не меньше самого ключа.

# On the server, as the user that will log in
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys      # paste ONE key per line, then save
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R "$(id -un)":"$(id -gn)" ~/.ssh
# CentOS / Rocky / AlmaLinux with SELinux enforcing:
restorecon -Rv ~/.ssh
Каждый открытый ключ должен занимать одну строку, начинающуюся с ssh-ed25519. Перенос строки, добавленный редактором или мессенджером, — самая частая причина, по которой вставленный ключ не принимается.

Шаг 4: Проверьте вход по SSH-ключу до изменения настроек

Откройте новый терминал и подключитесь, разрешив только ключевую аутентификацию. Если вход прошёл без запроса пароля (кроме парольной фразы ключа), ключ работает.

ssh -i ~/.ssh/id_ed25519 -o PasswordAuthentication=no [email protected]

Шаг 5: Отключите вход по паролю SSH в sshd_config

Современные дистрибутивы подключают /etc/ssh/sshd_config.d/*.conf строкой Include в начале основного файла, а sshd использует первое прочитанное значение каждого параметра. Поэтому файл вроде 50-cloud-init.conf с PasswordAuthentication yes может незаметно перекрыть вашу правку ниже в sshd_config. Drop-in-файл с именем, которое стоит первым по алфавиту, решает проблему.

# Check that the drop-in directory is included
grep -i '^Include' /etc/ssh/sshd_config

# Create a drop-in that sorts first (sshd keeps the FIRST value it reads)
cat > /etc/ssh/sshd_config.d/01-key-only.conf <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
EOF

# Look for files that still turn passwords back on (e.g. 50-cloud-init.conf)
grep -ri 'PasswordAuthentication' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

В CentOS 7 и других старых системах без каталога sshd_config.d впишите эти четыре строки прямо в /etc/ssh/sshd_config и закомментируйте более ранний PasswordAuthentication yes. PermitRootLogin prohibit-password оставляет вход root только по ключу; если вы входите обычным пользователем с sudo, укажите no.

Шаг 6: Проверьте конфигурацию SSH и перезагрузите службу

# Validate syntax first - no output means OK
sshd -t
# Show the effective values
sshd -T | grep -Ei 'passwordauthentication|pubkeyauthentication|permitrootlogin|kbdinteractive'

# Debian / Ubuntu
systemctl reload ssh
# CentOS / Rocky / AlmaLinux
systemctl reload sshd

reload не обрывает текущую сессию, но это только половина проверки.

Шаг 7: Проверьте вход во второй сессии, не закрывая первую

Не закрывайте текущее окно SSH. Откройте второй терминал и войдите заново. Отключайтесь только тогда, когда новая сессия работает по ключу, а попытка входа только по паролю отклоняется.
# From a NEW terminal on your computer
ssh [email protected]
# Must be refused:
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password [email protected]
# Expected: Permission denied (publickey).

Если что-то пошло не так, исправьте drop-in-файл в открытой первой сессии и снова выполните reload. Если доступ уже потерян, войдите в личный кабинет JUSTG → Мои продукты и услуги → выберите VPS → панель управления и откройте VNC-консоль; если не нашли её, создайте тикет.

Частые вопросы

ed25519 лучше RSA для SSH-ключей?

Для новых ключей — да. ed25519 даёт высокую стойкость при гораздо более коротком ключе и более быстром рукопожатии. RSA 4096 нужен только для очень старых систем без поддержки ed25519.

Почему сервер всё ещё спрашивает пароль?

Выполните sshd -T | grep -i passwordauthentication. Если выводится yes, другой файл в sshd_config.d читается раньше вашего. Также проверьте /var/log/auth.log (Debian/Ubuntu) или /var/log/secure (Rocky/AlmaLinux) на сообщения «bad ownership or modes» для ~/.ssh.

Можно ли использовать один ключ на нескольких серверах JUSTG?

Да, скопируйте один и тот же открытый ключ на каждый сервер через ssh-copy-id. Закрытый ключ храните только на своих устройствах, а ключ утерянного устройства отзывайте, удаляя его строку из authorized_keys.

Если войти по SSH-ключу так и не удалось, создайте тикет по адресу https://www.justg.com/submitticket.php — техническая поддержка JUSTG поможет.

Помог ли вам данный ответ?

Похожие руководства

root@vps: ~ $ openssl rand -base64 18$ passwd root$ ss -tlnp | grep ':2222' || echo "port 2222 is… Linux-сервер Как безопасно сменить порт SSH и пароль root на Linux VPS Смена порта SSH и пароля root в Linux: sshd_config, SELinux semanage, UFW/firewalld, ssh.socket в Ubuntu и откат через VNC. 15 мин чтения 1 Читать root@vps: ~ $ ss -tulpn$ sshd -T | grep -i '^port'$ nohup sh -c 'sleep 600; ufw disable' >/dev/nu… Linux-сервер Настройка файрвола в Linux: UFW и firewalld на VPS (IPv4 и IPv6) Настройка файрвола Linux через UFW или firewalld: сначала SSH, веб-порты, доступ по IP, IPv6 и восстановление доступа. 16 мин чтения 2 Читать root@vps: ~ $ free -h$ swapon --show$ df -h / Linux-сервер Как добавить swap на Linux VPS (тарифы с 512 МБ и 1 ГБ ОЗУ) Добавление swap на Linux VPS с малым объёмом ОЗУ: файл подкачки через fallocate или dd, fstab и настройка swappiness. 12 мин чтения 2 Читать root@vps: ~ $ df -hT$ df -i$ du -xh --max-depth=1 / 2>/dev/null | sort -h … Linux-сервер Диск заполнен в Linux: как найти и освободить место на VPS Диск Linux заполнен? Ищем, что занимает место (df, du, ncdu), и чистим журнал, кэш apt/dnf, Docker, логи и удалённые файлы. 15 мин чтения 2 Читать