Урок 03

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 для удобства
  • Отключение входа по паролю
  • Правильные права на файлы

Дальше — базовые команды терминала.