~/blog/blogposted

$ cat ./ssh-dlya-novichkov.md

Первый вопрос любого, кто впервые попадает в девопс: «вы что, правда заходите на серверы паролем?». Нет. SSH-ключи — это пропуск, который невозможно подобрать перебором, а пароль — это записка, которую можно украсть.

Что такое SSH

SSH — протокол безопасного удалённого доступа. Всё шифруется: и передача данных, и сама аутентификация. Подключение выглядит так:

ssh root@222.167.208.127

Спросит пароль… и будет спрашивать каждый раз. Есть способ лучше — ключи.

Создаём пару ключей

Ключ — это два файла: закрытый (секрет, никому) и открытый (кладём на сервер).

ssh-keygen -t ed25519 -C "bazil@laptop"
  • -t ed25519 — современный быстрый алгоритм. RSA -t rsa -b 4096 — если сервер старый.
  • -C — комментарий-подпись, обычно user@host.
  • Парольную фразу для ключа лучше задать — тогда даже украденный ключ бесполезен.

Появятся ~/.ssh/id_ed25519 (закрытый) и ~/.ssh/id_ed25519.pub (открытый).

Кладём ключ на сервер

ssh-copy-id root@222.167.208.127

Команда добавляет ваш .pub в ~/.ssh/authorized_keys на сервере. Потом вход без пароля:

ssh root@222.167.208.127   # работает без пароля

Права на файлы — это важно

SSH параноик: если секретный файл может прочитать кто-то ещё — ключ «выбрасывается». Проверьте права:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys   # на сервере

Иначе получите знаменитое:

Permissions 0777 for '~/.ssh/id_ed25519' are too open.

Конфиг, чтобы не печатать длинные адреса

Файл ~/.ssh/config:

Host vps
	HostName 222.167.208.127
	User root
	Port 22
	IdentityFile ~/.ssh/id_ed25519

Host github
	HostName github.com
	User git

Теперь:

ssh vps                 # вместо полного адреса
git push github main

Что нельзя делать

  • не пересылайте id_ed25519 никому и никуда;
  • не пишите серверный пароль в скриптах — используйте ключи;
  • не отключайте проверку host-ключей (StrictHostKeyChecking no) «просто так»;
  • если сменили сервер и видите «REMOTE HOST IDENTIFICATION HAS CHANGED» — проверьте, что это действительно ваш сервер, а потом уже чистите known_hosts.

Если пароль вводят в CI

Секреты кладите в переменные репозитория (GitHub Secrets и т.п.), а в bash-скрипте не выводите их в лог:

rsync -avz --delete dist/ root@vps:/var/www/bazil.pw/

Ключевой навык: SSH не «магия», а три вещи — кто я (ключ), куда (host), через какую дверь (порт). Разберитесь с этими тремя — остальное приложится.