OffshoreVps
Безопасность27 сент. 20266 мин чтенияАвтор: команда OffshoreVps

Защита веб-сервера: UFW, fail2ban и настройки Nginx

Брандмауэр с запретом по умолчанию, jail-правила fail2ban, более безопасные заголовки Nginx, ограничение частоты запросов и автоматические обновления для VPS с сайтом.

Новый веб-сервер сканируют через считанные минуты после выхода в сеть. Большая часть этого трафика автоматическая и безвредна, если вы сделали основы. Это руководство делает шаг дальше защиты за 15 минут и охватывает брандмауэр, защиту от перебора с помощью fail2ban и более безопасную настройку Nginx.

Окно терминала на VPS с командами для защиты веб-сервера с помощью UFW, fail2ban и Nginx, начиная с «sudo ufw default deny incoming»
Примерно такие команды вы будете выполнять на своём сервере в этом руководстве.

Шаг 1: брандмауэр UFW с запретом по умолчанию

Разрешите только необходимое, а остальное заблокируйте. Сначала добавьте SSH, чтобы не заблокировать себя.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

Если вы используете нестандартный порт SSH, разрешите этот порт вместо OpenSSH.

Шаг 2: fail2ban для повторяющихся сбоев

fail2ban следит за журналами и банит IP-адреса, которые постоянно не могут войти.

sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null <<'CONF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true
CONF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

Используйте SSH-ключи и также отключите вход по паролю. См. SSH-ключи.

Шаг 3: скройте версию Nginx и добавьте безопасные заголовки

В /etc/nginx/nginx.conf, внутри блока http:

server_tokens off;

В блоке server вашего сайта:

add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Добавляйте заголовок HSTS только после того, как HTTPS заработает для вашего домена и всех используемых поддоменов.

Шаги этого руководства по порядку: 1. брандмауэр UFW с запретом по умолчанию; 2. fail2ban для повторяющихся сбоев; 3. скройте версию Nginx и добавьте безопасные заголовки; 4. ограничьте злоупотребляющие запросы; 5. поддерживайте обновления; 6. За чем следить
Шаги этого руководства по порядку.

Шаг 4: ограничьте злоупотребляющие запросы

Ограничение частоты запросов замедляет попытки перебора на страницах входа:

# in the http block
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

# in your server block
location = /wp-login.php {
    limit_req zone=login burst=5 nodelay;
    # ...your usual PHP handling
}

Проверьте и примените командой sudo nginx -t && sudo systemctl reload nginx.

Шаг 5: поддерживайте обновления

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

Автоматические обновления безопасности закрывают известные уязвимости без вашего участия.

За чем следить

  • Проверяйте баны командой sudo fail2ban-client status sshd.
  • Время от времени просматривайте /var/log/nginx/error.log.
  • Если вы находитесь за прокси или CDN, убедитесь, что fail2ban считывает реальный IP клиента, иначе вы можете забанить собственный прокси.