Открыть сервис

Аутентификация по ключам SSH

Аутентификация по ключам SSH — это метод проверки подлинности пользователя при подключении к удалённому серверу по протоколу SSH (Secure Shell), основанный на использовании пары криптографических ключей (открытого и закрытого) вместо традиционного ввода пароля. Данный способ обеспечивает более высокий уровень безопасности по сравнению с парольной аутентификацией, так как устойчив к атакам перебора, фишингу и перехвату учётных данных.

Принцип работы

Аутентификация по ключам SSH использует асимметричное шифрование. Пользователь генерирует пару ключей: закрытый ключ (private key), который хранится в секрете на клиентской машине, и открытый ключ (public key), который помещается на сервер. При подключении клиент доказывает серверу, что владеет соответствующим закрытым ключом, не передавая его по сети.

Процесс аутентификации включает следующие этапы:

  1. Инициализация соединения: клиент устанавливает TCP-соединение с сервером на порт 22 (по умолчанию) и инициирует SSH-рукопожатие.
  2. Обмен ключами: стороны согласовывают параметры шифрования и генерируют общий сеансовый ключ с помощью алгоритма Диффи — Хеллмана или его вариантов (например, Curve25519).
  3. Запрос аутентификации: клиент отправляет серверу запрос на аутентификацию, указывая имя пользователя и метод (publickey).
  4. Проверка сервером: сервер проверяет, есть ли в файле ~/.ssh/authorized_keys для данного пользователя открытый ключ, соответствующий запрошенному. Если ключ найден, сервер отправляет клиенту случайную строку (челлендж), зашифрованную открытым ключом.
  5. Ответ клиента: клиент расшифровывает челлендж своим закрытым ключом и отправляет серверу подтверждение (обычно это хеш от челленджа и сеансового идентификатора).
  6. Верификация: сервер проверяет правильность ответа. Если он корректен, аутентификация считается успешной, и пользователь получает доступ к оболочке или команде.

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

Для создания пары ключей используется утилита ssh-keygen, входящая в состав OpenSSH. Типичная команда выглядит так:

``bash ssh-keygen -t ed25519 -C "comment@example.com" ``

Параметры генерации включают:

  • Тип ключа: наиболее распространённые алгоритмы — RSA (рекомендуется длина не менее 2048 бит, обычно 4096), ECDSA (на базе эллиптических кривых), Ed25519 (современный и быстрый алгоритм на основе кривой Curve25519). Ed25519 считается предпочтительным благодаря высокой скорости и безопасности.
  • Размер ключа: для RSA указывается в битах (например, 4096). Для Ed25519 и ECDSA размер фиксирован.
  • Комментарий: произвольная строка, часто содержащая email или имя хоста, для идентификации ключа.
  • Парольная фраза (passphrase): дополнительная защита закрытого ключа. Если задана, при каждом использовании ключа требуется её ввод. Хранение ключа без парольной фразы снижает безопасность, но удобно для автоматизации.

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

  • ~/.ssh/id_ed25519 — закрытый ключ (никому не передаётся, права доступа должны быть 600).
  • ~/.ssh/id_ed25519.pub — открытый ключ (может свободно распространяться).

Установка открытого ключа на сервер

Чтобы разрешить аутентификацию по ключу, открытый ключ пользователя должен быть добавлен в файл ~/.ssh/authorized_keys на сервере. Это можно сделать несколькими способами:

  • Вручную: скопировать содержимое публичного ключа в конец файла ~/.ssh/authorized_keys на сервере.
  • С помощью ssh-copy-id: утилита автоматически копирует ключ на сервер и устанавливает правильные права доступа. Пример: ssh-copy-id user@server.
  • Через SSH-сессию: подключиться по паролю и выполнить команду echo "публичный_ключ" >> ~/.ssh/authorized_keys.

Важно, чтобы права доступа к файлам были корректными: каталог ~/.ssh должен иметь права 700, файл authorized_keys — 600. В противном случае сервер может отказать в аутентификации.

Преимущества перед парольной аутентификацией

  • Устойчивость к перебору: злоумышленник не может угадать закрытый ключ, так как он представляет собой длинную случайную последовательность. Атаки по словарю или brute-force на пароль становятся невозможны.
  • Отсутствие передачи секрета по сети: закрытый ключ никогда не покидает клиентскую машину. Даже при перехвате трафика злоумышленник не получит учётных данных.
  • Возможность отзыва: при компрометации ключа достаточно удалить его из authorized_keys на всех серверах. Не требуется менять пароль на каждой машине.
  • Автоматизация: ключи позволяют организовать безпарольные подключения в скриптах и системах автоматизации (Ansible, CI/CD), что невозможно с паролями без их хранения в открытом виде.
  • Многофакторность: ключи можно комбинировать с парольной фразой (passphrase) или аппаратными токенами (например, YubiKey), реализуя двухфакторную аутентификацию.

Недостатки и риски

  • Управление ключами: при большом количестве серверов и пользователей возникает проблема распространения и отзыва открытых ключей. Решением служат централизованные системы управления доступом (например, на базе LDAP или SSH Certificate Authority).
  • Потеря закрытого ключа: если закрытый ключ утерян, доступ к серверу будет невозможен до восстановления ключа или использования альтернативного метода (например, консольного доступа через гипервизор).
  • Компрометация клиентской машины: если злоумышленник получает доступ к файловой системе клиента, он может скопировать закрытый ключ. Использование парольной фразы и шифрования диска снижает этот риск.
  • Сложность для неопытных пользователей: процесс генерации и установки ключей требует базовых знаний командной строки, что может быть барьером для новичков.

Настройка сервера

Для использования ключей SSH на сервере необходимо настроить демон sshd. Основные параметры в файле /etc/ssh/sshd_config:

  • PubkeyAuthentication yes — разрешает аутентификацию по открытым ключам (обычно включено по умолчанию).
  • AuthorizedKeysFile .ssh/authorized_keys — указывает путь к файлу с ключами.
  • PasswordAuthentication no — отключает парольную аутентификацию, оставляя только ключи. Рекомендуется для повышения безопасности, но требует предварительной установки ключей.
  • PermitRootLogin prohibit-password — запрещает вход root по паролю, разрешая только по ключу.

После изменения конфигурации необходимо перезапустить службу SSH (systemctl restart sshd).

Типы ключей и алгоритмы

Наиболее распространённые алгоритмы для SSH-ключей:

АлгоритмТипРазмер по умолчаниюПримечание
RSAАсимметричный3072 или 4096 битШироко поддерживается, но медленнее современных алгоритмов
ECDSAЭллиптическая кривая256, 384 или 521 битБыстрее RSA, но менее распространён
Ed25519Эллиптическая кривая256 битРекомендуется как наиболее безопасный и производительный
DSAАсимметричный1024 битУстарел, не рекомендуется к использованию

Применение в автоматизации

В системах непрерывной интеграции и развёртывания (CI/CD), таких как Jenkins, GitLab CI, GitHub Actions, аутентификация по ключам SSH используется для подключения к удалённым серверам без интерактивного ввода пароля. Для этого закрытый ключ обычно хранится в зашифрованном виде в секретах системы, а открытый — на целевом сервере.

Также ключи SSH широко применяются в системах управления конфигурациями (Ansible, SaltStack, Puppet) для выполнения команд на множестве машин.

Безопасность и рекомендации

  • Использовать алгоритм Ed25519 как наиболее современный и безопасный.
  • Устанавливать парольную фразу на закрытый ключ.
  • Регулярно обновлять OpenSSH до последней версии.
  • Отключать парольную аутентификацию на серверах, где это возможно.
  • Использовать SSH-агент (ssh-agent) для кэширования ключей и избежания многократного ввода парольной фразы.
  • Применять Certificate Authority (CA) SSH для централизованного управления ключами и возможности их отзыва.
  • Хранить закрытые ключи только на доверенных устройствах с шифрованием диска.

Источники

  • OpenSSH manual: ssh(1), sshd(8), ssh-keygen(1), ssh_config(5)
  • RFC 4252 — The Secure Shell (SSH) Authentication Protocol
  • RFC 4253 — The Secure Shell (SSH) Transport Layer Protocol
  • Документация OpenSSH на официальном сайте OpenBSD
  • Статья «SSH Key Authentication» в ArchWiki

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →