Чек-лист безопасности веб-сервера: Nginx и Apache
Чек-лист безопасности веб-сервера
Защита веб-сервера — одна из самых критичных задач при работе в продакшене. Неправильно настроенный сервер открывает приложение для утечек данных, дефейса, внедрения вредоносного кода и атак типа «отказ в обслуживании». Этот чек-лист охватывает основные шаги по усилению безопасности серверов nginx и Apache.
Почему усиление безопасности важно
Конфигурации серверов по умолчанию отдают приоритет удобству настройки, а не безопасности. Стандартные установки часто раскрывают версию ПО, включают ненужные модули и используют слабые настройки TLS. Злоумышленники активно сканируют такие уязвимости. Хардининг уменьшает поверхность атаки и значительно усложняет эксплуатацию уязвимостей.
- Уменьшение поверхности атаки: Меньше включенных модулей и сервисов — меньше потенциальных уязвимостей.
- Глубокая защита: Заголовки безопасности и правильный TLS добавляют уровни защиты помимо безопасности на уровне приложения.
- Соответствие стандартам: Многие стандарты (PCI-DSS, SOC 2, ISO 27001) требуют документированных процедур хардининга.
- Предотвращение инцидентов: Правильные права доступа предотвращают повышение привилегий после первичного проникновения.
1. Скрытие версии сервера
Никогда не раскрывайте версию серверного ПО публично. Эта информация помогает злоумышленникам определить известные уязвимости.
Nginx
# nginx.conf
server_tokens off;
# Удалить X-Powered-By, если установлен upstream
proxy_hide_header X-Powered-By;
Apache
# httpd.conf или apache2.conf
ServerTokens Prod
ServerSignature Off
Header unset X-Powered-By
2. Заголовки безопасности
проверку HTTP-заголовков безопасности инструктируют браузеры применять политики защиты. Отсутствие заголовков оставляет пользователей уязвимыми для XSS, кликджекинга и атак внедрения данных.
| Заголовок | Значение | Назначение |
|---|---|---|
| X-Content-Type-Options | nosniff | Предотвращает MIME-снифинг |
| X-Frame-Options | DENY или SAMEORIGIN | Предотвращает кликджекинг |
| Referrer-Policy | strict-origin-when-cross-origin | Контролирует утечку реферера |
| Permissions-Policy | camera=(), microphone=() | Ограничивает доступ к функциям браузера |
| Content-Security-Policy | default-src 'self' | Контролирует источники загрузки ресурсов |
| Strict-Transport-Security | max-age=63072000 | Принудительное SSL/TLS проверку-соединение |
Реализация в Nginx
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 Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
3. Настройка TLS
Современная конфигурация TLS критически важна. Отключите устаревшие протоколы и слабые шифры.
# Современная конфигурация TLS (nginx)
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_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
Регулярно проверяйте конфигурацию TLS с помощью SSL Labs (ssllabs.com). Стремитесь к рейтингу A+. Убедитесь, что OCSP-степлинг работает корректно и сертификаты обновляются заблаговременно.
4. Права доступа к файлам
Неправильные права доступа — одна из самых распространенных проблем безопасности. Следуйте принципу минимальных привилегий.
- Директории веб-корня: 755 (rwxr-xr-x)
- Статические файлы (HTML, CSS, JS, изображения): 644 (rw-r--r--)
- PHP/скрипт-файлы: 644 (rw-r--r--)
- Конфигурационные файлы: 640 (rw-r-----) или 600 (rw-------)
- Директории загрузок: 755 с опцией монтирования noexec
- Лог-файлы: 640 (rw-r-----)
# Установка правильного владельца и прав
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chmod 600 /var/www/html/.env
chmod 600 /var/www/html/config/*.php
5. Контроль доступа
Ограничьте доступ к чувствительным путям и административным интерфейсам.
Nginx
# Блокировка скрытых файлов
location ~ /\. {
deny all;
return 404;
}
# Ограничение админки по IP
location /admin/ {
allow 192.168.1.0/24;
deny all;
}
6. Ограничение частоты запросов и защита от DDoS
Защитите от брутфорса и атак отказа в обслуживании с помощью ограничения частоты запросов.
# Ограничение частоты запросов в nginx
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/m;
location /login {
limit_req zone=login burst=3 nodelay;
}
location /api/ {
limit_req zone=api burst=10 nodelay;
}
7. Логирование и мониторинг
Правильное логирование необходимо для обнаружения и расследования инцидентов безопасности.
- Включите access- и error-логи для каждого виртуального хоста.
- Отправляйте логи в централизованную систему (syslog, ELK-стек или SIEM).
- Мониторьте аномальные паттерны: повторяющиеся ошибки 403/404, большие тела запросов, необычные User-Agent.
- Настройте автоматические оповещения для критических событий.
- Храните логи минимум 90 дней для форензик-анализа.
8. Отключение ненужных модулей
Каждый загруженный модуль — потенциальный вектор атаки. Отключайте то, что не используете:
# Apache: отключение неиспользуемых модулей
a2dismod autoindex status cgi
# Nginx: компилируйте без ненужных модулей
# Просмотр загруженных модулей:
nginx -V 2>&1 | tr -- '-' '\n' | grep module
Итоговый чек-лист
- Скрыть версию и информацию о серверном ПО
- Внедрить все рекомендуемые заголовки безопасности
- Настроить современный TLS (1.2+) с надежными шифрами
- Установить правильные права доступа и владельца файлов
- Ограничить доступ к чувствительным директориям
- Включить ограничение частоты запросов на аутентификацию и API документацию
- Настроить комплексное логирование и мониторинг сайтов
- Отключить ненужные серверные модули
- Своевременно обновлять серверное ПО
- Тестировать конфигурацию автоматическими сканерами безопасности
Хардининг сервера — это не разовая задача. Планируйте регулярные аудиты, подписывайтесь на рассылки безопасности для вашего серверного ПО и перепроверяйте настройки после каждого изменения конфигурации.
Проверьте ваш сайт прямо сейчас
Проверить →