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#免密登录#安全