Hook

Пароль можна вкрасти, вгадати, перехопити або повторно використати. SSH-ключ працює інакше: на сервері лежить лише публічна частина, а доступ отримує тільки той, хто має приватний ключ. Це простіше для щоденної роботи й значно безпечніше, ніж логінитися по паролю.

Для команди це означає менше блокувань, менше ручної рутини і менше шансів випадково відкрити сервер чужому акаунту. Для себе — один зрозумілий спосіб доступу до багатьох машин: VPS, продакшн, staging, домашні сервери, CI-агенти.

Проблема

Парольний доступ має кілька слабких місць:

SSH-ключі вирішують це краще. Кожен ключ можна створити окремо, дати йому свій fingerprint, зберегти в менеджері доступів, відкликати без зміни чужих обліковок і швидко видалити в разі втрати ноутбука.

Чому важливо

Якщо ти працюєш із серверами, SSH-ключі — це не «просунутий варіант», а базовий стандарт. Вони дають:

Для DevOps і адміністрування це особливо важливо: один ключ на людину, окремі ключі на пристрої, окремі ключі на автоматизацію. Коли щось іде не так, ти не «міняєш пароль на всіх», а точково відкликаєш один доступ.

Як зробити

Згенерувати пару ключів ed25519

Сьогодні для більшості сценаріїв найкращий вибір — ed25519. Він короткий, швидкий і без зайвої мороки.

Команда:

ssh-keygen -t ed25519 -C "yura@laptop"

Краще одразу вказати шлях до окремого файлу, якщо ключів буде кілька:

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_work -C "work-laptop"

Під час створення система запропонує passphrase. Її варто задати. Це не пароля на сервер, а захист приватного ключа на твоєму диску.

Після створення в ~/.ssh/ буде два файли:

ls -l ~/.ssh/id_ed25519_work*

Переглянути публічний ключ:

cat ~/.ssh/id_ed25519_work.pub

Переглянути fingerprint:

ssh-keygen -l -f ~/.ssh/id_ed25519_work.pub

Це корисно, коли треба звірити, що ключ не підмінено.

Додати публічний ключ на сервер

Найпростіший спосіб — ssh-copy-id:

ssh-copy-id -i ~/.ssh/id_ed25519_work.pub user@server.example.com

Після цього сервер додасть ключ до:

~/.ssh/authorized_keys

Якщо ssh-copy-id недоступний, зроби вручну:

cat ~/.ssh/id_ed25519_work.pub | ssh user@server.example.com 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'

Перевір права доступу на сервері:

ssh user@server.example.com
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Власник теж має бути правильний:

chown -R user:user ~/.ssh

Якщо права надто відкриті, SSH часто просто відмовляється приймати ключ.

Підключитися і перевірити

Підключення з явним ключем:

ssh -i ~/.ssh/id_ed25519_work user@server.example.com

Якщо все працює, можна перевірити, який ключ використався, з детальним логом:

ssh -vvv -i ~/.ssh/id_ed25519_work user@server.example.com

У виводі шукай рядки про:

Якщо на сервері хочеш перевірити, чи вхід уже йде по ключу, можна тимчасово вимкнути парольну автентифікацію в конфігурації sshd:

sudo nano /etc/ssh/sshd_config

Додай або зміни:

PasswordAuthentication no
PubkeyAuthentication yes

Потім перезапусти службу:

sudo systemctl restart ssh

Перед цим переконайся, що новий ключ уже працює, і тримай відкриту іншу сесію, щоб не відрізати собі доступ.

SSH-agent для зручності

Без SSH-agent доведеться щоразу вводити passphrase. З агентом ключ завантажується в пам’ять, і підключення стають зручнішими.

Запустити агент:

eval "$(ssh-agent -s)"

Додати ключ:

ssh-add ~/.ssh/id_ed25519_work

Перевірити список ключів у агенті:

ssh-add -l

Видалити один ключ:

ssh-add -d ~/.ssh/id_ed25519_work

Очистити всі ключі:

ssh-add -D

Щоб не вказувати ключ щоразу, можна додати конфігурацію в ~/.ssh/config:

Host prod-server
  HostName server.example.com
  User user
  IdentityFile ~/.ssh/id_ed25519_work
  AddKeysToAgent yes
  IdentitiesOnly yes

Після цього:

ssh prod-server

Це зручно, коли серверів багато, а ключів кілька.

Типові помилки і як їх уникнути

Неправильні права в ~/.ssh

Якщо каталог або файл доступні «занадто широко», SSH відмовиться працювати.

Перевір:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_work
chmod 644 ~/.ssh/id_ed25519_work.pub
chmod 600 ~/.ssh/authorized_keys

Неправильний тип ключа

Старі приклади часто показують rsa. Він досі зустрічається, але для нових налаштувань краще використовувати ed25519.

Якщо на сервері або клієнті є сумісні обмеження, не міксуй усе підряд. Спочатку перевір, що сервіс підтримує сучасні алгоритми.

Не той ключ

Коли ключів багато, SSH може спробувати не той. Тоді допомагає:

ssh -i ~/.ssh/id_ed25519_work -o IdentitiesOnly=yes user@server.example.com

Або ж прописаний ~/.ssh/config.

Неправильний користувач

Ключ доданий не тому акаунту. Наприклад, root і deploy мають різні authorized_keys. Підключення буде відхилене, хоча сам ключ правильний.

Забутий passphrase

Якщо ключ захищений passphrase, а ти її не пам’ятаєш, відкривати старий приватний ключ уже не вийде. Доведеться створити нову пару ключів і розгорнути її заново.

Неправильний формат переносу ключа

Не вставляй ключ у файл з пробілами, переносами рядків або зайвими символами. Один зайвий символ — і доступ не працює. Якщо копіюєш вручну, звір fingerprint.

Анти-патерни

Один ключ на все життя

Це погана ідея. Ключ має бути прив’язаний до конкретної людини, пристрою або автоматизації. Якщо ноутбук втрачено, не треба ламати доступ усій команді.

Без passphrase

Приватний ключ без passphrase на незахищеному диску — це ризик. Якщо ноутбук скомпрометують, доступ до сервера отримає той, хто першим відкриє файл.

Один і той самий ключ для людей і ботів

Людський доступ і автоматизація мають жити окремо. Для CI, деплоя або інтеграцій краще робити окремі ключі з мінімальними правами.

Копіювання приватного ключа на сервер

Приватний ключ не має лежати на сервері, до якого ти підключаєшся. На сервері має бути тільки публічний ключ у authorized_keys.

Залишити парольний доступ «на всяк випадок»

Якщо команда вже перейшла на ключі, парольний вхід краще вимкнути. Інакше ти просто залишаєш запасний вхід, який обов’язково колись забудеш закрити.

Не документувати, який ключ за що відповідає

Через пів року ніхто не згадає, чий це id_ed25519_2. Називай ключі зрозуміло:

id_ed25519_home
id_ed25519_work
id_ed25519_ci

Це економить час під час ротації.

Безпека: passphrase, revocation, key rotation

Passphrase потрібна не для краси. Вона захищає приватний ключ, якщо файл потрапить не в ті руки. Для робочих машин це особливо важливо.

У разі втрати пристрою або підозри на компрометацію треба зробити дві речі:

  1. Відкликати ключ на сервері.
  2. Створити новий і замінити старий.

Відкликання зазвичай означає видалення відповідного рядка з authorized_keys:

sed -i.bak '/AAAAC3NzaC1lZDI1NTE5AAAAI.../d' ~/.ssh/authorized_keys

Або вручну видалити старий публічний ключ і зберегти файл.

Якщо доступів багато, веди облік ключів. Хоч би в простому списку:

Ротація ключів потрібна не лише після інцидентів. Добра практика — періодично оновлювати ключі, особливо якщо:

Fingerprint допомагає перевіряти, що ти працюєш саме з тим ключем, який очікував. Це особливо корисно при передаванні публічних ключів між командами або при підключенні до нових серверів.

Висновок

SSH-ключі — це простий спосіб зробити доступ до серверів безпечнішим і зручнішим. Потрібно лише запам’ятати базову схему: згенерував ed25519, залишив приватний ключ у себе, додав публічний на сервер, перевірив права, увімкнув SSH-agent і прибрав парольний вхід там, де це вже не потрібно.

Якщо зробити все акуратно, ти отримаєш доступ, який легко підтримувати, легко відкликати і легко масштабувати на багато машин. А це саме те, що потрібно в нормальній адмінці, а не магія з паролями, які потім ніхто не може знайти.