Коротко: базовая защита сервера — вход по SSH-ключу, отдельный sudo-пользователь, закрытый файрволом периметр и fail2ban; полчаса против автоматического взлома.
Базовая защита свежего Linux-сервера сводится к четырём шагам: вход по SSH-ключу вместо пароля, отдельный пользователь с sudo вместо root, закрытый файрволом периметр (только нужные порты) и fail2ban против перебора. Это полчаса работы, которые отсекают почти весь автоматический фоновый взлом. Разберём по порядку.
Почему это нужно сразу
Новый сервер с белым IP начинают перебирать боты в течение минут — это не «если», а «когда». Пароль root по SSH — приглашение. Хорошая новость: базовая гигиена закрывает подавляющее большинство автоматических атак, и она одинакова почти для любого дистрибутива.
Шаг 1. SSH по ключу, без паролей и без root
Сначала создаём отдельного пользователя с sudo и заливаем ему свой публичный ключ, а затем выключаем парольный вход и вход под root.
# на сервере: создать пользователя с sudo
adduser deploy
usermod -aG sudo deploy # на Debian/Ubuntu (на RHEL — wheel)
# с локальной машины: скопировать публичный ключ
ssh-copy-id deploy@server-ip
Проверив, что вход по ключу под deploy работает, правим /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
# по желанию — сменить порт с 22 (снижает шум, но не заменяет остального)
# Port 2222
sudo systemctl restart ssh # не закрывайте текущую сессию, пока не проверите новую!
Важно: не разрывайте текущее подключение, пока в соседнем окне не убедитесь, что новый вход работает, — иначе рискуете запереть себя снаружи.
Шаг 2. Файрвол — закрыть всё лишнее
Принцип: по умолчанию запрещаем входящее, открываем только нужное (SSH + 80/443). На Ubuntu проще всего через ufw:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp # или ваш SSH-порт
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
На RHEL/AlmaLinux аналогично через firewalld (firewall-cmd --add-service=https --permanent). Главное правило — БД, Redis и прочие сервисы наружу торчать не должны: либо слушают 127.0.0.1, либо закрыты файрволом.
Шаг 3. fail2ban против перебора
fail2ban читает логи и временно банит IP, который слишком часто ошибается (например, в SSH-входе). Даже при входе по ключу он гасит шум переборщиков.
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
В jail.local включаем jail для SSH:
[sshd]
enabled = true
port = 22
maxretry = 5
bantime = 1h
findtime = 10m
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd # посмотреть забаненные IP
Шаг 4. Обновления безопасности
Самая частая брешь — непропатченный софт. Минимум — регулярно ставить обновления; лучше — включить автоматические security-обновления.
# Debian/Ubuntu
sudo apt update && sudo apt upgrade -y
sudo apt install unattended-upgrades # авто-обновления безопасности
Чего НЕ делать
- Не оставлять вход по паролю «на всякий случай» — это и есть та дыра, через которую заходят.
- Не полагаться на смену порта SSH как на защиту — это снижает шум в логах, но не останавливает целевую атаку.
- Не выставлять БД и админки наружу. Доступ к ним — только через SSH-туннель или VPN.
Итог
SSH по ключу без root, закрытый файрвол, fail2ban и автообновления — это база, которую стоит накатывать на каждый новый сервер в первые полчаса. Она не делает сервер «неуязвимым», но отсекает поток автоматических атак, на который приходится большинство взломов.
Если нужно безопасно поднять и настроить боевой сервер под проект — помогу на консультации.

Комментарии