Перед тем как начать я приведу некоторые базовые настройки сервера:

  • Директория Document root: /var/www/html или /var/www
  • Основной файл настроек: /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora) или /etc/apache/apache2.conf (Debian/Ubuntu).
  • HTTP порт по умолчанию: 80 TCP
  • HTTPS порт по умолчанию: 443 TCP
  • Access Log веб сервера: /var/log/httpd/access_log
  • Error Log веб сервера: /var/log/httpd/error_log

Проверьте свои настройки файла конфигурации и синтаксиса: httpd -t или sudu apachectl -t

Скрываем версию Apache и подпись ОС со страниц ошибок

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

Это одна из основных угроз безопасности для веб-сервера, а также для самой ОС. Злоумышленник может воспользоваться этой лазейкой для взлома сервера. Исправим это. Чтобы запретить отображать эту информацию, необходимо внести небольшие изменения в основном (главном) конфигурационном файле Apache.

Откройте файл конфигурации с помощью редактора vim.

Для RHEL/CentOS/Fedora:

vim /etc/httpd/conf/httpd.conf

Для Debian/Ubuntu:

vim /etc/apache/apache2.conf

Найдите строку ServerSignature и замените ее значение на Off.

ServerSignature Off

Так же найдите строку ServerTokens и установите для нее значение Prod

ServerTokens Prod

Таким простым образом мы отключили вывод подписи ОС сервера и Apache.

Чтобы изменения вступили в силу, нужно перезапустить Apache.

Перезапуск Apache для RHEL/CentOS/Fedora:

service httpd restart

Перезапуск Apache для Debian/Ubuntu:

service apache2 restart

Готово.

Отключаем вывод списка файлов в директории

По умолчанию Apache выводит все содержимое корневой директории при отсутствии индексного файла или запрета в файле .htaccess.

И так, исправить это мы можем с помощью директивы Options, которую нужно отключить в файле конфигурации для конкретного каталога. Для этого нам нужно сделать запись в файле httpd.conf или apache2.conf:

<Directory /var/www/html>
    Options -Indexes
</Directory>

Готово.

Регулярно обновляйте Apache

Разработчики Apache постоянно работают над обеспечением безопасности и выпускают обновление с новыми параметрами безопасности. Поэтому рекомендуется использовать последнюю версию Apache в качестве веб-сервера.

Проверить версию Apache можно с помощью следующей команды:

httpd -v

Обновить версию можно с помощью следующей команды.

Обновление Apache для RHEL/CentOS/Fedora

yum update httpd

Обновление Apache для Debian/Ubuntu

apt-get install apache2

Так же рекомендуется обновлять ядро и версию ОС до последних стабильных релизов. Исключением может быть случай, когда вы используете приложение, которое работает только на конкретном ядре или версии ОС.

Отключаем ненужные модули

Модули, которые вы не используете в настоящее время лучше всего отключить, чтобы уменьшить шансы стать жертвой веб-атаки через ненужный модуль. Получить список скомпилированных модулей веб-сервера можно с помощью следующей команды:

grep LoadModule /etc/httpd/conf/httpd.conf

Для отключения модуля его необходимо закомментировать с помощью #.

Отключить можно следующие модули:

# LoadModule auth_basic_module modules/mod_auth_basic.so
# LoadModule auth_digest_module modules/mod_auth_digest.so
# LoadModule authn_file_module modules/mod_authn_file.so
# LoadModule authn_anon_module modules/mod_authn_anon.so
# LoadModule authn_dbm_module modules/mod_authn_dbm.so
# LoadModule authn_default_module modules/mod_authn_default.so
# LoadModule authz_owner_module modules/mod_authz_owner.so
# LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
# LoadModule authz_dbm_module modules/mod_authz_dbm.so
# LoadModule authz_default_module modules/mod_authz_default.so
# LoadModule include_module modules/mod_include.so
# LoadModule env_module modules/mod_env.so
# LoadModule mime_magic_module modules/mod_mime_magic.so
# LoadModule deflate_module modules/mod_deflate.so
# LoadModule usertrack_module modules/mod_usertrack.so
# LoadModule dav_module modules/mod_dav.so
# LoadModule status_module modules/mod_status.so
# LoadModule info_module modules/mod_info.so
# LoadModule dav_fs_module modules/mod_dav_fs.so
# LoadModule speling_module modules/mod_speling.so
# LoadModule userdir_module modules/mod_userdir.so
# LoadModule proxy_module modules/mod_proxy.so
# LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
# LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
# LoadModule proxy_http_module modules/mod_proxy_http.so
# LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
# LoadModule proxy_connect_module modules/mod_proxy_connect.so
# LoadModule cache_module modules/mod_cache.so
# LoadModule disk_cache_module modules/mod_disk_cache.so
# LoadModule cgi_module modules/mod_cgi.so

Но после отключения обязательно протестируйте работу сервера без отключенного модуля.

Запуск Apache как отдельный пользователь и группа

После установки Apache запускает свой процесс по умолчанию под пользователем nobody или demon. Из соображений безопасности лучше запускать Apache в своем непривилегированном пользователе. Например: http-web.

Создаем пользователя и группу для Apache

groupadd http-web
useradd -d /var/www/ -g http-web -s /bin/nologin http-web

Теперь нужно поменять пользователя и группу для Apache: откройте файл /etc/httpd/conf/httpd.conf и смените пользователя и группу:

User http-web
Group http-web

Чтобы изменения вступили в силу необходимо и перезапустить службу.

Используйте Allow и Deny для ограничения доступа к каталогам

Ограничить доступ к каталогам можно с помощью опции Allow и Deny в файле httpd.conf. Обеспечим безопасность корневого каталога, для этого, установим следующие данные в файле httpd.conf:

<Directory />
    Options None
    Order deny,allow
    Deny from all
</Directory>
  • None - позволит пользователям включать любые дополнительные функции.
  • Order deny, allow - порядок, в котором директивы deny и allow будут обработаны. Сначала запрещаем, а затем разрешаем.
  • Deny from all - отклонить запрос от всех к корневому каталогу, никто не сможет получить доступ к корневой директории.

Обеспечение безопасности Apache с помощью mod_security

mod_security работает как фаервол и позволяет отслеживать трафик в реальном времени. Также, mod_security содержит набор базовых правил фильтрации Core Rule Set, в которые входят правила для защиты от SQL инъекций, межсайтового скриптинга, троянов, ботов, захватов сеанса и многих других атак и взломов.

Установка mod_security на Ubuntu/Debian

sudo apt-get install libapache2-modsecurity
sudo a2enmod mod-security
sudo /etc/init.d/apache2 force-reload

Установка mod_security на RHEL/CentOS/Fedora

yum install mod_security
/etc/init.d/httpd restart

Отключаем символические ссылки для Apache

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

Options -FollowSymLinks

Чтобы разрешить символические ссылки для конкретного сайта нужно просто добавить правило в файле .htaccess этого сайта:

# Enable symbolic links
Options +FollowSymLinks

Чтобы разрешить правила перезаписи внутри .htaccess, в основном конфигурационном файле должна быть запись AllowOverride All.

Выключаем Server Side Includes и выполнение CGI

Мы можем отключить Server Side Includes (mod_include) и выполнение CGI, если это нам не нужно, для этого необходимо изменить основной конфигурационный файл:

Options -Includes
Options -ExecCGI

Так же можно отключить это для конкретного каталога. Для этого используется тег Directory. Для примера отключим Server Side Includes и CGI для каталога /var/www/html/site:

<Directory "/var/www/html/site">
    Options -Includes -ExecCGI
</Directory>

Так же с помощью директивы Options можно включить или выключить следующее:

  • Options All - включить все (значение по умолчанию).
  • Options IncludesNOEXEC - позволяет выполнять CGI скрипты и файлы.
  • Options SymLinksIfOwnerMatch - похоже на FollowSymLinks, но будет работать только тогда, когда владелец один и тот же между исходной директории и ссылко с которой она связана.

Ограничение размера запроса

По умолчанию Apache не имеет ограничений на размер HTTP запроса, т.о. когда разрешены большие запросы к веб-серверу, то есть большая доля вероятности, что сервер может стать жертвой атак и в итоге вы получите отказа в обслуживании из-за перегрузки сервера. Чтобы избежать этого можно ограничить размер запросов с помощью Apache директивы LimitRequestBody с тегом каталога:

<Directory "/var/www/site/uploads">
    LimitRequestBody 512000
</Directory>

Включение логирования Apache

Apache позволяет вести логирование независимо от вашей операционной системы. Целесообразно включить логирование Apache, поскольку оно предоставляет больше информации.

Для этого вам необходимо включить модуль mod_log_config. Рассмотрим 3 основные директивы mod_log_config.

  • TransferLog - создание файла журнала.
  • LogFormat - установить пользовательский формат.
  • CustomLog - создание и форматирование файла лога.

Это можно использовать как для всего сервера, так и для отдельного файла. Для этого вам необходимо указать его в секции виртуального хоста. Например:

<VirtualHost *:80>
    DocumentRoot /var/www/html/mysite.com/
    ServerName www.mysite.com
    DirectoryIndex index.htm index.html index.php
    ServerAlias mysite.com
    ErrorDocument 404 /error404.php
    ErrorLog /var/log/httpd/mysite.com_error_log
    CustomLog /var/log/httpd/mysite.com_access_log combined
</VirtualHost>

Защита Apache с помощью SSL сертификата

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

О том как установить SSL сертификат на сервер и включить на сайте описано здесь: