Введение
Парольная аутентификация на удалённых серверах и в системах контроля версий подвержена перехвату, брутфорс-атакам и замедляет ежедневную работу. Аутентификация по SSH-ключам решает эти проблемы за счёт асимметричной криптографии (открытый и закрытый ключ), обеспечивая мгновенный и защищённый вход без передачи пароля по сети.
Что будет сделано:
- Сгенерированы стойкие ключи современного алгоритма Ed25519 с усиленной защитой KDF;
- Выставлены строгие права доступа (POSIX permissions) на служебные файлы
.ssh; - Публичный ключ передан на сервер и привязан к профилю GitHub;
- Настроен файл
~/.ssh/configдля подключения по коротким алиасам без запоминания IP-адресов и портов.
Результат: быстрый, удобный и безопасный доступ к серверам командой ssh my-vps без ввода паролей и ошибок авторизации.
1. Генерация SSH-ключей
Криптографический алгоритм Ed25519 на сегодня является отраслевым стандартом: он компактнее, математически устойчивее и обеспечивает более быстрое рукопожатие по сравнению с устаревшим RSA.
1.1. Базовая пара Ed25519
Выполните команду генерации на вашем локальном компьютере:
ssh-keygen -t ed25519 -a 200 -C "deploy"
Разбор параметров:
-t ed25519— тип алгоритма (эллиптическая кривая Curve25519);-a 200— 200 раундов хеширования KDF (Key Derivation Function) для существенного замедления перебора парольной фразы при краже файла;-C "deploy"— текстовый комментарий (метка назначения ключа или ваш email).
В процессе утилита запросит:
- Путь сохранения: нажмите
Enter, чтобы согласиться со стандартным расположением (~/.ssh/id_ed25519). - Парольную фразу (passphrase): нажмите дважды
Enter, если требуется беспарольный вход (для автоматизации и деплоя), либо введите надёжный пароль для дополнительной защиты ключа.
1.2. Создание ключа с произвольным именем
Если вы готовите ключ под конкретную инфраструктуру или сервис (например, GitHub Deploy Key или резервный VPS), укажите путь через флаг -f:
ssh-keygen -t ed25519 -a 200 -f ~/.ssh/github_deploy -C "github_deploy"
В результате создаются два файла:
~/.ssh/github_deploy— приватный (закрытый) ключ. Секретный файл, который никогда и никому не передаётся.~/.ssh/github_deploy.pub— публичный (открытый) ключ. Безопасная часть, которая копируется на серверы и сторонние платформы.
2. Настройка прав доступа к ключам
SSH-клиент и серверный демон предъявляют строгие требования к безопасности: если закрытый ключ или каталог .ssh доступны на чтение другим пользователям системы, подключение будет заблокировано.
2.1. Права доступа в Linux и macOS
На локальной машине (и на сервере) установите минимально необходимые POSIX-права:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/config
Важно
2.2. Особенности для пользователей Windows
В Windows 10/11 встроенный OpenSSH использует каталог %USERPROFILE%\.ssh (C:\Users\<имя_пользователя>\.ssh). Если при подключении возникает ошибка прав доступа к приватному ключу:
- Откройте свойства файла приватного ключа в Проводнике;
- Перейдите во вкладку Безопасность → Дополнительно;
- Нажмите Отключение наследования → «Удалить все унаследованные разрешения»;
- Добавьте только свою текущую учётную запись с правами «Полный доступ».
Для организации нескольких рабочих и личных аккаунтов на Windows обратитесь к руководству Настройка нескольких GitHub-аккаунтов в Windows.
3. Передача публичного ключа на сервер и GitHub
Чтобы сервер или Git-платформа принимали подключения по ключу, на них необходимо загрузить ваш публичный ключ (.pub).
3.1. Копирование на VPS через ssh-copy-id
Самый быстрый способ перенести ключ на Linux-сервер — штатная утилита ssh-copy-id:
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@<ip_сервера>
Утилита запросит пароль пользователя deploy, автоматически создаст директорию /home/deploy/.ssh, добавит ключ в authorized_keys и выставит корректные права доступа (700 и 600).
3.2. Ручное добавление ключа
Если утилита ssh-copy-id недоступна или доступ по паролю уже отключен:
- Выведите содержимое публичного ключа в терминале локального компьютера:
cat ~/.ssh/id_ed25519.pub - На удалённом сервере: добавьте скопированную строку в файл
authorized_keys:mkdir -p ~/.ssh echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... deploy" >> ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys - В сервисе GitHub: откройте Settings → SSH and GPG keys → New SSH key, укажите понятный заголовок и вставьте содержимое публичного ключа.
Проверьте авторизацию в GitHub командой:
ssh -T git@github.com
Ответ с текстом Hi <username>! You've successfully authenticated... подтверждает успешную настройку.
4. Конфигурация SSH-клиента (~/.ssh/config)
Файл ~/.ssh/config избавляет от необходимости помнить IP-адреса, нестандартные порты и длинные пути к файлам ключей.
Создайте или откройте конфигурационный файл на своём компьютере:
nano ~/.ssh/config
4.1. Подключение к серверам по алиасам
Добавьте параметры для ваших VPS-серверов:
Host my-vps
HostName <ip_сервера>
User deploy
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Host custom-vps
HostName <ip_сервера>
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Параметр IdentitiesOnly yes запрещает SSH предлагать серверу все найденные в системе ключи подряд, предотвращая ошибку Too many authentication failures.
Теперь подключение выполняется в одно слово:
ssh my-vps
4.2. Разделение нескольких аккаунтов GitHub
Если вы используете личный и корпоративный профили, разделите их через виртуальные хосты в ~/.ssh/config:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
При клонировании репозитория с рабочего профиля укажите заданный алиас:
git clone git@github-work:company/repo.git
Советы и практики
Соблюдение этих правил обеспечит безопасность ключей и избавит от проблем с доступом.
Чек-лист подключения к новому серверу
- Сгенерируйте пару ключей:
ssh-keygen -t ed25519 -f ~/.ssh/new_server -C "new_server". - Скопируйте публичный ключ на удаленный сервер:
ssh-copy-id -i ~/.ssh/new_server.pub deploy@<ip_сервера> - Добавьте алиас в
~/.ssh/config:Host new-server HostName <ip_сервера> User deploy IdentityFile ~/.ssh/new_server IdentitiesOnly yes - Проверьте вход:
ssh new-server. - После успешного входа отключите вход по паролю на сервере в
/etc/ssh/sshd_config.d/99-security.conf(подробнее в руководстве Настройка VPS под мультипроектный Docker-стек с Caddy).
Диагностика проблем подключения
Если соединение не устанавливается или запрашивается пароль вместо ключа, запустите SSH в режиме подробной отладки:
ssh -v my-vps
-v(или-vvvдля максимальной детализации) покажет, какой именно файл ключа предлагает клиент и на каком этапе сервер отклоняет аутентификацию.- Если сервер сменил ключ и выдаёт ошибку
Host key verification failed, удалите старый отпечаток хоста:ssh-keygen -R <ip_сервера>
Шпаргалка команд
- Просмотр отпечатка (fingerprint) ключа:
ssh-keygen -lf ~/.ssh/id_ed25519.pub - Проверка отпечатка в формате SHA256:
ssh-keygen -l -E sha256 -f ~/.ssh/id_ed25519.pub - Тест подключения к GitHub:
ssh -T git@github.com - Смена парольной фразы существующего ключа:
ssh-keygen -p -f ~/.ssh/id_ed25519 - Удаление устаревшего хоста из known_hosts:
ssh-keygen -R <ip_сервера>
