Базовая защита Linux-сервера: чеклист после установки
Практический чеклист первых шагов защиты нового Linux-сервера: обновления, фаервол, fail2ban, sudo-юзер и бэкапы.
Свежий сервер у хостера - это дом с открытыми дверями. Пока вы настраиваете проект, боты уже стучатся в SSH и сканируют порты. Хорошая новость: базовую защиту можно поставить за полчаса, и она отсекает подавляющее большинство автоматических атак. Ниже - практический чеклист по шагам, от обновлений до бэкапов. Команды даны для Debian и Ubuntu; на других дистрибутивах отличается в основном менеджер пакетов.
Шаг 1. Обновите систему сразу
Первое, что делает злоумышленник - ищет известные уязвимости в устаревших пакетах. Поэтому начните с полного обновления:
sudo apt update && sudo apt upgrade -yЧтобы критические патчи безопасности ставились сами, включите автоматические обновления. Это не заменяет ручной контроль, но закрывает окно между выходом патча и вашим следующим визитом на сервер:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgradesРегулярные обновления - самая недооценённая мера безопасности. Большинство взломов используют не хитрые эксплойты, а давно закрытые дыры на непропатченных серверах.
Шаг 2. Заведите отдельного пользователя с sudo
Работать под root постоянно опасно: любая ошибка или скомпрометированный процесс сразу получают полную власть над системой. Создайте обычного пользователя и дайте ему права sudo:
sudo adduser deploy
sudo usermod -aG sudo deployДалее настройте для этого пользователя вход по SSH-ключу, проверьте, что заходите, и отключите прямой вход root по паролю в /etc/ssh/sshd_config:
PermitRootLogin prohibit-password
PasswordAuthentication noПосле правки перезапустите сервис командой sudo systemctl restart ssh. Держите вторую SSH-сессию открытой на время правок, чтобы не отрезать себя от сервера.
Шаг 3. Поднимите фаервол
По умолчанию сервер может слушать больше портов, чем вам нужно. Задача фаервола - пропускать только то, что действительно используется. Самый простой инструмент в Ubuntu - ufw:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enableЕсли у вас веб-сервер, добавьте нужные порты явно:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status verboseТем, кто хочет работать напрямую с современным движком ядра, доступен nftables. Минимальный набор правил: разрешить уже установленные соединения, loopback и SSH, остальное входящее - запретить:
sudo nft add table inet filter
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif lo accept
sudo nft add rule inet filter input tcp dport 22 acceptГлавное правило любого фаервола: перед тем как включить политику deny, убедитесь, что порт SSH точно разрешён, иначе вы потеряете доступ.
Шаг 4. Минимизируйте открытые порты
Чем меньше сервисов торчит наружу, тем меньше поверхность атаки. Посмотрите, что слушает сеть:
sudo ss -tulpnОбратите внимание на строки с адресом 0.0.0.0 или [::] - это сервисы, открытые всему интернету. Часто наружу зря смотрят базы данных. Если СУБД нужна только локальному приложению, привяжите её к 127.0.0.1 в конфиге и уберите порт из фаервола. Правило простое: наружу - только то, к чему реально обращаются извне.
Шаг 5. Поставьте fail2ban против перебора
Даже с ключами боты будут долбиться в SSH тысячами попыток. fail2ban читает логи и временно банит IP, которые слишком часто ошибаются:
sudo apt install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localВ файле /etc/fail2ban/jail.local в секции [sshd] задайте разумные лимиты:
[sshd]
enabled = true
maxretry = 4
bantime = 1h
findtime = 10mПерезапустите и проверьте статус:
sudo systemctl restart fail2ban
sudo fail2ban-client status sshdВ выводе вы увидите список забаненных адресов - наглядное доказательство, что защита работает.
Шаг 6. Настройте бэкапы
Безопасность - это не только про защиту от взлома, но и про возможность восстановиться. Диск может умереть, а неудачная команда - снести данные. Бэкап должен лежать не на том же сервере. Для файлов удобен rsync на отдельную машину или в хранилище:
rsync -avz --delete /var/www/ backup@backup-host:/backups/www/Для баз данных делайте регулярный дамп по расписанию через cron. Например, ежедневный дамп PostgreSQL:
0 3 * * * pg_dump mydb | gzip > /backups/db-$(date +\%F).sql.gzИ помните: бэкап, который никто ни разу не восстанавливал, считается несуществующим. Хотя бы раз проверьте, что из копии реально поднимаются данные.
Короткий чеклист
- Обновления - upgrade сразу плюс unattended-upgrades.
- Пользователь - отдельный sudo-юзер, root по паролю выключен.
- SSH - вход по ключу, пароль отключён.
- Фаервол - deny incoming, открыто только нужное.
- fail2ban - защита от перебора включена.
- Порты - проверены через ss, лишнее закрыто.
- Бэкапы - вне сервера, проверены на восстановление.
Пройдя эти семь пунктов, вы поднимаете защиту нового сервера с уровня "открытая дверь" до состояния, при котором массовые автоматические атаки просто не проходят. Дальше уже идут более тонкие вещи - аудит, мониторинг и разграничение доступа, но именно база даёт наибольший эффект при минимуме усилий.