SSH-ключи: создание, настройка и управление аккаунтами

Инструменты разработки

SSH-ключи: более безопасный метод аутентификации, чем пароли

Сравнение Пароль SSH-ключ
Метод аутентификации Фактор знания (то, что вы знаете) Фактор владения (то, что у вас есть)
Перебор Возможен Практически невозможен
Риск фишинга Высокий Низкий (приватный ключ не покидает локальный компьютер)
Утечка на сервере Пароли в открытом виде/хеши уязвимы Хранится только публичный ключ, приватный не выводим
Удобство Вводить каждый раз Настройка один раз, автоматическая аутентификация

1. Создание пары ключей

Ed25519 (рекомендуется)

ssh-keygen -t ed25519 -C "your@email.com"
Параметр Описание
-t ed25519 Тип алгоритма (Ed25519, самый безопасный и быстрый)
-C Комментарий (обычно email для идентификации)

RSA (альтернатива для совместимости)

ssh-keygen -t rsa -b 4096 -C "your@email.com"
Алгоритм Длина ключа Безопасность Производительность Рекомендация
Ed25519 256 бит Максимальная Самый быстрый ✅
ECDSA P256 256 бит Высокая Быстрый Опционально
RSA 4096 4096 бит Высокая Медленный Альтернатива для совместимости
RSA 2048 2048 бит Средняя Медленный ❌ Не рекомендуется

Процесс создания

$ ssh-keygen -t ed25519 -C "dev@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase): ****
Enter same passphrase again: ****
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub

Настоятельно рекомендуется установить passphrase: даже если приватный ключ утечёт, passphrase предотвратит его прямое использование.


2. Развёртывание публичного ключа

GitHub / GitLab

# Скопировать публичный ключ
cat ~/.ssh/id_ed25519.pub | clip

# GitHub → Settings → SSH and GPG keys → New SSH key
# Вставить содержимое публичного ключа

Сервер

# Способ 1: ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server.com

# Способ 2: Добавить вручную
cat ~/.ssh/id_ed25519.pub | ssh user@server.com 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'

Проверка подключения

ssh -T git@github.com
# Hi username! You've successfully authenticated...

ssh user@server.com
# Прямой вход без пароля

3. Настройка нескольких аккаунтов

Сценарий: рабочий GitHub + личный GitHub

# Создать две пары ключей
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_work
ssh-keygen -t ed25519 -C "personal@gmail.com" -f ~/.ssh/id_personal

SSH Config

# ~/.ssh/config
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_work
  IdentitiesOnly yes

Host github-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_personal
  IdentitiesOnly yes

Использование с Git

# Рабочий репозиторий
git clone git@github-work:company/project.git

# Личный репозиторий
git clone git@github-personal:username/project.git

Мультиплатформенная настройка

# ~/.ssh/config
Host github.com
  User git
  IdentityFile ~/.ssh/id_github

Host gitlab.com
  User git
  IdentityFile ~/.ssh/id_gitlab

Host gitee.com
  User git
  IdentityFile ~/.ssh/id_gitee

Host dev.azure.com
  User git
  IdentityFile ~/.ssh/id_azure

4. Управление SSH Agent

Запуск Agent

eval "$(ssh-agent -s)"

Добавление ключа

ssh-add ~/.ssh/id_ed25519
# Enter passphrase: ****

# Просмотр добавленных ключей
ssh-add -l
# 256 SHA256:xxx... dev@example.com (ED25519)

Автозапуск (bashrc)

# ~/.bashrc или ~/.zshrc
if [ -z "$SSH_AUTH_SOCK" ]; then
  eval "$(ssh-agent -s)"
  ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi

Персистентность с keychain

# macOS: использовать Keychain для хранения passphrase
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

# Linux: использовать keychain
eval "$(keychain --eval id_ed25519)"

5. Настройка jump-сервера

Сценарий: Локальный → Jump-сервер → Продакшен-сервер

# ~/.ssh/config
Host jumpbox
  HostName jump.example.com
  User jump-user
  IdentityFile ~/.ssh/id_jump

Host production
  HostName 10.0.1.100
  User deploy
  IdentityFile ~/.ssh/id_prod
  ProxyJump jumpbox
# Прямое подключение к продакшен-серверу (автоматически через jump-сервер)
ssh production

Перенаправление Agent

Host jumpbox
  HostName jump.example.com
  ForwardAgent yes

Предупреждение безопасности: Включайте перенаправление Agent только если доверяете jump-серверу.


6. Усиление безопасности

sshd_config на сервере

# /etc/ssh/sshd_config
PermitRootLogin no                    # Запретить вход root
PasswordAuthentication no             # Запретить вход по паролю
PubkeyAuthentication yes             # Разрешить только вход по ключу
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3                       # Максимум попыток
LoginGraceTime 30                    # Таймаут входа 30 секунд
AllowUsers deploy admin              # Белый список пользователей

Права доступа к ключам

# Приватный ключ должен быть 600
chmod 600 ~/.ssh/id_ed25519

# Директория .ssh должна быть 700
chmod 700 ~/.ssh

# authorized_keys должна быть 600
chmod 600 ~/.ssh/authorized_keys

Ротация ключей

# 1. Создать новый ключ
ssh-keygen -t ed25519 -C "dev@example.com" -f ~/.ssh/id_ed25519_new

# 2. Развернуть новый публичный ключ на всех серверах/Git-платформах
ssh-copy-id -i ~/.ssh/id_ed25519_new.pub user@server

# 3. Проверить, что новый ключ работает
ssh -i ~/.ssh/id_ed25519_new user@server

# 4. Удалить старый публичный ключ
# Отредактировать ~/.ssh/authorized_keys на сервере, удалить строку старого ключа

# 5. Удалить старый ключ
rm ~/.ssh/id_ed25519_old

7. Решение распространённых проблем

Проблема Причина Решение
Permission denied Публичный ключ не развёрнут ssh-copy-id
Too many authentication failures Слишком много ключей в Agent IdentitiesOnly yes
Are you sure you want to continue connecting Первое подключение StrictHostKeyChecking=accept-new
Медленное соединение Обратный DNS-запрос UseDNS no (на сервере)
Ключ не работает Неверные права доступа chmod 600 для приватного ключа

Режим отладки

ssh -vvv user@server.com
# Подробный вывод процесса подключения, определение причины ошибки аутентификации
#SSH#密钥#Git#免密登录#安全