Ссылка скопирована

Создание SSH-ключей и их настройка

DonVardixDonVardix—

Введение

Парольная аутентификация на удалённых серверах и в системах контроля версий подвержена перехвату, брутфорс-атакам и замедляет ежедневную работу. Аутентификация по 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).

В процессе утилита запросит:

  1. Путь сохранения: нажмите Enter, чтобы согласиться со стандартным расположением (~/.ssh/id_ed25519).
  2. Парольную фразу (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

Важно

Права 600 означают чтение и запись только для владельца файла. Если задать права 664 или 777, SSH аварийно прервет подключение с ошибкой 'Permissions are too open'.

2.2. Особенности для пользователей Windows

В Windows 10/11 встроенный OpenSSH использует каталог %USERPROFILE%\.ssh (C:\Users\<имя_пользователя>\.ssh). Если при подключении возникает ошибка прав доступа к приватному ключу:

  1. Откройте свойства файла приватного ключа в Проводнике;
  2. Перейдите во вкладку Безопасность → Дополнительно;
  3. Нажмите Отключение наследования → «Удалить все унаследованные разрешения»;
  4. Добавьте только свою текущую учётную запись с правами «Полный доступ».

Для организации нескольких рабочих и личных аккаунтов на 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 недоступна или доступ по паролю уже отключен:

  1. Выведите содержимое публичного ключа в терминале локального компьютера:
    cat ~/.ssh/id_ed25519.pub
  2. На удалённом сервере: добавьте скопированную строку в файл authorized_keys:
    mkdir -p ~/.ssh
    echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... deploy" >> ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  3. В сервисе 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

Советы и практики

Соблюдение этих правил обеспечит безопасность ключей и избавит от проблем с доступом.

Чек-лист подключения к новому серверу

  1. Сгенерируйте пару ключей: ssh-keygen -t ed25519 -f ~/.ssh/new_server -C "new_server".
  2. Скопируйте публичный ключ на удаленный сервер:
    ssh-copy-id -i ~/.ssh/new_server.pub deploy@<ip_сервера>
  3. Добавьте алиас в ~/.ssh/config:
    Host new-server
        HostName <ip_сервера>
        User deploy
        IdentityFile ~/.ssh/new_server
        IdentitiesOnly yes
  4. Проверьте вход: ssh new-server.
  5. После успешного входа отключите вход по паролю на сервере в /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_сервера>