Apache HTTP Server, или просто Apache, остаётся одним из самых популярных веб-серверов в мире. По данным различных исследований, он обслуживает около 30% всех активных веб-сайтов. Такая популярность делает Apache привлекательной мишенью для киберпреступников, стремящихся использовать различные уязвимости в своих атаках.
В этой статье мы рассмотрим наиболее распространенные уязвимости Apache и изучим практические методы защиты вашего веб-сервера. Мы рассмотрим как базовые настройки безопасности, так и более продвинутые техники, включая внедрение Web Application Firewall (WAF) и настройку защищённых HTTP-заголовков.
Безопасность — это не конечное состояние, а непрерывный процесс. Даже самые современные меры защиты требуют постоянного контроля, обновления и адаптации к новым угрозам.
1. Распространенные уязвимости Apache
Перед тем как приступить к защите Apache, необходимо понимать, с какими типами угроз мы имеем дело. Рассмотрим наиболее распространённые уязвимости и атаки, нацеленные на Apache HTTP Server.
Уязвимости в коде сервера
Как и любое сложное программное обеспечение, Apache может содержать уязвимости в своём коде:
- Переполнение буфера — позволяет злоумышленнику выполнить произвольный код
- Memory leaks — могут привести к исчерпанию ресурсов сервера
- Уязвимости парсинга запросов — позволяют обойти механизмы безопасности
- Уязвимости в модулях — дополнительные модули часто содержат собственные проблемы безопасности
Последние серьезные уязвимости
CVE-2021-44790: Уязвимость buffer overflow в mod_lua
CVE-2021-39275: Проблема с null pointer dereference в
mod_proxy_http
CVE-2020-13950: Уязвимость mod_proxy, позволяющая перенаправлять
трафик на произвольные бэкенды
CVE-2019-0211: Уязвимость повышения привилегий в скрипте обработки
привилегий
Атаки, направленные на конфигурацию
Неправильная настройка сервера — одна из наиболее часто эксплуатируемых проблем:
- Directory traversal — доступ к файлам за пределами корневого каталога сайта
- Раскрытие информации — сервер сообщает слишком много деталей о своей конфигурации
- Неправильные разрешения файлов — позволяют читать, изменять или выполнять критические файлы
- Включенные ненужные модули и функции — расширяют поверхность атаки
Атаки на веб-приложения
Хотя это не прямые уязвимости Apache, сервер должен быть настроен для защиты размещенных на нём приложений:
- SQL-инъекции — внедрение вредоносного SQL-кода в запросы к базе данных
- XSS (Cross-Site Scripting) — внедрение JavaScript в страницы сайта
- CSRF (Cross-Site Request Forgery) — выполнение действий от имени авторизованного пользователя
- Включение удаленных файлов — исполнение кода с других серверов
- Инъекции HTTP заголовков — манипуляция заголовками HTTP для обхода защиты
DoS-атаки (Denial of Service)
Атаки, направленные на отказ в обслуживании, могут иметь разные формы:
- Slowloris — атака, использующая медленные HTTP-запросы для исчерпания соединений
- Apache Killer — эксплуатирует уязвимость в обработке заголовков Range
- Flood-атаки — массовые запросы, истощающие ресурсы сервера
- Неправильная обработка ресурсоёмких запросов — запросы, требующие значительных ресурсов для обработки
Важно!
Регулярно отслеживайте базы данных уязвимостей (например, CVE) и списки рассылки Apache Security для получения информации о новых уязвимостях и исправлениях безопасности. Своевременное обновление — ваша первая линия защиты.
2. Безопасная установка и настройка Apache
Правильная установка и минимальная конфигурация Apache — первый шаг к обеспечению безопасности. Следуя принципу наименьших привилегий, мы должны включать только те функции, которые действительно необходимы для работы.
Установка последней стабильной версии
Всегда используйте последнюю стабильную версию Apache, которая содержит исправления известных уязвимостей:
# Debian/Ubuntu apt update apt install apache2 # CentOS/RHEL dnf update dnf install httpd # Проверка версии apache2 -v # Debian/Ubuntu httpd -v # CentOS/RHEL
Минимизация модулей
Отключите все ненужные модули, чтобы уменьшить поверхность атаки:
# Debian/Ubuntu: отображение включенных модулей apache2ctl -M # Отключение ненужных модулей a2dismod status autoindex info cgi # CentOS/RHEL: отключение модулей в httpd.conf # Закомментируйте неиспользуемые LoadModule директивы
Некоторые модули, которые часто можно безопасно отключить:
mod_status
— показывает информацию о производительности сервераmod_info
— отображает конфигурацию сервераmod_userdir
— позволяет пользователям размещать контент в своих домашних директорияхmod_autoindex
— генерирует листинг директорийmod_cgi
илиmod_cgid
— если CGI-скрипты не используются
Запуск Apache от непривилегированного пользователя
Apache никогда не должен запускаться от имени пользователя root:
# Debian/Ubuntu: настройка в /etc/apache2/envvars export APACHE_RUN_USER=www-data export APACHE_RUN_GROUP=www-data # CentOS/RHEL: настройка в /etc/httpd/conf/httpd.conf User apache Group apache
Ограничение использования ресурсов
Защитите сервер от исчерпания ресурсов, настроив соответствующие ограничения:
# Ограничение размера запроса LimitRequestBody 1048576 # Ограничение числа одновременных соединений MaxClients 150 # Ограничение числа обрабатываемых запросов на дочерний процесс MaxRequestsPerChild 1000 # Таймаут соединения Timeout 60 # Ограничение размера заголовков LimitRequestFieldSize 8190 LimitRequestFields 100
Совет
Используйте директиву ServerTokens Prod
для сокрытия информации о
версии Apache
и ServerSignature Off
для отключения подписи сервера в сообщениях об
ошибках.
Мы подробнее рассмотрим это в следующем разделе.
Изоляция виртуальных хостов
Если вы размещаете несколько сайтов на одном сервере, важно правильно их изолировать:
# Использование разных пользователей для разных VirtualHost с MPM ITK <IfModule mpm_itk_module> <VirtualHost *:80> ServerName site1.example.com AssignUserID site1user site1group DocumentRoot /var/www/site1 </VirtualHost> <VirtualHost *:80> ServerName site2.example.com AssignUserID site2user site2group DocumentRoot /var/www/site2 </VirtualHost> </IfModule>
Баланс между безопасностью и производительностью
При настройке Apache необходимо найти баланс между безопасностью и производительностью:
3. Сокрытие информации о сервере
По умолчанию Apache предоставляет множество информации о себе: версию сервера, используемые модули, информацию об ОС и другие детали, которые могут быть использованы злоумышленниками для планирования атак. Сокрытие этой информации — важный шаг в обеспечении безопасности.
Минимизация информации в HTTP-заголовках
В стандартной конфигурации Apache отправляет подробную информацию о версии в заголовке Server:
# Пример заголовка по умолчанию Server: Apache/2.4.52 (Ubuntu) OpenSSL/3.0.2 PHP/8.1.2
Для сокрытия этой информации используйте директивы ServerTokens и ServerSignature:
# Добавьте в основной конфигурационный файл Apache # Показывать только "Apache" без версии и дополнительной информации ServerTokens Prod # Отключить подпись сервера на страницах ошибок ServerSignature Off
Для более радикального изменения или полного удаления заголовка Server можно использовать mod_headers:
# Полная замена заголовка Server Header always unset Server Header always set Server "Secret Server" # Или через mod_security (если установлен) SecServerSignature "Secret Server"
Отключение листинга директорий
Автоматический листинг директорий может раскрыть структуру файлов и потенциально чувствительную информацию:
# Отключение автоиндексации для всех директорий <Directory /var/www/html> Options -Indexes </Directory> # Или глобально в httpd.conf Options -Indexes
Скрытие версий используемого ПО
Если на сервере работают PHP, Python или другие интерпретаторы, также скройте информацию об их версиях:
# Для PHP в php.ini expose_php = Off # Для модулей Apache через .htaccess или конфигурацию виртуального хоста <IfModule mod_headers.c> Header unset X-Powered-By </IfModule>
Защита файлов .htaccess
Файлы .htaccess могут содержать чувствительную информацию о конфигурации, которую не следует раскрывать:
# Запрет доступа к .htaccess и другим конфигурационным файлам <FilesMatch "^\.ht"> Require all denied </FilesMatch> # Защита конфигурационных файлов <FilesMatch "\.(conf|ini|env|json|config)$"> Require all denied </FilesMatch>
Совет
Используйте нестандартные имена для административных интерфейсов или директорий с конфигурационными файлами. Хотя это не является полноценной защитой (security through obscurity), такой подход может снизить количество автоматизированных атак.
Управление информацией об ошибках
Подробные сообщения об ошибках могут раскрыть уязвимые места вашего сервера:
# Отключение вывода информации об ошибках <Directory /var/www/html> php_flag display_errors off </Directory> # Настройка пользовательских страниц ошибок ErrorDocument 404 /custom-404.html ErrorDocument 403 /custom-403.html ErrorDocument 500 /custom-500.html
Важно!
Убедитесь, что пользовательские страницы ошибок не содержат информации о сервере, версиях ПО или структуре вашего сайта. Они должны быть информативными для пользователей, но не для потенциальных злоумышленников.
4. Настройка контроля доступа
Правильно настроенный контроль доступа — один из фундаментальных аспектов безопасности Apache. Он позволяет ограничить доступ к определённым ресурсам на основе различных критериев: IP-адресов, аутентификации, времени суток и т.д.
Ограничение доступа по IP-адресам
Вы можете ограничить доступ к определённым разделам вашего сайта по IP-адресам:
# Ограничение доступа для всего сервера или виртуального хоста <Directory /var/www/html/admin> Require ip 10.0.0.0/8 172.16.0.0/12 Require ip 192.168.1.100 192.168.1.101 </Directory> # Блокировка определённых IP-адресов <Directory /var/www/html> Require all granted Require not ip 10.0.0.5 172.16.3.4 </Directory>
Базовая HTTP-аутентификация
Защитите административные или приватные секции вашего сайта с помощью HTTP-аутентификации:
# Создание файла паролей htpasswd -c /etc/apache2/.htpasswd admin # Настройка аутентификации <Directory /var/www/html/admin> AuthType Basic AuthName "Restricted Access" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory>
Комбинирование правил доступа
Apache позволяет создавать сложные правила доступа, комбинируя различные условия:
<Directory /var/www/html/admin> # Разрешить доступ пользователю admin из внутренней сети <RequireAll> Require user admin Require ip 192.168.1.0/24 </RequireAll> # ИЛИ разрешить любому пользователю из руководящей группы <RequireAny> <RequireAll> Require group management Require all granted </RequireAll> </RequireAny> </Directory>
Ограничение доступа к определённым типам файлов
Защитите критически важные файлы вашего приложения:
# Запрет доступа к файлам конфигурации и бэкапам <FilesMatch "\.(bak|config|sql|ini|log|sh|inc|env|json|htaccess)$"> Require all denied </FilesMatch> # Запрет доступа к скрытым файлам и директориям <DirectoryMatch "^\.|\/\."> Require all denied </DirectoryMatch>
Контроль по методам HTTP-запросов
Ограничьте разрешённые HTTP-методы для предотвращения нежелательных действий:
<Directory /var/www/html> # Разрешить только GET, POST и HEAD методы <LimitExcept GET POST HEAD> Require all denied </LimitExcept> </Directory>
Внимание
При использовании базовой HTTP-аутентификации убедитесь, что соединение защищено SSL/TLS. В противном случае учётные данные передаются в открытом виде (с базовым кодированием Base64) и могут быть перехвачены.
Защита от перебора паролей
Для защиты от атак перебора паролей можно использовать mod_security (подробнее в следующем разделе) или mod_evasive:
# Установка mod_evasive apt install libapache2-mod-evasive # Debian/Ubuntu dnf install mod_evasive # CentOS/RHEL # Базовая конфигурация <IfModule mod_evasive20.c> DOSHashTableSize 3097 DOSPageCount 5 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 60 DOSLogDir "/var/log/mod_evasive" </IfModule>
5. Внедрение ModSecurity WAF
ModSecurity — это Web Application Firewall (WAF) с открытым исходным кодом, который предоставляет расширенную защиту для веб-приложений. Он работает на уровне HTTP и может обнаруживать и блокировать множество атак, включая SQL-инъекции, XSS, CSRF и многие другие.
Установка ModSecurity
Установка ModSecurity для Apache:
# Debian/Ubuntu apt update apt install libapache2-mod-security2 a2enmod security2 systemctl restart apache2 # CentOS/RHEL dnf install mod_security mod_security_crs systemctl restart httpd
Базовая настройка ModSecurity
После установки нужно создать базовую конфигурацию:
# Копирование рекомендуемой конфигурации # Debian/Ubuntu cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf # CentOS/RHEL cp /etc/httpd/modsecurity.d/modsecurity.conf-recommended /etc/httpd/modsecurity.d/modsecurity.conf # Активация ModSecurity (изменение в modsecurity.conf) SecRuleEngine On # Вместо DetectionOnly
Установка OWASP Core Rule Set (CRS)
OWASP CRS — это набор правил для ModSecurity, разработанный для защиты от распространённых атак:
# Debian/Ubuntu apt install modsecurity-crs # Включение в конфигурации Apache # Добавьте в /etc/apache2/mods-enabled/security2.conf: IncludeOptional /usr/share/modsecurity-crs/*.load IncludeOptional /usr/share/modsecurity-crs/rules/*.conf # CentOS/RHEL # По умолчанию CRS обычно устанавливается вместе с ModSecurity # Включение в конфигурации: # Добавьте в /etc/httpd/conf.d/mod_security.conf: IncludeOptional /etc/httpd/modsecurity.d/activated_rules/*.conf
Настройка парирования ложных срабатываний
ModSecurity может генерировать ложные срабатывания, которые блокируют легитимный трафик. Для исправления этого создайте файл с исключениями:
# Создание файла для исключений # Debian/Ubuntu nano /etc/modsecurity/modsecurity_localrules.conf # CentOS/RHEL nano /etc/httpd/modsecurity.d/localrules.conf # Пример исключения для конкретного правила и URL SecRule REQUEST_URI "@beginsWith /legitimate-path" \ "id:1000,phase:1,pass,nolog,ctl:ruleRemoveById=942100" # Включение файла локальных правил # Добавьте в конфигурацию Apache: Include /etc/modsecurity/modsecurity_localrules.conf # Debian/Ubuntu Include /etc/httpd/modsecurity.d/localrules.conf # CentOS/RHEL
Мониторинг и анализ логов ModSecurity
ModSecurity записывает подробные логи о своей работе, которые помогают обнаруживать атаки и настраивать правила:
# Настройка логирования в modsecurity.conf SecAuditEngine On SecAuditLogParts ABCFHZ SecAuditLogType Serial SecAuditLog /var/log/apache2/modsec_audit.log # Debian/Ubuntu SecAuditLog /var/log/httpd/modsec_audit.log # CentOS/RHEL # Просмотр логов на наличие атак grep "403" /var/log/apache2/modsec_audit.log grep "ALERT" /var/log/apache2/error.log
Совет
Начните с включения ModSecurity в режиме DetectionOnly (SecRuleEngine DetectionOnly), чтобы мониторить потенциальные атаки без блокировки трафика. После анализа логов и настройки исключений переключите его в режим On для активной защиты.
Создание собственных правил ModSecurity
Для специфических требований вашего приложения можно создать собственные правила:
# Пример правила для блокировки доступа к админ-панели из нежелательных регионов SecGeoLookupDb /path/to/GeoIP.dat SecRule REMOTE_ADDR "@geoLookup" "chain,id:1001,phase:1,deny,status:403,msg:'Access from unauthorized country'" SecRule GEO:COUNTRY_CODE "!@within US,CA,GB" # Правило для защиты от атак на конкретную уязвимость вашего приложения SecRule REQUEST_URI "@contains /vulnerable-path" \ "chain,id:1002,phase:2,deny,status:403,msg:'Possible exploitation attempt'" SecRule ARGS:parameter "@rx (?i:malicious|pattern)"
6. Защита SSL/TLS соединений
Правильная настройка SSL/TLS критически важна для защиты данных, передаваемых между клиентами и сервером. Устаревшие протоколы и шифры могут сделать соединение уязвимым, даже если оно формально зашифровано.
Включение SSL/TLS в Apache
Первый шаг — включение и правильная настройка модулей SSL:
# Debian/Ubuntu a2enmod ssl systemctl restart apache2 # CentOS/RHEL # SSL модуль обычно включен по умолчанию # Проверка: httpd -M | grep ssl # Создание виртуального хоста для HTTPS <VirtualHost *:443> ServerName example.com DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /path/to/certificate.crt SSLCertificateKeyFile /path/to/private.key SSLCertificateChainFile /path/to/chain.crt # Если требуется </VirtualHost>
Настройка современных протоколов и шифров
Отключите устаревшие и небезопасные протоколы и шифры:
# Включение только TLS 1.2 и TLS 1.3 SSLProtocol -all +TLSv1.2 +TLSv1.3 # Настройка безопасных шифров SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 # Предпочтение серверных шифров SSLHonorCipherOrder on # Параметры Диффи-Хеллмана SSLOpenSSLConfCmd DHParameters "/path/to/dhparam.pem" # Настройка кривых эллиптической криптографии SSLOpenSSLConfCmd Curves X25519:prime256v1:secp384r1
HTTP Strict Transport Security (HSTS)
HSTS указывает браузерам взаимодействовать с сайтом только через HTTPS:
<VirtualHost *:443> # ... остальные настройки ... # Включение HSTS на 6 месяцев (в секундах) Header always set Strict-Transport-Security "max-age=15768000" # Вариант с включением поддоменов и preload # Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" </VirtualHost>
OCSP Stapling
OCSP Stapling повышает производительность и приватность при проверке отзыва сертификатов:
SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" SSLStaplingResponseMaxAge 86400
Перенаправление с HTTP на HTTPS
Убедитесь, что все HTTP-запросы автоматически перенаправляются на HTTPS:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com Redirect permanent / https://example.com/ # Альтернативный вариант с mod_rewrite <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L] </IfModule> </VirtualHost>
Важно!
Регулярно проверяйте настройки SSL/TLS с помощью таких инструментов, как Qualys SSL Labs. Небезопасные конфигурации могут открыть ваш сервер для атак типа POODLE, BEAST, Heartbleed и CRIME.
Content Security Policy (CSP)
Хотя это не прямая часть SSL/TLS, CSP часто настраивается вместе с HTTPS для предотвращения атак на клиентскую часть:
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com; img-src 'self' data:; style-src 'self' 'unsafe-inline' https://trusted-cdn.com; frame-ancestors 'none';"
7. Управление правами файлов и директорий
Правильное управление правами доступа к файлам и директориям на сервере — важный аспект безопасности Apache. Неправильно настроенные разрешения могут позволить злоумышленникам получить доступ к конфиденциальным данным или даже выполнить произвольный код.
Базовые принципы управления правами
При настройке прав доступа следуйте принципу наименьших привилегий:
- Файлы должны принадлежать пользователю, не являющемуся пользователем Apache
- Директории веб-контента должны иметь права 755 (rwxr-xr-x)
- Статические файлы (HTML, CSS, JS, изображения) должны иметь права 644 (rw-r--r--)
- Конфиденциальные файлы данных должны иметь права 640 (rw-r-----) или 600 (rw-------)
- Директории для загрузки пользовательских файлов должны быть изолированы
Настройка прав для Apache
Пример настройки прав для типичного веб-сайта:
# Установка владельца и группы для файлов сайта chown -R webmaster:www-data /var/www/example.com # Установка базовых прав доступа find /var/www/example.com -type d -exec chmod 755 {} \; find /var/www/example.com -type f -exec chmod 644 {} \; # Установка особых прав для определённых директорий chmod 750 /var/www/example.com/config chmod 750 /var/www/example.com/admin # Установка прав для записи в определённые директории chmod 775 /var/www/example.com/uploads chmod 775 /var/www/example.com/cache chmod 775 /var/www/example.com/logs
Защита конфигурационных файлов
Конфигурационные файлы Apache и .htaccess требуют особой защиты:
# Защита конфигурационных файлов Apache chmod 600 /etc/apache2/apache2.conf chmod 600 /etc/apache2/sites-available/* chmod 600 /etc/apache2/conf-available/* # Защита файлов .htaccess find /var/www -name ".htaccess" -exec chmod 644 {} \; # Защита файлов SSL chmod 600 /etc/ssl/private/* chmod 644 /etc/ssl/certs/*
Разделение прав для разных виртуальных хостов
Если на сервере размещено несколько сайтов, важно правильно изолировать их друг от друга:
# Создание отдельных групп для каждого сайта groupadd site1 groupadd site2 # Создание пользователей для каждого сайта useradd -g site1 -d /var/www/site1 site1user useradd -g site2 -d /var/www/site2 site2user # Установка прав для директорий сайтов chown -R site1user:site1 /var/www/site1 chown -R site2user:site2 /var/www/site2 # Добавление пользователя Apache в каждую группу для доступа на чтение usermod -a -G site1 www-data usermod -a -G site2 www-data # Настройка прав доступа chmod -R 750 /var/www/site1 chmod -R 750 /var/www/site2 # Дополнительные права для директорий с записью chmod -R 770 /var/www/site1/uploads chmod -R 770 /var/www/site2/uploads
Управление правами для PHP и скриптов
Скрипты и выполняемые файлы требуют особого внимания:
# Для PHP-файлов рекомендуется ограничить права на чтение find /var/www -name "*.php" -exec chmod 644 {} \; # Исполняемые скрипты должны иметь соответствующие права, но не больше find /var/www -name "*.sh" -exec chmod 750 {} \; find /var/www -name "*.py" -exec chmod 750 {} \; # Использование suPHP или PHP-FPM для выполнения PHP с правами владельца файла # Установка и настройка suPHP (пример для Debian/Ubuntu) apt install libapache2-mod-suphp a2enmod suphp systemctl restart apache2
Совет
Регулярно запускайте аудит файловых разрешений на сервере. Автоматизируйте эту проверку с помощью скриптов и cron, чтобы быстро обнаруживать неправильно настроенные права доступа.
#!/bin/bash # Скрипт для проверки слишком открытых разрешений find /var/www -type f -perm /o+w -exec ls -la {} \; | mail -s "Warning: World-writeable files found on $(hostname)" admin@example.com
Использование chroot и других механизмов изоляции
Для более строгой изоляции рассмотрите использование chroot или контейнеров:
# Установка mod_chroot для Apache apt install libapache2-mod-chroot # Debian/Ubuntu a2enmod chroot systemctl restart apache2 # Добавление в конфигурацию Apache <IfModule mod_chroot.c> ChrootDir /var/www </IfModule>
Важно!
При использовании подхода с chroot требуется дополнительная настройка для обеспечения работы всех компонентов (PHP, баз данных, библиотек) в изолированной среде. Это значительно усложняет конфигурацию, но существенно повышает безопасность.
8. Защита от DoS-атак
Атаки типа "отказ в обслуживании" (Denial of Service, DoS) и их распределённые варианты (DDoS) направлены на исчерпание ресурсов сервера и прерывание нормального обслуживания пользователей. Apache имеет несколько встроенных механизмов и модулей для противодействия таким атакам.
Настройка базовых лимитов Apache
Правильная настройка ограничений ресурсов в Apache может предотвратить многие DoS-атаки:
# Ограничение количества соединений <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 150 MaxConnectionsPerChild 0 </IfModule> # Ограничение таймаута соединения Timeout 60 # Ограничение размера запросов LimitRequestBody 10485760 # 10 МБ LimitRequestFields 100 LimitRequestFieldSize 8190 LimitRequestLine 8190 # Ограничение обработки Range-запросов (защита от атак типа Apache Killer) LimitXMLRequestBody 1048576 # 1 МБ
Использование mod_evasive для защиты от DoS
Модуль mod_evasive специально разработан для обнаружения и блокировки DoS-атак:
# Установка mod_evasive apt install libapache2-mod-evasive # Debian/Ubuntu dnf install mod_evasive # CentOS/RHEL # Базовая конфигурация mod_evasive <IfModule mod_evasive20.c> DOSHashTableSize 3097 DOSPageCount 5 DOSSiteCount 100 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 600 # Уведомление по email DOSEmailNotify admin@example.com # Логирование DOSLogDir "/var/log/mod_evasive" # Исключения для легитимных IP-адресов DOSWhitelist 127.0.0.1 DOSWhitelist 192.168.1.0/24 </IfModule>
Использование mod_qos для контроля качества обслуживания
Модуль mod_qos предоставляет дополнительные возможности для защиты от DoS-атак и управления нагрузкой:
# Установка mod_qos apt install libapache2-mod-qos # Debian/Ubuntu # Базовая конфигурация mod_qos <IfModule mod_qos.c> # Максимальное число IP с установленными соединениями QS_ClientEntries 5000 # Максимальное число параллельных соединений с одного IP QS_SrvMaxConnPerIP 30 # Максимальное число параллельных подключений QS_SrvMaxConnClose 20% # Максимальное число активных запросов QS_SrvMaxConnPerIP 10 # Защита от Slowloris QS_SrvMinDataRate 150 1200 # Ограничение размера запроса RequestReadTimeout header=10 body=10 # Защита от Slowloris, ограничение скорости отправки заголовков QS_SrvMinDataRate 1000 3000 </IfModule>
Настройка KeepAlive для балансировки нагрузки
Правильная настройка KeepAlive может улучшить производительность и снизить уязвимость к DoS-атакам:
# Включение KeepAlive для законных пользователей KeepAlive On # Ограничение количества запросов на соединение MaxKeepAliveRequests 100 # Ограничение времени ожидания между запросами KeepAliveTimeout 5
Использование внешних решений
Для более эффективной защиты часто используются внешние решения:
- Защита на уровне файрвола — настройка iptables, firewalld или других файрволов
- Использование Fail2ban — блокировка IP-адресов, демонстрирующих подозрительную активность
- CDN и Anti-DDoS сервисы — Cloudflare, Akamai и другие могут фильтровать трафик до его поступления на сервер
- Балансировщики нагрузки — распределяют нагрузку между несколькими серверами
# Пример настройки правил iptables для базовой защиты # Ограничение соединений на порт 80 (HTTP) iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 25/minute --limit-burst 100 -j ACCEPT # Защита от SYN-flood iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP # Установка Fail2ban для защиты Apache apt install fail2ban cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Настройка Fail2ban для Apache (в jail.local) [apache-dos] enabled = true port = http,https filter = apache-dos logpath = /var/log/apache*/access.log maxretry = 300 findtime = 300 bantime = 600
Настройка защиты от DoS и производительность
При настройке защиты от DoS важно найти баланс между безопасностью и производительностью:
9. Логирование и мониторинг безопасности
Эффективное логирование и мониторинг — ключевые компоненты безопасности Apache. Они позволяют обнаруживать попытки атак, анализировать уязвимости и быстро реагировать на инциденты безопасности.
Настройка расширенного формата логов Apache
Базовый формат логов Apache предоставляет ограниченную информацию. Настройте расширенный формат для более детального логирования:
# Определение расширенного формата логов с дополнительной информацией безопасности LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T %{X-Forwarded-For}i %{Host}i" combined_sec # Использование расширенного формата в виртуальном хосте <VirtualHost *:80> # ... другие настройки ... CustomLog ${APACHE_LOG_DIR}/access.log combined_sec </VirtualHost> # Включение логирования ошибок ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn
Настройка логирования ModSecurity
ModSecurity предоставляет подробные логи о попытках атак и нарушениях безопасности:
# Настройка основного лога ModSecurity SecAuditEngine On SecAuditLogParts ABCFHZ SecAuditLogType Serial SecAuditLog /var/log/apache2/modsec_audit.log # Настройка вывода ошибок и предупреждений ModSecurity SecDebugLog /var/log/apache2/modsec_debug.log SecDebugLogLevel 3
Централизованное управление логами
Для эффективного мониторинга рекомендуется настроить отправку логов на централизованную систему:
# Установка rsyslog для централизованного логирования apt install rsyslog # Конфигурация отправки логов (в /etc/rsyslog.conf) *.* @log-server.example.com:514 # Отправка логов Apache в rsyslog # Добавьте в /etc/apache2/apache2.conf ErrorLog syslog:local1 CustomLog "| /usr/bin/logger -t apache -p local1.info" combined_sec
Установка OSSEC для мониторинга и обнаружения вторжений
OSSEC — это система обнаружения вторжений на хосте (HIDS), которая может анализировать логи Apache:
# Установка OSSEC wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gz tar -zxvf 3.7.0.tar.gz cd ossec-hids-3.7.0 ./install.sh # Настройка мониторинга логов Apache в OSSEC # В файле /var/ossec/etc/ossec.conf добавьте: <localfile> <log_format>apache</log_format> <location>/var/log/apache2/access.log</location> </localfile> <localfile> <log_format>apache</log_format> <location>/var/log/apache2/error.log</location> </localfile>
Настройка ELK Stack для анализа логов
ELK Stack (Elasticsearch, Logstash, Kibana) предоставляет мощные инструменты для сбора, анализа и визуализации логов:
# Установка Filebeat для отправки логов Apache в ELK curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.1-amd64.deb dpkg -i filebeat-7.15.1-amd64.deb # Настройка конфигурации Filebeat для логов Apache nano /etc/filebeat/filebeat.yml # Добавьте следующие настройки: filebeat.inputs: - type: log enabled: true paths: - /var/log/apache2/access.log - /var/log/apache2/error.log - /var/log/apache2/modsec_audit.log output.elasticsearch: hosts: ["elk-server.example.com:9200"]
Настройка оповещений о безопасности
Настройте автоматические оповещения о потенциальных проблемах безопасности:
# Создание скрипта для проверки логов на предмет атак #!/bin/bash # Файл: /usr/local/bin/apache-security-check.sh # Поиск распространенных атак в логах grep -E "script|union|select|insert|drop|update|exec|eval" /var/log/apache2/access.log > /tmp/attacks.log # Если найдены потенциальные атаки, отправить email if [ -s /tmp/attacks.log ]; then cat /tmp/attacks.log | mail -s "Warning: Potential attacks detected on $(hostname)" admin@example.com fi # Создание задачи cron для запуска скрипта каждый час echo "0 * * * * root /usr/local/bin/apache-security-check.sh" > /etc/cron.d/apache-security-check
Совет
Для более глубокого анализа безопасности рассмотрите использование специализированных инструментов, таких как Wazuh (форк OSSEC), AIDE (Advanced Intrusion Detection Environment) или Fail2ban с расширенными правилами для Apache.
10. HTTP-заголовки безопасности
HTTP-заголовки безопасности позволяют серверу контролировать поведение браузера в отношении обработки контента вашего сайта. Правильно настроенные заголовки могут значительно снизить риск атак XSS, инъекций и других угроз на стороне клиента.
Content Security Policy (CSP)
CSP позволяет определить, из каких источников браузер может загружать ресурсы, что существенно снижает риск XSS-атак:
# Базовая настройка CSP Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com; img-src 'self' data:; style-src 'self' 'unsafe-inline' https://trusted-cdn.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self'; frame-src 'self'; frame-ancestors 'self'; form-action 'self';" # Для начала можно использовать режим отчётов без блокировки Header set Content-Security-Policy-Report-Only "default-src 'self'; report-uri /csp-report-endpoint;"
X-XSS-Protection
Этот заголовок активирует встроенную в современные браузеры защиту от XSS:
# Включение XSS-защиты и блокировка при обнаружении атак Header always set X-XSS-Protection "1; mode=block"
X-Frame-Options
Защищает от clickjacking-атак, контролируя возможность встраивания вашего сайта в frame/iframe:
# Запрет встраивания страницы во фреймы Header always set X-Frame-Options "DENY" # Или разрешение встраивания только на своём домене Header always set X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options
Запрещает браузеру пытаться "угадать" MIME-тип ресурсов, что может привести к атаке:
# Запрет MIME-сниффинга Header always set X-Content-Type-Options "nosniff"
Referrer-Policy
Контролирует, какая информация о реферере передаётся при переходе по ссылкам:
# Ограничение передачи реферера только своим доменом Header always set Referrer-Policy "strict-origin-when-cross-origin"
Feature-Policy / Permissions-Policy
Позволяет управлять доступом к различным браузерным API и функциям:
# Ограничение доступа к API геолокации, микрофону и камере Header always set Feature-Policy "geolocation 'self'; microphone 'none'; camera 'none'" # Современный эквивалент для новых браузеров Header always set Permissions-Policy "geolocation=(self), microphone=(), camera=()"
HTTP Strict Transport Security (HSTS)
HSTS указывает браузеру взаимодействовать с сайтом только через HTTPS:
# Включение HSTS на 1 год (в секундах) Header always set Strict-Transport-Security "max-age=31536000" env=HTTPS
Настройка всех заголовков одним блоком
Для удобства можно настроить все заголовки в одном блоке конфигурации:
<IfModule mod_headers.c> # Защита от XSS Header always set X-XSS-Protection "1; mode=block" # Запрет MIME-сниффинга Header always set X-Content-Type-Options "nosniff" # Защита от clickjacking Header always set X-Frame-Options "SAMEORIGIN" # Настройка реферера Header always set Referrer-Policy "strict-origin-when-cross-origin" # Content Security Policy Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline' https://trusted-cdn.com;" # Ограничение доступа к API Header always set Permissions-Policy "geolocation=(self), microphone=(), camera=()" # HSTS Header always set Strict-Transport-Security "max-age=31536000" env=HTTPS # Удаление ненужных заголовков Header unset X-Powered-By Header unset Server </IfModule>
Проверка настроенных заголовков
После настройки важно проверить, корректно ли отправляются заголовки:
# Проверка с помощью curl curl -I https://example.com # Использование онлайн-сервисов # https://securityheaders.com/ # https://observatory.mozilla.org/
Важно!
Неправильно настроенный Content-Security-Policy может нарушить работу вашего сайта. Всегда начинайте с режима отчётов (Content-Security-Policy-Report-Only) и постепенно добавляйте ограничения, тщательно тестируя сайт после каждого изменения.
Заключение
Обеспечение безопасности Apache HTTP Server — это комплексная задача, требующая внимания к множеству аспектов конфигурации, регулярного мониторинга и своевременных обновлений. В этой статье мы рассмотрели основные подходы к защите вашего веб-сервера от наиболее распространенных угроз.
Вот краткий чек-лист ключевых мер безопасности для Apache:
- Своевременное обновление — регулярно обновляйте Apache и все модули до последних версий
- Минимизация поверхности атаки — отключайте ненужные модули и функциональность
- Сокрытие информации о сервере — скрывайте версии и конфигурацию Apache
- Правильный контроль доступа — настраивайте ограничения на уровне файлов, директорий и IP-адресов
- Использование WAF — внедряйте ModSecurity с OWASP Core Rule Set
- Защита SSL/TLS — настраивайте современные протоколы и шифры
- Управление правами файлов — соблюдайте принцип наименьших привилегий
- Защита от DoS-атак — используйте mod_evasive, mod_qos и другие инструменты
- Мониторинг и логирование — настраивайте подробное логирование и анализируйте его
- HTTP-заголовки безопасности — защищайте от атак на стороне клиента
Помните, что безопасность — это непрерывный процесс, а не конечное состояние. Регулярный аудит, обновление защитных мер и отслеживание новых уязвимостей должны стать частью вашей рутинной работы с Apache.
Кроме того, не полагайтесь только на безопасность сервера — обеспечьте также безопасность приложений, выполняющихся на Apache, и регулярно проводите тестирование на проникновение для выявления возможных уязвимостей.
Заключительный совет
Документируйте все изменения, внесенные в конфигурацию Apache, и храните эту документацию в безопасном месте. В случае компрометации сервера или при необходимости восстановления такая документация будет бесценна. Кроме того, создайте скрипты автоматизации для развертывания сервера с одинаковыми настройками безопасности на разных системах.
Роман Сидоров
11 февраля 2025Спасибо за детальную статью! Особенно полезным нашел раздел о ModSecurity — внедрил на свой сервер и сразу увидел множество попыток атак в логах, о которых даже не подозревал. Будет здорово, если в следующей статье вы подробнее расскажете о настройке правил ModSecurity для конкретных CMS вроде WordPress или Drupal.