SSH-ключи и безопасность
Почему ключи, а не пароль
Пароль можно:
- Подобрать брутфорсом (роботы пробуют тысячи паролей в день)
- Подсмотреть при вводе
- Перехватить, если трафик не шифрован
- Забыть
SSH-ключ — пара файлов:
- Приватный — только у тебя, никогда не передаётся
- Публичный — на сервере, можно показывать всем
Математика: подобрать приватный ключ к публичному невозможно за миллиарды лет.
Генерация ключа
На своём компьютере (не на сервере!):
ssh-keygen -t ed25519 -C "твой@email.com"
Что произойдёт:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/roman/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Нажимай Enter на все вопросы. Или введи парольную фразу для дополнительной защиты (тогда надо будет вводить при каждом использовании ключа).
Создадутся два файла:
~/.ssh/id_ed25519 # приватный (не показывать никому!)
~/.ssh/id_ed25519.pub # публичный (можно копировать)
Почему ed25519, а не RSA
Ed25519 — современный алгоритм:
- Ключи короче (68 символов vs 3000 у RSA)
- Быстрее проверяются
- Надёжнее RSA 2048
RSA ещё работает, но новый ключ делай на ed25519.
Копирование ключа на сервер
Способ 1 — автоматически:
ssh-copy-id root@192.0.2.1
Введёшь пароль последний раз, ключ скопируется.
Способ 2 — вручную:
cat ~/.ssh/id_ed25519.pub | ssh root@192.0.2.1 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Что произошло: публичный ключ добавлен в ~/.ssh/authorized_keys на сервере.
Проверка
ssh root@192.0.2.1
Теперь пароль не спрашивает. Если всё ок — готово.
Файл config
Чтобы не писать каждый раз ssh root@192.0.2.1 -i ~/.ssh/id_ed25519 -p 2222 — создай ~/.ssh/config:
Host skills-prod
HostName 192.0.2.1
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Теперь:
ssh skills-prod
ServerAliveInterval 60 — каждые 60 секунд отправляет ping, не даёт сессии обрываться.
Несколько серверов
Host skills-prod
HostName 192.0.2.1
User root
Host nobleweb
HostName 192.0.2.2
User roman
Port 2222
Host catalan
HostName 192.0.2.3
User deploy
Отключение входа по паролю
Когда ключ работает — обязательно отключи пароль. Боты перестанут брутфорсить.
1. Открой конфиг:
nano /etc/ssh/sshd_config
2. Найди и поменяй:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
Разбор:
PasswordAuthentication no— вход по паролю запрещёнPubkeyAuthentication yes— только ключиPermitRootLogin prohibit-password— root может заходить только по ключу (без пароля)
Или полностью запретить root:
PermitRootLogin no
Тогда сначала создай обычного пользователя.
3. Проверь конфиг:
sshd -t
4. Перезагрузи SSH:
systemctl restart ssh
⚠️ Не закрывай текущую сессию! Открой второй терминал и проверь, что можешь зайти. Если что-то сломал — можно исправить в текущей сессии.
Права на SSH-файлы
SSH очень требователен к правам. Если неправильно — откажет в входе.
Правильные права:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
Разбор:
.ssh/— 700 (только владелец)authorized_keys— 600 (только чтение владельцем)- Приватный ключ — 600
- Публичный ключ — 644 (можно читать всем)
Отпечатки ключей
Проверить отпечаток публичного ключа:
ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 256 SHA256:xxxxx твой@email.com (ED25519)
Зачем: сравнивать с known_hosts, если что-то подозрительное.
Несколько ключей
Для разных серверов — разные ключи. Лучшая практика.
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_work -C "work@example.com"
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_personal -C "personal@example.com"
В ~/.ssh/config:
Host work-server
HostName 192.0.2.1
IdentityFile ~/.ssh/id_ed25519_work
Host personal-server
HostName 192.0.2.2
IdentityFile ~/.ssh/id_ed25519_personal
SSH agent
ssh-agent хранит ключи в памяти. Не надо вводить пароль каждый раз.
eval $(ssh-agent -s) # запустить агент
ssh-add ~/.ssh/id_ed25519 # добавить ключ
ssh-add -l # список ключей
ssh-add -D # убрать все
Автозапуск: обычно агент запускается при входе в систему автоматически.
Что делать, если потерял доступ
1. Через панель хостера — многие дают VNC/Console.
2. Reset пароля root через панель.
3. Если есть другой пользователь с sudo — зайди через него, поправь authorized_keys.
4. Резервный ключ. Всегда держи второй SSH-ключ в authorized_keys. Если основной потеряешь — зайдёшь вторым.
Безопасность сервера
Дополнительно к ключам:
1. Смени порт SSH (опционально):
Port 2222
Боты сканируют в основном 22. Смена порта снижает шум в логах.
2. Отключи root:
PermitRootLogin no
3. Используй fail2ban (об этом в уроке про firewall).
4. Ограничь вход по IP (если есть статичный IP):
AllowUsers roman@192.0.2.5
Итог
Обязательно:
- SSH-ключ на ed25519
- Копирование через
ssh-copy-id - Файл
~/.ssh/configдля удобства - Отключение входа по паролю
- Правильные права на файлы
Дальше — базовые команды терминала.