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