$ 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), через какую дверь (порт). Разберитесь с этими тремя — остальное приложится.