Чек-лист защиты сервера: 25 шагов от взлома до полной безопасности

Security Евгений Семёнов ~14 мин чтения
Чек-лист защиты сервера от взлома

Новый сервер в интернете — мишень с первых минут. Буквально. Автоматические сканеры находят открытые порты за секунды, боты начинают перебирать пароли, а непропатченные уязвимости эксплуатируются ещё до того, как вы допьёте кофе. На Хабре один администратор поделился неожиданным решением: он кормит вредоносных ботов zip-бомбами — отдаёт 1-мегабайтный файл, который разворачивается в 10 ГБ и кладёт бота на лопатки. Пост собрал 368 комментариев — люди спорили жарко. Мы прочитали всё это, выгребли самое полезное и собрали чек-лист защиты сервера: от азов до таких вот нестандартных трюков.

Зачем нужен чек-лист и кому он поможет?

Чек-лист — не замена политике безопасности. Это рабочий инструмент «взял и сделал». Он нужен:

К каждому пункту — конкретные команды и ссылки. Никаких догадок: берёшь и делаешь.

Часть 1: Базовая защита (первые 30 минут)

1. Обновите систему до актуального состояния

Первое, что мы делаем на любом новом сервере, — обновляем всё подряд. Старые пакеты с известными CVE — любимая еда ботнетов, они сканируют именно их, целенаправленно.

# Debian/Ubuntu
sudo apt update && sudo apt upgrade -y

# CentOS/RHEL
sudo dnf update -y

# Windows Server (PowerShell)
Install-Module PSWindowsUpdate -Force
Get-WindowsUpdate -Install -AcceptAll -AutoReboot

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

# Debian/Ubuntu — unattended-upgrades
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades

# Проверка конфигурации
cat /etc/apt/apt.conf.d/20auto-upgrades
Совет: Включайте автообновления только для security-пакетов. Обновления приложений тестируйте отдельно, чтобы не сломать рабочий сервер.

3. Создайте непривилегированного пользователя

Работа под root — классика жанра и главная ошибка. Видели это сотни раз. Заведите отдельного пользователя с sudo и забудьте про root для повседневных задач:

adduser admin
usermod -aG sudo admin  # Debian/Ubuntu
usermod -aG wheel admin # CentOS/RHEL

4. Настройте SSH: ключи, порт, root

Подробно расписали в статье Настройка безопасности SSH на Linux. Здесь — минимум, который нужен прямо сейчас:

# /etc/ssh/sshd_config
Port 54322
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
AllowUsers admin

5. Включите файрвол

# UFW (Debian/Ubuntu)
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 54322/tcp  # SSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

# Проверка
sudo ufw status verbose

Про построение правил подробнее — в статье iptables: настройка фаервола в Linux.

Часть 2: Активная защита от атак

6. Установите Fail2Ban

Fail2Ban блокирует IP после нескольких неудачных попыток входа. В том самом обсуждении на Хабре участники были единодушны: это «минимум, который должен стоять на любом публичном сервере». Трудно не согласиться — настраивается за 10 минут, а головной боли снимает много.

sudo apt install fail2ban -y

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 54322
maxretry = 3
bantime = 3600
findtime = 600

[nginx-botsearch]
enabled = true
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400

7. Настройте rate limiting на веб-сервере

# nginx.conf — ограничение запросов
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn:10m;

server {
    location /api/ {
        limit_req zone=api burst=20 nodelay;
        limit_conn conn 10;
    }
}

8. Zip-бомбы для вредоносных ботов

Тот самый метод, из-за которого разгорелся весь сыр-бор. Суть проста: отдаёшь боту сжатый файл, который при распаковке съедает гигабайты памяти. Красиво — но комментаторы сразу указали на подводные камни:

Внимание: Как заметил пользователь KiraCoder, «легитимные краулеры поисковых систем тоже могут столкнуться с zip-бомбой». Обязательно ведите белый список Googlebot, Yandexbot и других легитимных ботов.
# Создание gzip-бомбы (10 ГБ в сжатом виде ~10 МБ)
dd if=/dev/zero bs=1G count=10 | gzip -c > /var/www/bomb/10GB.gz

# PHP-обработчик
if (is_malicious_bot($ua, $ip)) {
    header("Content-Encoding: gzip");
    header("Content-Length: " . filesize("/var/www/bomb/10GB.gz"));
    readfile("/var/www/bomb/10GB.gz");
    exit;
}

Пользователь ihouser предложил альтернативу попроще: капча вместо бомб. Пользователь MkIV007 посоветовал прописать ограничения в robots.txt и Terms of Service — хотя бы чтобы закрыть юридический вопрос.

9. Tarpit: замедление атакующих

Более мягкий подход, чем zip-бомбы — без риска зацепить лишних. Tarpit просто тормозит ответы подозрительным клиентам, тратя их ресурсы:

# nginx — замедление подозрительных IP
map $remote_addr $slow_response {
    default 0;
    ~^192\.168\.100\. 5;  # медленный ответ для диапазона
}

server {
    location / {
        if ($slow_response) {
            # Используем lua или модуль delay
            access_by_lua_block {
                ngx.sleep(tonumber(ngx.var.slow_response))
            }
        }
    }
}

10. GeoIP-фильтрация

Если ваш сервер работает только на Россию и СНГ, остальной мир можно просто закрыть. Зачем держать дверь открытой для тех, кто к вам всё равно не придёт:

# iptables + xtables-addons
sudo apt install xtables-addons-common libtext-csv-xs-perl -y

# Блокировка конкретных стран
sudo iptables -A INPUT -m geoip ! --src-cc RU,BY,KZ,UA -j DROP
Совет: GeoIP блокирует 80-90% автоматических атак, т.к. большинство ботнетов работают из Юго-Восточной Азии и Южной Америки. Но не полагайтесь только на GeoIP — VPN обходит эту защиту.

Часть 3: Мониторинг и аудит

11. Настройте логирование

Логи — это ваши глаза. Без них расследовать инцидент невозможно в принципе. Мы неоднократно сталкивались с ситуацией, когда взлом обнаруживали только потому, что логи были настроены правильно.

# rsyslog — централизованные логи
# /etc/rsyslog.conf
*.* @logserver.internal:514

# journald — сохранение логов на диск
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
SystemMaxUse=2G
MaxRetentionSec=90day

12. Мониторинг целостности файлов (AIDE/Tripwire)

# Установка AIDE
sudo apt install aide -y

# Инициализация базы
sudo aideinit
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# Проверка изменений (добавьте в cron)
sudo aide --check

13. Аудит открытых портов

# Что слушает сервер прямо сейчас?
sudo ss -tlnp

# Сканирование снаружи (с другого сервера)
nmap -sS -sV -p- server.example.com

# Автоматическая проверка раз в сутки
echo "0 6 * * * root ss -tlnp | mail -s 'Ports audit' admin@company.ru" >> /etc/crontab

14. Настройте уведомления

# Telegram-бот для алертов (простой скрипт)
#!/bin/bash
BOT_TOKEN="your_token"
CHAT_ID="your_chat_id"
MSG="$1"
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
  -d chat_id="${CHAT_ID}" -d text="${MSG}" > /dev/null

15. Регулярные бэкапы с проверкой

# Ежедневный бэкап с ротацией
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"

# Бэкап конфигурации
tar czf "$BACKUP_DIR/etc.tar.gz" /etc/
# Бэкап баз данных
pg_dumpall | gzip > "$BACKUP_DIR/postgres.sql.gz"

# Удаление старых бэкапов (> 30 дней)
find /backup -maxdepth 1 -mtime +30 -exec rm -rf {} \;

# ВАЖНО: проверка целостности
gunzip -t "$BACKUP_DIR/etc.tar.gz" && echo "Backup OK" || echo "Backup CORRUPTED!"

Часть 4: Защита веб-приложений

16. HTTP-заголовки безопасности

# nginx — добавляем заголовки
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' fonts.googleapis.com; font-src fonts.gstatic.com;" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;

17. SSL/TLS: правильная конфигурация

# Генерация сертификата Let's Encrypt
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d server.example.com

# nginx ssl_params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_stapling on;
ssl_stapling_verify on;

18. WAF (Web Application Firewall)

# ModSecurity с nginx
sudo apt install libmodsecurity3 libmodsecurity-dev -y

# Включение OWASP Core Rule Set
git clone https://github.com/coreruleset/coreruleset /etc/nginx/modsec/crs
cp /etc/nginx/modsec/crs/crs-setup.conf.example /etc/nginx/modsec/crs/crs-setup.conf

19. Защита от DDoS на уровне приложения

# nginx — ограничения по размеру и таймауту
client_max_body_size 10m;
client_body_timeout 12;
client_header_timeout 12;
send_timeout 10;
keepalive_timeout 15;

# Ограничение количества соединений с одного IP
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20;

Часть 5: Продвинутые техники

20. Port knocking

SSH-порт «не существует», пока не постучишь в нужные порты в правильной последовательности. Звучит как магия — работает как надёжный фильтр:

# Установка knockd
sudo apt install knockd -y

# /etc/knockd.conf
[openSSH]
    sequence = 7000,8000,9000
    seq_timeout = 5
    command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 54322 -j ACCEPT
    tcpflags = syn

[closeSSH]
    sequence = 9000,8000,7000
    seq_timeout = 5
    command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 54322 -j ACCEPT
    tcpflags = syn

21. Двухфакторная аутентификация SSH

# Google Authenticator для SSH
sudo apt install libpam-google-authenticator -y

# Настройка для пользователя
google-authenticator -t -d -f -r 3 -R 30 -w 3

# /etc/pam.d/sshd — добавить строку
auth required pam_google_authenticator.so

# /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

22. Контейнерная изоляция сервисов

Каждый сервис — в отдельном контейнере. Если один скомпрометируют, до остальных атакующий не доберётся:

# docker-compose.yml — пример изоляции
version: '3.8'
services:
  web:
    image: nginx:alpine
    read_only: true
    security_opt:
      - no-new-privileges:true
    tmpfs:
      - /tmp
    networks:
      - frontend
  app:
    image: myapp:latest
    read_only: true
    networks:
      - frontend
      - backend
  db:
    image: postgres:16-alpine
    networks:
      - backend
    volumes:
      - pgdata:/var/lib/postgresql/data

networks:
  frontend:
  backend:
    internal: true  # база недоступна снаружи

23. Аудит с помощью Lynis

# Установка
sudo apt install lynis -y

# Полный аудит системы
sudo lynis audit system

# Результат — оценка hardening index и список рекомендаций
# Пример вывода:
# Hardening index : 72 [##############      ]
# Tests performed : 256
# Warnings        : 3
# Suggestions     : 12

24. Honeypot: ловушка для атакующих

Один из участников дискуссии верно заметил: honeypot лучше держать на отдельном сервере, иначе рискуете подставить основную инфраструктуру. Из проверенных вариантов:

# Быстрый запуск Cowrie в Docker
docker run -d --name cowrie \
  -p 2222:2222 \
  -v cowrie-logs:/cowrie/var/log \
  cowrie/cowrie:latest

25. Документируйте всё

Последний пункт — и, пожалуй, самый недооценённый. Ведите журнал:

Комментарий сообщества: Пользователь Roman_Yankovskiy напомнил, что методы активной защиты (zip-бомбы) юридически неоднозначны. bogolt возразил, что клиент сам инициирует запрос. Newbilius провёл аналогию с «минами во дворе» — владелец несёт ответственность за ущерб. Вывод: документируйте правила в Terms of Service и robots.txt.

Сводная таблица: приоритеты защиты

Времени в обрез? Начните с самого критичного — вот очерёдность из нашей практики:

Часто задаваемые вопросы (FAQ)

Может ли zip-бомба навредить легитимным пользователям?

Да, риск есть — если фильтрация настроена криво. Вредоносные запросы нужно определять точно: по User-Agent, частоте обращений, репутации IP. Легитимные краулеры — Googlebot, Yandexbot — обязательно в белый список. Пользователь KiraCoder в обсуждении прямо написал: «краулеры поисковых систем тоже могут столкнуться с zip-бомбой». И он прав — такое мы тоже видели.

Какой минимальный набор мер нужен для нового сервера?

Минимальный набор такой: смена порта SSH, отключение root-логина, ключевая аутентификация, Fail2Ban, файрвол (iptables/ufw), автоматические обновления безопасности, мониторинг логов. По нашему чек-листу всё это реально закрыть за 30 минут — проверено.

Стоит ли использовать honeypot на продакшн-сервере?

Honeypot никогда не стоит держать рядом с боевыми данными — это базовое правило. Выносите его на отдельный сервер или в изолированный контейнер. Если отдельной машины нет, используйте tarpit: просто замедляйте ответы подозрительным клиентам. Это даёт эффект ловушки без риска скомпрометировать продакшн.

Как часто нужно проводить аудит безопасности сервера?

Раз в квартал — полный аудит конфигурации через Lynis или аналоги, без исключений. Еженедельно — логи и обновления, это минимум. После любого инцидента — внеплановый аудит сразу, не откладывая. Всё рутинное автоматизируйте через cron: проверки, которые делаются руками, рано или поздно не делаются вовсе.

Законно ли использовать zip-бомбы для защиты?

Юридически — серая зона, если честно. Сервер отдаёт gzip-сжатый контент, клиент сам решает, распаковывать его или нет. Формально вы ни на кого ничего не навязываете. Как советовал MkIV007, пропишите ограничения в robots.txt и Terms of Service — это снимет большую часть рисков, если вопрос всё же дойдёт до разбирательства.

IT-аутсорсинг

Защитим ваши серверы от взлома профессионально

Аудит безопасности, настройка файрволов, мониторинг, резервное копирование. Более 12 лет опыта защиты серверной инфраструктуры малого и среднего бизнеса.

12+лет на рынке
150+серверов обслужено
24/7мониторинг