Каждый день тысячи серверов по всему миру взламываются не потому что у злоумышленников сложные инструменты, а потому что администраторы не сделали базовую настройку. Стандартный Ubuntu или CentOS после установки — это открытая дверь: root-доступ по SSH, дефолтный порт 22, никакого файрволла.

Этот чеклист — не теория. Каждый пункт можно сделать руками за вечер.

Сначала — обновления

Первое, что нужно сделать на свежем сервере, ещё до любых настроек:

apt update && apt upgrade -y

Звучит банально, но уязвимости в ядре и системных пакетах — это реальная история. Heartbleed, Shellshock, Dirty COW — все эти громкие CVE эксплуатировались именно на серверах, которые просто давно не обновлялись.

Настройте автоматические обновления безопасности:

apt install unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades

Проверьте /etc/apt/apt.conf.d/50unattended-upgrades — там можно настроить автоперезагрузку и уведомления на почту.

SSH — главная точка входа

По умолчанию SSH слушает порт 22. Боты сканируют весь интернет и ломятся именно туда. Посмотрите логи на любом свежем сервере:

grep 'Failed password' /var/log/auth.log | wc -l

Через несколько часов после запуска там будут сотни попыток.

Смена порта

Откройте /etc/ssh/sshd_config и измените:

Port 2222

Порт не должен быть занят. Проверьте: ss -tlnp | grep 2222. После смены не забудьте открыть новый порт в файрволле и только потом перезапускать SSH — иначе рискуете потерять доступ.

Отключение root-входа

PermitRootLogin no

Создайте отдельного пользователя с sudo-правами:

adduser deploy
usermod -aG sudo deploy

Теперь для выполнения привилегированных команд нужно сначала зайти под обычным пользователем, а потом использовать sudo. Это добавляет дополнительный барьер.

Только ключи, никаких паролей

Парольная аутентификация — слабое место. Ключи несравнимо надёжнее. Сгенерируйте пару на своей машине:

ssh-keygen -t ed25519 -C "deploy@myserver"

Публичный ключ скопируйте на сервер:

ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@your-server

После того как убедились, что вход по ключу работает, отключите парольную аутентификацию:

PasswordAuthentication no
PubkeyAuthentication yes

Дополнительные параметры sshd_config

X11Forwarding no
AllowTcpForwarding no
MaxAuthTries 3
LoginGraceTime 20
ClientAliveInterval 300
ClientAliveCountMax 2

Последние два параметра отключат зависшие сессии через 10 минут бездействия.

Файрволл

UFW (Uncomplicated Firewall) — самый простой способ настроить правила на Ubuntu:

apt install ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp   # ваш SSH-порт
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Проверьте статус: ufw status verbose.

Если используете iptables напрямую — базовые правила выглядят так:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -P INPUT DROP

Сохраните правила: iptables-save > /etc/iptables/rules.v4.

Fail2ban — защита от брутфорса

Даже с ключами и нестандартным портом боты продолжат стучаться. Fail2ban банит IP-адреса после нескольких неудачных попыток:

apt install fail2ban

Создайте /etc/fail2ban/jail.local:

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3

[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log

Перезапустите: systemctl restart fail2ban.

Посмотреть заблокированные IP: fail2ban-client status sshd.

Fail2ban работает не только с SSH — его можно настроить под Nginx, Apache, Postfix и другие сервисы.

Минимизация поверхности атаки

Правило простое: чем меньше сервисов запущено, тем меньше потенциальных уязвимостей.

Посмотрите, что сейчас слушает сеть:

ss -tlnp

Если видите незнакомые порты — разберитесь, что там висит, и отключите лишнее.

Проверьте автозапуск сервисов:

systemctl list-unit-files --state=enabled

Отключите то, что не нужно:

systemctl disable bluetooth
systemctl disable cups

Конкретный список зависит от задачи сервера. На VPS под веб-приложение точно не нужны Bluetooth, принтеры и avahi-daemon.

Права доступа к файлам

Несколько быстрых проверок:

# Файлы с SUID-битом (выполняются с правами владельца)
find / -perm -4000 -type f 2>/dev/null

# Файлы с широкими правами записи
find /etc -perm -002 -type f 2>/dev/null

# Файлы без владельца
find / -nouser -o -nogroup 2>/dev/null

SUID-файлы — частая цель для privilege escalation. Их должно быть немного: passwd, sudo, ping. Всё остальное — повод разобраться.

Критичные файлы конфигурации должны быть доступны только root:

chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 640 /etc/sudoers

Sudo — аккуратно с правами

Посмотрите текущие sudo-права:

cat /etc/sudoers
ls /etc/sudoers.d/

Никогда не давайте NOPASSWD: ALL без крайней необходимости. Если нужно, чтобы скрипт мог перезапускать конкретный сервис без пароля — пропишите только его:

deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx

Проверяйте, кто состоит в группе sudo:

getent group sudo

Шифрование и сертификаты

HTTPS сегодня — не опция, а обязательное требование. Let's Encrypt решает этот вопрос бесплатно:

apt install certbot python3-certbot-nginx
certbot --nginx -d yourdomain.com

Проверьте настройки TLS в Nginx или Apache. Отключите старые протоколы:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;
ssl_prefer_server_ciphers off;

Проверить конфигурацию можно через SSL Labs (ssllabs.com/ssltest/) — он покажет оценку и конкретные проблемы.

Автообновление сертификата:

crontab -e
# Добавьте:
0 3 * * * certbot renew --quiet

Логи и мониторинг

Логи бесполезны, если их никто не читает. Настройте централизованный сбор хотя бы на уровне одного сервера.

Полезные файлы:

  • /var/log/auth.log — авторизации, sudo, SSH
  • /var/log/syslog — системные события
  • /var/log/nginx/access.log и error.log — веб-трафик

Для мониторинга подозрительной активности — logwatch:

apt install logwatch
logwatch --detail High --mailto admin@yourdomain.com --range today

Аuditd позволяет отслеживать конкретные файлы и системные вызовы:

apt install auditd
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/sudoers -p wa -k sudoers_changes

Смотреть события: ausearch -k passwd_changes.

Проверка целостности системы

AIDE (Advanced Intrusion Detection Environment) создаёт базу хэшей файлов и сигнализирует об изменениях:

apt install aide
aide --init
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

Проверка:

aide --check

Добавьте в cron ежедневную проверку с отправкой отчёта. Если кто-то подменил бинарник или изменил конфиг — вы узнаете об этом утром.

Ограничение ресурсов

Лимиты на уровне системы защищают от fork bomb и других атак типа resource exhaustion. Отредактируйте /etc/security/limits.conf:

* soft nproc 1024
* hard nproc 2048
* soft nofile 65536
* hard nofile 65536

Для systemd-сервисов задавайте лимиты в unit-файле:

[Service]
LimitNOFILE=65536
LimitNPROC=512
MemoryMax=512M
CPUQuota=50%

Разделение сетевых зон

Если на сервере крутится база данных — она не должна быть доступна извне. Только с localhost или из приватной сети:

# В /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1

То же самое для Redis, Memcached и других хранилищ данных. Открытый Redis без пароля на публичном IP — это классика, которая стоила многим компаниям утечки данных.

Чеклист одним списком

Для удобства — всё вышесказанное в виде списка:

  • Обновить систему и включить автообновления безопасности
  • Сменить порт SSH
  • Отключить root-вход по SSH
  • Настроить аутентификацию по ключу, отключить пароли
  • Настроить файрволл (UFW или iptables), закрыть всё лишнее
  • Установить fail2ban
  • Отключить неиспользуемые сервисы
  • Проверить файлы с SUID-битом
  • Настроить права на критичные конфигурационные файлы
  • Проверить sudo-права, убрать NOPASSWD там где не нужно
  • Включить HTTPS, настроить TLS 1.2+
  • Настроить сбор и мониторинг логов
  • Развернуть AIDE для контроля целостности
  • Закрыть базы данных от публичного доступа
  • Настроить лимиты ресурсов

Это не разовая задача

Hardening — не то, что делается один раз и забывается. Новые уязвимости появляются постоянно. Подписывайтесь на рассылки безопасности: Ubuntu Security Notices, CERT/CC, CVE Details.

Раз в квартал прогоняйте сервер через lynis — это бесплатный аудитор безопасности:

apt install lynis
lynis audit system

Он выдаст оценку и конкретный список рекомендаций с приоритетами.

Если у вас несколько серверов или нет времени разбираться в деталях — можно доверить настройку и поддержку специалистам. Команда REEXY (r3xy.ru) занимается в том числе поддержкой и администрированием: поддержка сайта от 10 000 ₽/мес включает мониторинг, обновления и базовое обеспечение безопасности.

Но даже если вы всё делаете сами — этот чеклист закроет 90% типичных векторов атак на небольшой VPS. Остальные 10% — это уже история про пентесты, WAF и более серьёзную инфраструктуру.