====== Использование ssh-keygen для генерации ключей SSH: подробное руководство ======
Взято отсюда: https://www.securitylab.ru/analytics/562583.php
Подробное руководство по генерации и использованию SSH-ключей с помощью ssh-keygen. Объяснение принципов работы, инструкции для Linux, macOS и Windows.
Помните времена, когда для входа на сервер нужно было каждый раз вводить пароль? Как будто недостаточно головной боли с запоминанием паролей к соцсетям, почте и банковским приложениям. Хорошо, что умные люди придумали SSH-ключи — систему, где вместо ежедневного «угадай пароль» вы один раз настраиваете пару ключей и забываете про эту проблему.
SSH-ключи стали золотым стандартом для доступа к серверам, Git-репозиториям и облачной инфраструктуре. Принцип простой: есть два ключа — открытый и закрытый. Закрытый остается у вас и охраняется как зеница ока, а открытый можно спокойно раздавать направо и налево. Попытка подобрать ключ методом перебора займет у злоумышленника примерно столько же времени, сколько нужно на пересчет всех песчинок на планете.
В центре этой магии — утилита ssh-keygen, которая входит в комплект OpenSSH. Она генерирует ключи, меняет пароли, показывает отпечатки и вообще делает всю черновую работу. Ниже — практическое руководство без воды: от выбора алгоритма до интеграции с агентом и настройки аппаратных токенов безопасности.
====== Почему ключи надежнее паролей (и почему об этом вообще стоит думать) ======
Асимметричная криптография работает примерно как почтовый ящик с хитрым замком. У вас есть два ключа: один открывает ящик для складывания писем (это открытый ключ), а второй — для их извлечения (закрытый ключ). Любой может положить письмо в ящик, но достать его может только владелец второго ключа.
В случае с SSH закрытый ключ никогда не покидает ваш компьютер. Сервер хранит копию вашего открытого ключа в файле ~/.ssh/authorized_keys, и когда вы подключаетесь, происходит математическая «рукопожатие»: сервер проверяет, что у вас действительно есть закрытая половина ключа. Даже если кто-то перехватит весь трафик, без закрытого ключа он ничего не сможет сделать.
Преимущества такой схемы очевидны: никаких паролей в сети, никаких «admin123» и «qwerty», никаких попыток подобрать пароль перебором. Если закрытый ключ надежно защищен фразой-паролем и правильными правами доступа к файлам, это практически неприступная крепость.
* Открытый ключ: безобидная текстовая строка в файле *.pub, которую можно публиковать где угодно
* Закрытый ключ: ваша тайная половина, которую нужно беречь как код от банковской карты
* Фраза-пароль: дополнительная защита на случай, если кто-то все-таки доберется до файла
===== Выбираем алгоритм: почему ED25519 стал новым королем =====
В 2025 году OpenSSH официально поменял алгоритм по умолчанию с RSA на ED25519. И это не просто дань моде — ED25519 действительно лучше по всем параметрам: компактнее, быстрее, криптографически стойкий и поддерживается практически везде, где есть современный SSH.
RSA все еще работает и широко поддерживается, но требует ключей длиной минимум 3072 бита для приемлемой безопасности. ED25519 при той же стойкости умещается в гораздо меньший размер. ECDSA тоже неплох, но у него есть свои тонкости с источниками случайности, поэтому в новых установках обычно выбирают ED25519.
Отдельная категория — аппаратные ключи на FIDO2-токенах (YubiKey и подобные). Они хранят секретный материал внутри защищенного устройства и могут требовать физического касания для подтверждения входа. Это резко усложняет жизнь злоумышленникам, даже если они получили доступ к вашему компьютеру.
* Для новых проектов: ed25519 — современно, быстро, надежно
* Для совместимости со стариной: rsa с длиной от 3072 бит
* Для параноиков: ed25519-sk или ecdsa-sk с FIDO2-токеном
* Документация: [[https://man.openbsd.org/ssh-keygen | мануал ssh-keygen]], [[https://man.openbsd.org/ssh_config | настройки ssh_config]]
===== Где живут ключи и почему SSH такой привередливый к правам доступа =====
По умолчанию ключи лежат в папке ~/.ssh в домашнем каталоге. Там будут файлы типа id_ed25519 (закрытый ключ) и id_ed25519.pub (открытый). На одной машине может быть несколько ключей для разных задач — ничего страшного, главное не путать их назначение и вести учет.
SSH очень придирчив к правам доступа на файлы, и это правильно. Если ваш секретный ключ может читать кто угодно, значит, он уже не секретный. Поэтому при неправильных правах SSH откажется работать с хмурым сообщением «permissions are too open».
* Папка ~/.ssh: chmod 700 ~/.ssh (только владелец может читать и писать)
* Закрытые ключи: chmod 600 ~/.ssh/id_* (только владелец может читать)
* Открытые ключи: обычно 644 хватает (но можно и строже)
* На сервере: ~/.ssh/authorized_keys — 600, папка ~/.ssh — 700
===== Быстрый старт: создаем современный ключ за пять минут =====
Этот рецепт покроет 90% случаев. Генерируем ED25519-ключ с понятным комментарием и надежной защитой. Флаг -a добавляет «соль в рану» для тех, кто попытается подобрать фразу-пароль методом перебора.
ssh-keygen -t ed25519 -a 100 -C "Petr Ivanov work noutbook 2025" -f ~/.ssh/id_ed25519
Утилита спросит, где сохранить ключ и какую фразу-пароль установить. Если вы работаете на личном защищенном компьютере, можете оставить фразу пустой, но в корпоративной среде это моветон. Потерять ноутбук без защиты ключа — это почти как оставить в нем записку с паролями ко всем серверам.
* -t ed25519 — выбираем алгоритм (самый современный на сегодня)
* -a 100 — усложняем подбор фразы-пароля (100-200 — золотая середина)
* -C — комментарий для опознания ключа через пару лет
* -f — точно указываем путь к файлу
===== Для особых случаев: RSA, кастомные параметры и тихий режим =====
Иногда приходится работать с древними системами, где ED25519 еще не завезли, или корпоративная политика безопасности требует конкретных параметров. Тогда можно создать RSA-ключ с увеличенной длиной и современным форматом хранения:
ssh-keygen -t rsa -b 4096 -o -a 150 -C "RSA for old server" -f ~/.ssh/id_rsa_legacy -q
Флаг -o сохраняет ключ в современном формате OpenSSH (защищенном через bcrypt), а -q включает «тихий режим» — полезно в скриптах, где не нужна болтовня в консоль.
* -b 4096 — длина RSA-ключа (чем больше, тем безопаснее, но медленнее)
* -o — современный формат вместо старого PEM
* -q — меньше текста в выводе
===== Аппаратные ключи: когда паранойя оправдана =====
Если у вас есть FIDO2-токен (YubiKey, SoloKey или аналогичный), стоит попробовать аппаратные ключи SSH. Секретный материал живет внутри токена и никогда его не покидает, а для входа на сервер может потребоваться физическое касание устройства. Даже если злоумышленник полностью скомпрометирует ваш компьютер, без токена он не сможет подключиться к серверам.
ssh-keygen -t ed25519-sk -C "Hardware key for Production" -f ~/.ssh/id_ed25519_sk
Полезные опции для FIDO-ключей:
* -O resident — сохранить открытый ключ прямо на токене (удобно при смене компьютера)
* -O verify-required — требовать PIN или биометрию перед использованием
* -O application=ssh: — задать идентификатор приложения
* Подробности: [[https://man.openbsd.org/ssh-keygen | мануал ssh-keygen]], история FIDO2 в OpenSSH: [[https://www.openssh.com/txt/release-8.2 | заметки к релизу 8.2]]
===== Добавляем ключ на сервер: автоматически или руками =====
Самый простой способ — утилита ssh-copy-id. Она сама скопирует открытый ключ на сервер и поставит правильные права доступа:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server.example.com
Если ssh-copy-id недоступна (например, на некоторых версиях macOS или в минимальных дистрибутивах), можно сделать то же самое вручную:
cat ~/.ssh/id_ed25519.pub | ssh user@server.example.com \
'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh'
* Проверьте права на сервере: ~/.ssh должна быть 700, authorized_keys — 600
* Убедитесь, что в /etc/ssh/sshd_config включен PubkeyAuthentication yes
* Документация: [[https://manpages.debian.org/ssh-copy-id | ssh-copy-id manual]]
===== SSH-агент: один раз ввел пароль — день работаешь спокойно =====
Агент SSH — это такой добрый демон, который запоминает разблокированные ключи и подставляет их при необходимости. Один раз утром ввели фразу-пароль, и весь день подключаетесь к серверам без дополнительных вопросов. Это экономит кучу времени и снимает соблазн создавать ключи вообще без защиты.
На большинстве Linux-дистрибутивов и в macOS агент запускается автоматически. Если нет — можно стартануть вручную:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
В macOS есть фишка с интеграцией в «Связку ключей» — система сама достанет фразу-пароль при входе в аккаунт:
# один раз добавляем ключ в Связку
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
# прописываем в ~/.ssh/config
Host *
UseKeychain yes
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
В Windows тоже есть полноценный SSH-агент как системная служба. Подробности: [[https://learn.microsoft.com/windows-server/administration/openssh/openssh_overview | документация Microsoft]].
===== Файл ~/.ssh/config: как превратить SSH в удобный инструмент =====
Конфигурационный файл — это способ навсегда избавиться от длинных команд типа ssh -i ~/.ssh/special_key -p 2222 deploy@long-server-name.company.com. Вместо этого прописываете псевдонимы и подключаетесь простой командой ssh prod.
Пример конфигурации для трех окружений:
Host prod
HostName prod.example.com
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Host staging
HostName 203.0.113.25
User deploy
IdentityFile ~/.ssh/id_ed25519
ProxyJump bastion.example.com
Host vps
HostName vps.provider.net
User root
IdentityFile ~/.ssh/id_ed25519_sk
* IdentitiesOnly yes запрещает SSH перебирать все ключи подряд
* ProxyJump настраивает подключение через промежуточный сервер
* Все опции: [[https://man.openbsd.org/ssh_config | руководство по ssh_config]]
===== Комментарии и именование: порядок в файлах — порядок в голове =====
Комментарий в открытом ключе — это сообщение для будущего себя. Через год вы точно не вспомните, какой ключ для чего создавали, поэтому лучше сразу писать что-то вменяемое: «рабочий ноутбук 2025», «ключ для GitHub», «сервер базы данных» и так далее.
То же самое касается имен файлов — не бойтесь отходить от стандартных id_rsa и называть ключи по их назначению:
* Осмысленные комментарии: -C "Anna Petrova MacBook Pro 2025"
* Говорящие имена: ~/.ssh/id_ed25519_github, ~/.ssh/id_ed25519_work
* В конфигурации явно указывайте IdentityFile для каждого хоста
===== Смена паролей и восстановление потерянных файлов =====
Если нужно сменить фразу-пароль у существующего ключа, это делается одной командой:
ssh-keygen -p -f ~/.ssh/id_ed25519
Утилита попросит старую и новую фразы. Если потерялся файл *.pub, но закрытый ключ на месте, открытую часть можно восстановить:
ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pub
* Посмотреть «отпечаток» ключа: ssh-keygen -l -f ~/.ssh/id_ed25519.pub
* Выбрать алгоритм хеша: добавить -E sha256 или -E md5
===== Цифровая гигиена: простые правила, которые спасут карьеру =====
Главная опасность — потеря или кража закрытого ключа. Снизить риски помогают элементарные привычки: сильная фраза-пароль, резервные копии в зашифрованном виде и разделение ключей по ролям. Не используйте один ключ для GitHub, продакшн-серверов и личного VPS — это как иметь один пароль для всех аккаунтов.
Для автоматизации храните открытые ключи в системе управления конфигурацией (Ansible, Salt), а закрытые — только на рабочих станциях разработчиков или в защищенном хранилище секретов типа HashiCorp Vault.
* Фраза-пароль минимум из 5-6 слов или 15+ символов
* Разные ключи для разных задач (работа, личные проекты, продакшен)
* Зашифрованные бэкапы ключей отдельно от основного устройства
* FIDO2-токены там, где это критично
===== Отзыв доступа: как правильно «выгнать» бывшего сотрудника =====
Когда кто-то увольняется или ключ компрометирован, доступ нужно отозвать быстро и без паники. Для обычных ключей просто удаляете соответствующую строку из authorized_keys на всех серверах. Хороший тон — вести список с указанием владельца каждого ключа и даты создания.
В больших организациях используют SSH-сертификаты: они живут ограниченное время и отзываются централизованно. Сложнее в настройке, но проще в управлении.
* Обычные ключи: удалить строку, завершить активные сессии пользователя
* Сертификаты: центральный отзыв через CA
* Детали формата authorized_keys: [[https://man.openbsd.org/sshd | руководство sshd]]
===== SSH-сертификаты для продвинутых: когда ключей стало слишком много =====
Сертификат SSH — это обертка вокруг обычного ключа с подписью доверенного центра сертификации. Серверу достаточно доверять CA, а не каждому ключу по отдельности. Пользователю выдают короткоживущий сертификат с конкретными правами, что упрощает управление доступом.
Упрощенный пример:
# создаем ключ центра сертификации
ssh-keygen -f ~/.ssh/ssh_ca -C "Corporate CA"
# подписываем пользовательский ключ на 8 часов
ssh-keygen -s ~/.ssh/ssh_ca -I "developer-ivan" -n ivan,developer -V +8h ~/.ssh/id_ed25519.pub
Подробнее: [[https://man.openbsd.org/ssh-keygen | раздел о сертификатах в ssh-keygen]]
===== Отладка: что делать, когда ничего не работает =====
90% проблем с SSH решается двумя способами: проверить права доступа к файлам и включить подробный вывод. Если SSH ругается на ключ, сначала посмотрите, что именно он пытается сделать:
ssh -vvv user@server.example.com
Частые проблемы и их решения:
* «Permissions 0644 are too open» — выполните chmod 600 ~/.ssh/id_*
* «No matching host key type» — сервер слишком старый, попробуйте RSA
* «Agent admitted failure to sign» — перезапустите агент и добавьте ключ заново
* Ключ правильный, но вход не работает — смотрите логи на сервере: /var/log/auth.log или journalctl -u sshd
===== Git и облачные сервисы: не только серверы любят SSH =====
Большинство Git-хостингов поддерживают аутентификацию по ключам. Добавляете открытый ключ в веб-интерфейсе, и можете клонировать репозитории, пушить коммиты и не вводить пароль каждый раз. Для изоляции лучше создать отдельный ключ «под Git».
Многие сервисы уже понимают ED25519, а некоторые поддерживают даже аппаратные ключи FIDO2:
* GitHub: [[https://docs.github.com/en/authentication/connecting-to-github-with-ssh | подключение по SSH]]
* GitLab: [[https://docs.gitlab.com/ee/ssh/ | документация по SSH]]
* Bitbucket: [[https://support.atlassian.com/bitbucket-cloud/docs/set-up-an-ssh-key/ | настройка SSH-ключей]]
===== Автоматизация: когда роботы создают ключи =====
В CI/CD-пайплайнах и скриптах важно детерминированное поведение без интерактивных вопросов. Все параметры можно задать флагами:
ssh-keygen -t ed25519 -a 100 -N "" -C "ci runner $(date +%Y-%m-%d)" -f /tmp/id_ed25519_ci -q
Важно: пустая фраза-пароль (-N "") допустима только для временных ключей в изолированной среде!
* Закрытые ключи держите только в оперативной памяти
* Открытые ключи можно передавать через системы управления конфигурацией
Чек-листы для быстрой проверки
Настройка клиента:
* Создан ED25519-ключ с фразой-паролем
* Права: chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_*
* Настроен ~/.ssh/config с IdentitiesOnly yes
* Агент запущен, ключ добавлен
Настройка сервера:
* ~/.ssh имеет права 700, authorized_keys — 600
* В sshd_config включен PubkeyAuthentication yes
* Сервис sshd перезапущен после изменений
* Сделан бэкап authorized_keys
===== Особенности платформ: Windows, macOS, Linux =====
На Linux и macOS OpenSSH входит в базовую поставку. В Windows 10/11 OpenSSH тоже есть из коробки, но служба агента может быть отключена. В WSL удобно держать ключи внутри подсистемы Linux, чтобы не путаться с правами доступа.
Современные IDE и Git-клиенты умеют работать с системным SSH-агентом, поэтому не нужно дублировать ключи в настройках приложений.
* Windows OpenSSH: [[https://learn.microsoft.com/windows-server/administration/openssh/openssh_overview | официальная документация]]
* Проверьте настройки IDE — они часто используют системный SSH
===== Вопросы, которые все задают =====
* Можно ли использовать один ключ везде? Технически да, но лучше разделять по задачам. Потеря одного ключа не должна открывать доступ ко всему на свете.
* Обязательна ли фраза-пароль? Очень желательна. Без неё украденный файл ключа равен полной компрометации. С агентом вводить пароль нужно только один раз за сессию.
* Как понять, какой ключ сработал? Включите детальный вывод: ssh -v user@host. SSH покажет, какие ключи пробует и какой принял сервер.
* Что делать с потерянным ключом? Считать его скомпрометированным, удалить из всех authorized_keys, создать новый и добавить заново.
Полезные ссылки для закладок
* [[https://man.openbsd.org/ssh-keygen | Мануал ssh-keygen]] — самый полный справочник
* [[https://man.openbsd.org/ssh_config | Настройки ssh_config]] — все опции клиента
* [[https://man.openbsd.org/sshd | Документация sshd]] — серверная часть
* [[https://man.openbsd.org/sshd | GitHub SSH]] — подключение к репозиториям
* [[https://manpages.debian.org/ssh-copy-id | ssh-copy-id]] — копирование ключей на сервер
===== Выводы: SSH-ключи как спасение от парольного ада =====
Утилита ssh-keygen решает весь цикл работы с ключами от создания до отзыва. ED25519 с разумными настройками защиты подходит для большинства задач, аппаратные FIDO2-ключи — для особо критичных доступов. Остальное — вопрос организации: понятные комментарии, структурированное хранение файлов, единообразная конфигурация.
Один раз правильно настроив SSH-ключи, вы забудете о ежедневном вводе паролей к серверам и получите более высокую безопасность без постоянной головной боли. А если что-то пойдет не так, детальный вывод ssh -vvv и проверка прав доступа решают 99% проблем.
И помните: лучше потратить час на правильную настройку SSH, чем потом полдня разбираться, почему «оно не работает», особенно когда вся команда ждет деплоя в продакшен.
{{tag>ssh ssh-keygen ssh-add ssh-copy-id}}