SSH ключі¶
SSH (Secure Shell) — протокол для безпечного віддаленого доступу до серверів. Замість паролів рекомендується використовувати ключі — це і безпечніше, і зручніше.
Пароль vs Ключі¶
┌─────────────────────────────────────────────────────────────────┐
│ ПАРОЛЬ │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Клієнт Сервер │
│ │ │ │
│ │ "password123" │ │
│ │ ────────────────────────> │ │
│ │ │ Перевіряє пароль │
│ │ OK / DENIED │ │
│ │ <──────────────────────── │ │
│ │
│ ✗ Можна підібрати (brute force) │
│ ✗ Можна перехопити │
│ ✗ Треба вводити кожен раз │
│ ✗ Один пароль на всі сервери = ризик │
│ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ КЛЮЧІ │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Клієнт Сервер │
│ [Private Key] [Public Key] │
│ │ │ │
│ │ │ Відправляє challenge │
│ │ Challenge │ (випадкові дані) │
│ │ <──────────────────────── │ │
│ │ │ │
│ │ Підписує private key │ │
│ │ │ │
│ │ Signed Response │ │
│ │ ────────────────────────> │ │
│ │ │ Перевіряє public key │
│ │ OK │ │
│ │ <──────────────────────── │ │
│ │
│ ✓ Неможливо підібрати (2048+ біт) │
│ ✓ Private key ніколи не передається │
│ ✓ Автоматичний вхід │
│ ✓ Один ключ, багато серверів │
│ │
└─────────────────────────────────────────────────────────────────┘
Генерація ключа¶
ED25519 (рекомендовано)¶
ssh-keygen -t ed25519 -C "your_email@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
RSA (для старих систем)¶
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Параметри¶
| Параметр | Опис |
|---|---|
-t ed25519 |
Тип ключа (ed25519 найкращий) |
-b 4096 |
Розмір ключа (для RSA) |
-C "comment" |
Коментар (зазвичай email) |
-f ~/.ssh/mykey |
Ім'я файлу |
-N "" |
Без passphrase (небезпечно) |
Що таке passphrase?¶
Passphrase — пароль для захисту приватного ключа.
Без passphrase:
Хтось вкрав ваш ноутбук → має доступ до всіх серверів
З passphrase:
Хтось вкрав ноутбук → ключ зашифрований, доступу немає
Рекомендація: Завжди встановлюйте passphrase, використовуйте ssh-agent щоб не вводити його постійно.
Де зберігаються ключі¶
~/.ssh/
├── id_ed25519 # Приватний ключ (СЕКРЕТ!)
├── id_ed25519.pub # Публічний ключ
├── authorized_keys # Ключі для входу НА цей комп'ютер
├── known_hosts # Відомі сервери
└── config # SSH конфігурація
Права на файли (ВАЖЛИВО!)¶
# Перевірити права
ls -la ~/.ssh/
# Правильні права
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 # Private key
chmod 644 ~/.ssh/id_ed25519.pub # Public key
chmod 644 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/config
# Якщо права неправильні — SSH відмовить працювати!
Додавання ключа на сервер¶
Автоматично (ssh-copy-id)¶
ssh-copy-id user@server
# або з конкретним ключем
ssh-copy-id -i ~/.ssh/mykey.pub user@server
Вручну¶
# 1. Скопіюйте вміст публічного ключа
cat ~/.ssh/id_ed25519.pub
# 2. На сервері додайте в authorized_keys
# Спочатку підключіться по паролю
ssh user@server
# На сервері:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA... your_email@example.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Перевірка¶
# Тепер можна підключитись без пароля
ssh user@server
SSH config¶
Файл ~/.ssh/config дозволяє налаштувати "псевдоніми" для серверів:
# ~/.ssh/config
# Персональний сервер
Host myserver
HostName 198.51.100.42
User deploy
IdentityFile ~/.ssh/id_ed25519
# Production
Host prod
HostName prod.example.com
User deploy
Port 2222
IdentityFile ~/.ssh/prod_key
# Сервер через jump host
Host internal
HostName 10.0.0.5
User admin
ProxyJump jumphost
# Jump host
Host jumphost
HostName jump.example.com
User tunnel
Тепер замість:
ssh -i ~/.ssh/id_ed25519 deploy@198.51.100.42
Можна просто:
ssh myserver
Корисні параметри config¶
Host *
# Зберігати з'єднання активним
ServerAliveInterval 60
ServerAliveCountMax 3
# Використовувати agent forwarding
ForwardAgent yes
# Стискання
Compression yes
SSH Agent¶
SSH Agent тримає ключі в пам'яті і не питає passphrase кожен раз.
# Запустити agent (зазвичай вже запущений)
eval "$(ssh-agent -s)"
# Додати ключ в agent
ssh-add ~/.ssh/id_ed25519
# Введіть passphrase один раз
# Переглянути ключі в agent
ssh-add -l
# Видалити ключі з agent
ssh-add -D
Автозапуск на Linux¶
Додайте в ~/.bashrc або ~/.zshrc:
# Автозапуск SSH agent
if [ -z "$SSH_AUTH_SOCK" ]; then
eval "$(ssh-agent -s)" > /dev/null
ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi
На macOS¶
# Додати ключ з збереженням в Keychain
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
# В ~/.ssh/config додати:
Host *
UseKeychain yes
AddKeysToAgent yes
Agent Forwarding¶
Дозволяє використовувати локальні ключі на віддаленому сервері (наприклад, для git).
# В ~/.ssh/config
Host myserver
ForwardAgent yes
# Або при підключенні
ssh -A user@server
# Тепер на сервері можна клонувати приватні репозиторії
git clone git@github.com:yourorg/private-repo.git
Увага: Використовуйте тільки на довірених серверах!
Заборона паролів¶
Після налаштування ключів заборонити вхід по паролю:
# На сервері
sudo nano /etc/ssh/sshd_config
# Змінити:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
# Перезапустити SSH
sudo systemctl restart sshd
ВАЖЛИВО: Перед цим переконайтесь, що вхід по ключу працює!
GitHub/GitLab¶
Додати ключ на GitHub¶
- Скопіюйте публічний ключ:
cat ~/.ssh/id_ed25519.pub
-
GitHub → Settings → SSH and GPG keys → New SSH key
-
Вставте ключ і збережіть
-
Перевірте:
ssh -T git@github.com
# Hi username! You've successfully authenticated...
Декілька акаунтів¶
# ~/.ssh/config
# Робочий GitHub
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_work
# Персональний GitHub
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_personal
Використання:
git clone git@github-work:company/repo.git
git clone git@github-personal:me/repo.git
Troubleshooting¶
Permission denied (publickey)¶
# 1. Перевірте чи правильний ключ
ssh -v user@server
# Шукайте "Offering public key" та "Server accepts key"
# 2. Перевірте права на файли
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
# 3. Перевірте authorized_keys на сервері
cat ~/.ssh/authorized_keys
# Ключ має бути одним рядком!
# 4. Перевірте sshd конфіг на сервері
cat /etc/ssh/sshd_config | grep -E "PubkeyAuthentication|AuthorizedKeysFile"
Agent forwarding не працює¶
# Перевірте на локальній машині
ssh-add -l
# Має показати ключі
# Перевірте на сервері
echo $SSH_AUTH_SOCK
# Має бути не порожнім
Довге очікування при підключенні¶
# В ~/.ssh/config
Host *
# Вимкнути DNS lookup
UseDNS no
# Вимкнути GSSAPI
GSSAPIAuthentication no
Безпека¶
Що МОЖНА¶
- Публічний ключ (
.pub) — можна поширювати скрізь - Додавати ключ на GitHub, GitLab
- Показувати в документації
Що НЕ МОЖНА¶
- Приватний ключ — НІКОЛИ не передавати!
- Не комітити в git
- Не надсилати по email
- Не зберігати в хмарних сервісах без шифрування
Якщо ключ скомпрометований¶
# 1. Видаліть з усіх серверів
# authorized_keys — видаліть рядок з цим ключем
# 2. Згенеруйте новий ключ
ssh-keygen -t ed25519 -C "new_email@example.com"
# 3. Оновіть на GitHub/GitLab
# 4. Видаліть старий ключ
rm ~/.ssh/old_key*
Див. також¶
- Linux основи — базові команди
- VPS та хмари — налаштування сервера
- Git workflow — робота з Git
Шлях: getting-started/ssh-keys.md