Настройка SSH-доступа по ключам в Ubuntu 22.04 — обязательный шаг для защиты VPS или выделенного сервера от атак. Из нашей статьи вы узнаете, как заменить пароли на криптографические ключи с нужными параметрами, как настроить подключение на стороне сервера и клиента и как подключить двухфакторную аутентификацию.

Протокол SSH (Secure Shell) давно стал стандартом для безопасного подключения к Linux-серверам, но выбор метода аутентификации вызывает вопросы. Привычный вход по паролю хоть и кажется интуитивно понятным, но уже не соответствует современным требованиям информационной безопасности. Пароли уязвимы по своей природе: их можно подобрать брутфорсом, перехватить при передаче или случайно раскрыть.
Аутентификация по ключу предлагает принципиально иной подход — вместо запоминаемых символов используются криптографические ключи, работающие на основе асимметричного шифрования. Публичный ключ, размещённый на сервере, выступает как «замок», а приватный, хранящийся у пользователя, — как уникальный «ключ» к нему. Даже если злоумышленник получит публичную часть, он не сможет восстановить приватную.
Из этой статьи вы узнаете, как настроить SSH-доступ с ключами в Ubuntu 22.04 и усилить защиту сервера. Мы разберём не только базовые шаги, но и тонкости — от выбора алгоритмов шифрования до интеграции с Google Authenticator.
Генерируем SSH-ключи на Ubuntu
Начнём с создания ключевой пары на клиентской машине. Команда ssh-keygen создаст пару ключей — публичный (открытый) и приватный. Разберёмся, какие дополнительные флаги можно указать, чтобы получить ключи с нужными параметрами.
Вот список:
- -t задаёт тип ключа или криптографический алгоритм. Для Ubuntu 22.04 актуальны алгоритмы Ed25519 и RSA 4096 бит. Первый предпочтительнее благодаря меньшему размеру ключа при сопоставимой криптостойкости (256 бит против 4096 у RSA).
- Флаг -a 100 указывает количество раундов формирования ключа (KDF), повышая устойчивость к брутфорсу. Чем выше значение, тем больше вычислительных ресурсов потребуется для подбора методом brute-force. Рекомендуем устанавливать от 100 до 500.
- -C "комментарий" добавляет произвольный комментарий к публичному ключу. Вы можете указать его назначение, контактную или любую другую информацию. Комментарий будет виден в файле ~/.ssh/id_ed25519.pub после основного содержимого.
Команда выполняется с правами суперпользователя:
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C "комментарий для идентификации"
Для устаревших систем, где Ed25519 не поддерживается, выберите RSA 4096 бит:
ssh-keygen -t rsa -b 4096 -a 100 -f ~/.ssh/id_rsa -C "резервный RSA-4096"
Будут созданы два файла ключей: id_ed25519 (приватный) и id_ed25519.pub (публичный) или id_rsa и id_rsa.pub.
В процессе вы сможете задать парольную фразу для доступа к ключам. По умолчанию оба они сохраняются в ~/.ssh/. Обратите внимание: права доступа к директории должны быть 700, а к файлам приватных ключей — 600. Проверьте это командой:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519 ~/.ssh/id_rsa
Здесь:
- 700 — полный доступ только для владельца директории (чтение, запись, выполнение);
- 600 — только владелец может читать и записывать файл ключа, что важно для безопасности: при более широких правах OpenSSH откажется использовать приватный ключ.
Передача ключа на сервер
Перенесём публичный ключ на сервер. Классический способ — с помощью утилиты ssh-copy-id. На клиентском устройстве:
ssh-copy-id -i ~/.ssh/id_*.pub user@host
Вместо id_*.pub и user@host введите ваши данные. В результате ключ будет записан в файл на сервере:
/root/.ssh/authorized_keys
То же самое можно сделать вручную — чтобы разобраться с процессом:
cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Обратите внимание на последовательность команд в кавычках:
- создание .ssh с правильными правами;
- добавление ключа в authorized_keys;
- установка прав на сам файл.
Если права на authorized_keys шире, чем 600, OpenSSH проигнорирует ключи из этого файла! Поэтому обязательно проверьте их:
stat -c "%a %n" ~/.ssh/authorized_keys # Должно быть 600
Конфигурация sshd на сервере
Теперь настроим sshd на сервере, чтобы мы могли подключаться по ssh с ключом, а не паролем. Основной файл настроек:
/etc/ssh/sshd_config
Нужно открыть его и изменить значение некоторых директив. Помните, что после любых изменений нужно перезагружать демон и проверять, есть ли ошибки:
systemctl reload sshd
systemctl status sshd
Рассмотрим ключевые параметры конфига:
Port 2222. Изменение стандартного порта 22 на нестандартный (например, 2222) снижает число автоматических атак, так как боты сканируют порт 22 по умолчанию. После изменения порта обновите настройки файрвола:
sudo ufw allow 2222/tcp
sudo ufw reload
Здесь:
- PermitRootLogin prohibit-password — запрет входа пользователя root по паролю. Перед применением убедитесь, что в системе есть альтернативный пользователь с правом sudo.
- PasswordAuthentication no — полное отключение парольной аутентификации; оставьте yes, пока не протестируете вход с ключом.
- PubkeyAuthentication yes — включение аутентификации по ключу.
- AuthenticationMethods publickey — перечислены методы аутентификации. Здесь — только ключи. Чтобы добавить 2FA, измените значение на publickey keyboard-interactive.
- AllowUsers deploy admin — явное указание разрешённых пользователей.
- ClientAliveInterval 300 и ClientAliveCountMax 3 — сервер будет посылать keepalive-запросы каждые 5 минут (указано в секундах) — всего будет три такие попытки, после чего неактивные сессии будут разорваны.
- KexAlgorithms curve25519-sha256 — современные алгоритмы обмена ключами.
- Ciphers chacha20-poly1305@openssh.com — приоритетный шифр.
Перед отключением парольной аутентификации убедитесь, что ключ работает:
ssh -i ~/.ssh/id_ed25519 user@host
И только если вы успешно вошли — меняйте значение PasswordAuthentication.
Особенности настройки ssh на Ubuntu 22.04:
- По умолчанию используется OpenSSH 8.9p1.
- Поддержка FIDO/U2F-ключей через ssh-keygen -t ed25519-sk.
- Включён механизм systemd для управления сессиями.
Как усилить защиту с двухфакторной аутентификацией
Комбинируйте ключи с Google Authenticator. Установите пакет аутентификатора:
sudo apt install libpam-google-authenticator
Настройте для пользователя:
google-authenticator -t -d -f -r 3 -R 30 -w 3
Флаги:
- -t — использовать Time-based OTP (пароли, зависящие от времени);
- -d — отключить кеширование успешных аутентификаций;
- -f — принудительно сохранить настройки без подтверждения;
- -r 3 — разрешить 3 попытки ввода кода;
- -R 30 — окно времени для попыток — 30 секунд;
- -w 3 — создать 3 резервных кода для восстановления.
Не забудьте изменить значение:
AuthenticationMethods в /etc/ssh/sshd_config
А в файл:
/etc/pam.d/sshd
добавьте:
auth required pam_google_authenticator.so nullok
Как подключиться по ssh с ключом
Для соединения с сервером нужно знать:
- IP-адрес или доменное имя хоста,
- имя пользователя,
- путь к приватному ключу,
- порт, если он нестандартный.
Команда:
ssh -i ~/.ssh/id_ed25519 username@host -p 2222
Где:
- -i — путь к приватному ключу (по умолчанию SSH ищет id_rsa или id_ed25519 в ~/.ssh/);
- username@host — логин учётной записи на сервере и хост;
- -p — порт сервера (если изменён со стандартного 22).
Тонкая настройка клиента ssh
Чтобы подключаться было проще, создайте и настройте конфиг клиента ~/.ssh/config с содержимым:
Host myserver
HostName 192.168.1.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 60
Compression yes
ControlMaster auto
ControlPath ~/.ssh/control-%r@%h:%p
ControlPersist 1h
LogLevel ERROR
Эти параметры:
- IdentitiesOnly yes — запрещает использовать ключи из SSH-агента, кроме явно указанных.
- ServerAliveInterval — отправляет keepalive-пакеты каждые 60 секунд для поддержания соединения.
- Compression — включает сжатие данных.
- Control* — используют мультиплексирование сессий.
- LogLevel ERROR — скрывает информационные сообщения, оставляя только ошибки.
Теперь подключение выполняется одной командой:
ssh myserver
Типичные проблемы и их решение
Ошибка «Permission denied (publickey)». Такая ошибка возникает, если сервер не принимает ключи для аутентификации. Проверьте следующее:
Права доступа к директории и ключам:
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_*
Соответствие ключей: приватный ключ на клиенте должен соответствовать публичному на сервере:
~/.ssh/authorized_keys
SELinux/AppArmor: убедитесь, что политика не блокирует доступ:
sudo aa-status | grep ssh
Медленное подключение по SSH
Если соединение устанавливается с задержкой:
Отключите проверку DNS в sshd_config:
UseDNS no
Используйте только IPv4 (если IPv6 не используется):
ssh -4 user@host
Ключ не принимается после обновления системы
После обновления Ubuntu может измениться версия OpenSSH, и старые типы ключей больше не поддерживаются:
Для обратной совместимости добавьте в sshd_config:
PubkeyAcceptedKeyTypes +ssh-rsa
Это позволит принимать ключи старого формата RSA.
Убедитесь, что используемый алгоритм поддерживается текущей версией OpenSSH.
Рекомендации по безопасности
- Регулярно меняйте ключи: установите cron-задачу для напоминания о смене каждые 6 месяцев.
- Используйте аппаратные токены: ключи, хранящиеся на устройствах вроде YubiKey или OnlyKey, невозможно извлечь программно.
- Сегментируйте доступ: создавайте разные ключи для производственных серверов, резервных копий, CI/CD-систем.
- Позаботьтесь об аварийном доступе: создайте резервный ключ и храните его в зашифрованном виде (например, с помощью age или gpg).
Заключение
Вы настроили вход по SSH-ключу на Ubuntu 22.04 и теперь ваш сервер надёжно защищён. Но не оставляйте заботу о безопасности: регулярно обновляйте OpenSSH, мониторьте CVE-уязвимости и используйте инструменты для проверки конфигурации.
Читайте в блоге:
- Подключение к серверу по SSH с ключом и парольной фразой
- Список основных SSH-команд для управления виртуальным сервером с пояснением и примерами
- Как авторизовать SSH по ключу