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

  1. Скопіюйте публічний ключ:
cat ~/.ssh/id_ed25519.pub
  1. GitHub → Settings → SSH and GPG keys → New SSH key

  2. Вставте ключ і збережіть

  3. Перевірте:

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*

Див. також

Шлях: getting-started/ssh-keys.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications