Аутентификация по ключам SSH
Аутентификация по ключам SSH — это метод проверки подлинности пользователя при подключении к удалённому серверу по протоколу SSH (Secure Shell), основанный на использовании пары криптографических ключей (открытого и закрытого) вместо традиционного ввода пароля. Данный способ обеспечивает более высокий уровень безопасности по сравнению с парольной аутентификацией, так как устойчив к атакам перебора, фишингу и перехвату учётных данных.
Принцип работы
Аутентификация по ключам SSH использует асимметричное шифрование. Пользователь генерирует пару ключей: закрытый ключ (private key), который хранится в секрете на клиентской машине, и открытый ключ (public key), который помещается на сервер. При подключении клиент доказывает серверу, что владеет соответствующим закрытым ключом, не передавая его по сети.
Процесс аутентификации включает следующие этапы:
- Инициализация соединения: клиент устанавливает TCP-соединение с сервером на порт 22 (по умолчанию) и инициирует SSH-рукопожатие.
- Обмен ключами: стороны согласовывают параметры шифрования и генерируют общий сеансовый ключ с помощью алгоритма Диффи — Хеллмана или его вариантов (например, Curve25519).
- Запрос аутентификации: клиент отправляет серверу запрос на аутентификацию, указывая имя пользователя и метод (publickey).
- Проверка сервером: сервер проверяет, есть ли в файле
~/.ssh/authorized_keysдля данного пользователя открытый ключ, соответствующий запрошенному. Если ключ найден, сервер отправляет клиенту случайную строку (челлендж), зашифрованную открытым ключом. - Ответ клиента: клиент расшифровывает челлендж своим закрытым ключом и отправляет серверу подтверждение (обычно это хеш от челленджа и сеансового идентификатора).
- Верификация: сервер проверяет правильность ответа. Если он корректен, аутентификация считается успешной, и пользователь получает доступ к оболочке или команде.
Генерация ключей
Для создания пары ключей используется утилита 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 →