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 необходимо найти баланс между безопасностью и производительностью:

Слишком низкое значение MaxClients может вызвать отказ при пиковых нагрузках
Слишком низкий Timeout может разорвать легитимные медленные соединения
Слишком строгие LimitRequestBody могут блокировать загрузку легитимных больших файлов

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 важно найти баланс между безопасностью и производительностью:

Слишком агрессивные настройки mod_evasive могут блокировать легитимных пользователей
Слишком низкие значения LimitRequestBody могут мешать загрузке легитимных больших файлов
Слишком короткий KeepAliveTimeout снижает эффективность для мобильных пользователей

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:

  1. Своевременное обновление — регулярно обновляйте Apache и все модули до последних версий
  2. Минимизация поверхности атаки — отключайте ненужные модули и функциональность
  3. Сокрытие информации о сервере — скрывайте версии и конфигурацию Apache
  4. Правильный контроль доступа — настраивайте ограничения на уровне файлов, директорий и IP-адресов
  5. Использование WAF — внедряйте ModSecurity с OWASP Core Rule Set
  6. Защита SSL/TLS — настраивайте современные протоколы и шифры
  7. Управление правами файлов — соблюдайте принцип наименьших привилегий
  8. Защита от DoS-атак — используйте mod_evasive, mod_qos и другие инструменты
  9. Мониторинг и логирование — настраивайте подробное логирование и анализируйте его
  10. HTTP-заголовки безопасности — защищайте от атак на стороне клиента

Помните, что безопасность — это непрерывный процесс, а не конечное состояние. Регулярный аудит, обновление защитных мер и отслеживание новых уязвимостей должны стать частью вашей рутинной работы с Apache.

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

Заключительный совет

Документируйте все изменения, внесенные в конфигурацию Apache, и храните эту документацию в безопасном месте. В случае компрометации сервера или при необходимости восстановления такая документация будет бесценна. Кроме того, создайте скрипты автоматизации для развертывания сервера с одинаковыми настройками безопасности на разных системах.

Похожие статьи

Прочитать статью об Nginx vs Apache

Настройка SSL/TLS в Nginx и современные методы шифрования

15 февраля 2025 Читать →
Прочитать статью об Nginx vs Apache

Apache vs Nginx: Сравнение производительности и безопасности

25 января 2025 Читать →
Прочитать статью об Nginx vs Apache

Обнаружение и предотвращение взломов Linux-сервера

10 марта 2025 Читать →

Комментарии

Оставить комментарий

3 комментария

Р

Роман Сидоров

11 февраля 2025

Спасибо за детальную статью! Особенно полезным нашел раздел о ModSecurity — внедрил на свой сервер и сразу увидел множество попыток атак в логах, о которых даже не подозревал. Будет здорово, если в следующей статье вы подробнее расскажете о настройке правил ModSecurity для конкретных CMS вроде WordPress или Drupal.

К

Кирилл Анатольев

12 февраля 2025

Отличная статья! Я только начинаю изучать администрирование Apache, и информация о правильной настройке прав доступа и HTTP-заголовков безопасности очень пригодилась. Вопрос: что лучше использовать для многопользовательского хостинга — mod_ruid2 или mod_suexec? Какие преимущества у каждого решения?

М

Мария Васильева

14 февраля 2025

Статья очень полезная, но на практике некоторые заголовки безопасности могут конфликтовать с работой фронтенд-фреймворков. Например, CSP с запретом инлайн-скриптов часто ломает React или Angular. Было бы здорово добавить примеры настроек для популярных фреймворков, учитывающие реальные потребности разработки.