🔒 Категория: DevOps Essentials 💡 Цель: Настроить безопасный SSH-доступ к GitHub на любой ОС

🧠 Чему вы научитесь:

  • Установка Git/SSH на Win/Linux/macOS
  • Генерация SSH-ключей (Ed25519/RSA) + понимание различий
  • Привязка ключа к GitHub
  • Проверка и отладка подключения
  • Работа с несколькими аккаунтами [NEW]
  • Backup и безопасность ключей [NEW]

⚠️ Критично перед стартом:

  • Закройте все терминалы (нужен чистый сеанс)
  • Проверьте отсутствие конфликтующих ключей:
     bash ls -al ~/.ssh  
  • Создайте резервную копию существующих ключей при наличии

🗂️ 1. Установка Git и SSH

🪟 Windows

# Скачать Git for Windows: https://git-scm.com/download/win
# В установщике:
#   [x] Git Bash | [x] OpenSSH | [x] "Use external OpenSSH"
# Проверка:
git --version
ssh -V

# Где хранятся ключи: C:\Users\%USERNAME%\.ssh\

🐧 Linux (Ubuntu/Debian)

sudo apt update && sudo apt install git openssh-client xclip -y
git --version
ssh -V

🍎 macOS

xcode-select --install  # Установит Git + SSH
git --version
ssh -V

🔑 2. Генерация SSH-ключа

💡 Ed25519 vs RSA:

  • Ed25519: Современный, быстрый, короткие ключи (рекомендуется)
  • RSA: Совместим со старыми системами, длиннее

⚠️ Рекомендация: Всегда используйте passphrase!

# Современный алгоритм (предпочтительно):
ssh-keygen -t ed25519 -a 100 -C "your_email@example.com"

# Для legacy-систем или корпоративных требований:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# При генерации:
# 1. Путь: ~/.ssh/id_ed25519 (по умолчанию, нажмите Enter)
# 2. Passphrase: ОБЯЗАТЕЛЬНО установите сложный пароль!
# 3. Повторите passphrase

Настройка прав доступа (Linux/macOS):

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_*
chmod 644 ~/.ssh/id_*.pub

🔄 3. Настройка GitHub

Скопируйте публичный ключ:

# Windows (Git Bash):
cat ~/.ssh/id_ed25519.pub | clip

# Linux:
cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard
# или если xclip не установлен:
cat ~/.ssh/id_ed25519.pub

# macOS:
cat ~/.ssh/id_ed25519.pub | pbcopy

В GitHub:

  1. Перейдите: Settings → SSH and GPG Keys → New SSH Key
  2. Title: Описательное имя (например, “MacBook Pro 2024”)
  3. Key type: Authentication Key
  4. Вставьте ключ и сохраните

⚙️ 4. Запуск ssh-agent (критично!)

Для всех ОС:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519  # Введите passphrase при запросе

# Проверка загруженных ключей:
ssh-add -l

Автозагрузка при старте:

Linux/macOS (добавить в ~/.bashrc или ~/.zshrc):

# SSH Agent auto-start
if [ -z "$(pgrep ssh-agent)" ]; then
  eval "$(ssh-agent -s)" > /dev/null
  ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi

Windows Git Bash (добавить в ~/.bashrc):

cat <<EOF >> ~/.bashrc
# SSH Agent auto-start for Windows
env=~/.ssh/agent.env

agent_load_env () { test -f "\$env" && . "\$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "\$env")
    . "\$env" >| /dev/null ;
}

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2=agent not running
agent_run_state=\$(ssh-add -l >| /dev/null 2>&1; echo \$?)

if [ ! "\$SSH_AUTH_SOCK" ] || [ \$agent_run_state = 2 ]; then
    agent_start
    ssh-add ~/.ssh/id_ed25519
elif [ "\$SSH_AUTH_SOCK" ] && [ \$agent_run_state = 1 ]; then
    ssh-add ~/.ssh/id_ed25519
fi

unset env
EOF

✅ 5. Настройка Git (базовая конфигурация)

# Установите имя пользователя и email (обязательно!):
git config --global user.name "Ваше Имя"
git config --global user.email "your_email@example.com"

# Проверка настроек:
git config --global --list

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

ssh -T git@github.com

# ✅ Ожидаемый успешный ответ:
# "Hi username! You've successfully authenticated, but GitHub does not provide shell access."

# ❌ При ошибках используйте verbose режим:
ssh -vT git@github.com

🚨 Типичные ошибки и решения

1. Permission denied (publickey)

# Диагностика:
ssh -vT git@github.com

# Возможные причины:
# - Ключ не добавлен в GitHub
# - Ключ не загружен в ssh-agent
# - Неверные права доступа к файлам

2. Ключ не добавлен в ssh-agent

# Проверка загруженных ключей:
ssh-add -L

# Если пусто, добавьте ключ:
ssh-add ~/.ssh/id_ed25519

3. Неверные права доступа (Linux/macOS)

# Исправление прав:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

4. Конфликт URL репозитория

# 🔴 Неправильно (HTTPS):
git clone https://github.com/user/repo.git

# 🟢 Правильно (SSH):
git clone git@github.com:user/repo.git

# Изменение существующего репозитория:
git remote set-url origin git@github.com:user/repo.git

5. ssh-agent не запущен

# Проверка:
ps aux | grep ssh-agent

# Если не запущен:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

6. Passphrase запрашивается каждый раз

# Для Linux/macOS - установите keychain:
# Ubuntu/Debian:
sudo apt install keychain

# macOS уже имеет встроенную поддержку
# Для постоянного хранения на macOS:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

🧪 Расширенный чеклист самопроверки

  • ssh-keygen выполнен без ошибок
  • Установлена надёжная passphrase
  • Права доступа к файлам настроены корректно
  • Публичный ключ добавлен в GitHub (Settings → SSH Keys)
  • ssh-agent запущен: ps aux | grep ssh-agent
  • Ключ добавлен в агент: ssh-add -l
  • Git настроен: git config --global user.name и user.email
  • Репозиторий использует SSH-URL: git remote -v
  • Тест подключения успешен: ssh -T git@github.com
  • Можете клонировать приватный репозиторий без ввода пароля

🚀 Для продвинутых: Несколько аккаунтов

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

# Личный ключ (уже создан):
# ~/.ssh/id_ed25519

# Рабочий ключ:
ssh-keygen -t ed25519 -f ~/.ssh/id_github_work -C "work@company.com"

2. Настройте ~/.ssh/config

# Личный аккаунт
Host github.com-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes
  AddKeysToAgent yes

# Рабочий аккаунт
Host github.com-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_github_work
  IdentitiesOnly yes
  AddKeysToAgent yes

# Для MacOS добавьте:
# UseKeychain yes

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

# Клонирование с указанием хоста:
git clone git@github.com-work:company/project.git
git clone git@github.com-personal:username/personal-project.git

# Настройка существующего репозитория:
git remote set-url origin git@github.com-work:company/project.git

4. Настройка Git для разных проектов

# В рабочих проектах:
git config user.name "Work Name"
git config user.email "work@company.com"

# В личных проектах:
git config user.name "Personal Name"
git config user.email "personal@email.com"

🔐 Безопасность и backup ключей

Рекомендации по безопасности

# 1. Регулярно проверяйте активные ключи в GitHub:
# Settings → SSH and GPG keys → Review and remove unused keys

# 2. Используйте разные ключи для разных целей
# 3. Устанавливайте срок действия для ключей (для RSA):
ssh-keygen -t rsa -b 4096 -V +52w -C "expires-in-1-year@email.com"

Backup ключей

# Создание backup (зашифрованного):
tar -czf ssh-keys-backup-$(date +%Y%m%d).tar.gz ~/.ssh/
gpg -c ssh-keys-backup-$(date +%Y%m%d).tar.gz

# Или используйте системы управления паролями (1Password, Bitwarden)
# для хранения приватных ключей

Восстановление

# Распаковка backup:
gpg -d ssh-keys-backup-20241201.tar.gz.gpg | tar -xzf -

# Восстановление прав:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_*
chmod 644 ~/.ssh/id_*.pub

🔧 Дополнительные инструменты

SSH Config для удобства

# ~/.ssh/config
Host *
  AddKeysToAgent yes
  UseKeychain yes  # только для macOS
  ServerAliveInterval 60
  ServerAliveCountMax 30

Алиасы для удобства

# Добавить в ~/.bashrc или ~/.zshrc:
alias ssh-test="ssh -T git@github.com"
alias ssh-keys="ssh-add -l"
alias git-ssh="git remote set-url origin \$(git remote get-url origin | sed 's|https://github.com/|git@github.com:|')"

🔗 Дополнительные ресурсы


🧠 Итоги дня

🔑 Ключевые принципы:

  • SSH безопаснее и удобнее HTTPS для постоянной работы
  • Passphrase обязательна для защиты приватных ключей
  • ssh-agent избавляет от постоянного ввода passphrase
  • ~/.ssh/config упрощает работу с множественными аккаунтами
  • Регулярное обслуживание ключей повышает безопасность

Проверка готовности:

# Всё работает, если эта команда выполняется без запроса пароля:
git clone git@github.com:octocat/Hello-World.git
cd Hello-World
echo "# Test" >> README.md
git add README.md
git commit -m "Test commit via SSH"
git push

💬 Ваш челлендж: Настройте SSH для двух разных GitHub аккаунтов и переключайтесь между ними без ввода паролей!


🆘 Быстрая помощь

Если что-то пошло не так:

  1. ssh -vT git@github.com — подробная диагностика
  2. ssh-add -l — проверка загруженных ключей
  3. git remote -v — проверка URL репозитория
  4. Перезапустите терминал и повторите настройку ssh-agent

Критичные команды для запоминания:

ssh -T git@github.com              # Тест подключения
ssh-add ~/.ssh/id_ed25519          # Добавить ключ в агент
git remote set-url origin git@github.com:user/repo.git  # Переключить на SSH

📱 Telegram: @DevITWay

🌐 Сайт: devopsway.ru