На этой странице описаны ошибки модуля ModSecurity под веб-сервером Apache и способы их устранения, а также различные проблемы связанные с использованием Mod_Security
ModSecurity: collections_remove_stale: Failed to access DBM file
Интересная ошибка mod_security, так сразу, с разбега, её локализировать и не получилось...
less /var/log/httpd/error_log|grep remove_stale # or less /var/log/apache2/error.log|grep remove_stale
[Fri Sep 06 01:10:49 2013] [error] [client 199.30.24.132] ModSecurity: collectio
ns_remove_stale: Failed to access DBM file "/tmp//ip": Permission denied [hostna
me "example.com"] [uri "/fcgi-bin/php-fcgi-wrapper/index.php"] [unique_id "
UijzWF2qgHIAAFki1-0AAAAE"]
[Fri Sep 06 14:03:43 2013] [error] [client 176.137.161.136] ModSecurity: collect
ions_remove_stale: Failed to access DBM file "/tmp//global": Permission denied [
hostname "example.com"] [uri "/fcgi-bin/php-fcgi-wrapper/index.php"] [uniqu
e_id "Uimofl2qgHIAAFy2SagAAAAF"]
Указание полного пути к каталогу /tmp в директиве SecDataDir и SecTmpDir может и нерешить проблему:
vi /etc/httpd/conf.d/00_mod_security.conf ... SecDataDir /tmp SecTmpDir /tmp
Смена владельца каталога /tmp/ на nobody также недаст желаемого результата. Владельцем каталога /tmp/ по умолчанию является "chown -R root:root /tmp" и правами на выполнение/запись для всех "chmod 0777 /tmp"
Создание отдельного каталога с установкой прав и явным указанием полного пути к каталогу в директиве SecDataDir и SecTmpDir также может нерешить проблему
mkdir /var/log/httpd/mod_security /var/log/httpd/mod_security/data chown -R apache:apache /var/log/httpd/mod_security chmod -R 0777 /var/log/httpd/mod_security vi /etc/httpd/conf.d/00_mod_security.conf
Кому-то якобы помогало решить проблему "ModSecurity: collections_remove_stale: Failed to access DBM file" созданием директории tmp в chroot директории:
# Нужно создать директорию tmp в chroot директории сервера # Обычно это /var/www/ или /var/apache2/ mkdir /var/www/tmp # Установить владельцем каталога, пользователя под которым # изначально запускается сервер, обычно apache или www-data chown -R apache:apache /var/www/tmp # Дать разрешение на выполнение/запись для всех, кроме публичных chmod -R 770 /var/www/tmp # Или создать символьную ссылку (ака Symbolic link) ln -s /tmp /var/www/tmp # Перезапустить сервер apachectl graceful
Собственно решение проблемы в моём случае было такое:
По ошибке "ModSecurity: collections_remove_stale: Failed to access DBM file" есть ещё некоторые размышления, но мне лично они непригодились:
Если все хорошо, то ошибки mod_security "ModSecurity: collections_remove_stale: Failed to access DBM file" в логфайлах быть недолжно, а в каталоге /tmp должны быть файлы: global.pag, ip.pag, global.dir и ip.dir
Если в системе установлена SELinux, то нужно попробовать отклюить её:
$ setenforce 0 или $ echo 0 > /selinux/enforce
Если после отключения SELinux проблема решена, значит создадим правило и снова включим SELinux:
$ chcon -R system_u:object_r:httpd_sys_content_t /path/to/modsec_storage $ setenforce 1 или $ echo 1 > /selinux/enforce
Если ничего не помогло, то последнее, что можно сделать это отключить правила связанные со сбором IP: 900050, 900018, 900020, 900021
SecRuleRemoveById not allowed here
[Sun Sep 08 13:30:30 2013] [alert] [client 98.135.221.142] /var/www/public_h
tml/.htaccess: SecRuleRemoveById not allowed here, referer: http://example.
com/index.php
Ошибка mod_security "SecRuleRemoveById not allowed here" возникает только при исполнении PHP файлов, при открытии ХТМЛ файлов эта ошибка обычно не проявляется.
Использование директив mod_security в файле .htaccess разрешено только в том случае, если во время компиляции модуля .htaccess был указан флаг --enable-htaccess-config и если он был действительно указан, то в .htaccess можно будет использовать такие директивы mod_security
- SecAction
- SecRule
- SecRuleRemoveByMsg
- SecRuleRemoveByTag
- SecRuleRemoveById
- SecRuleUpdateActionById
- SecRuleUpdateTargetById
- SecRuleUpdateTargetByTag
- SecRuleUpdateTargetByMsg
На практике большая часть модулей mod_security, доступных из различных репозиториев, компилируется без указания --enable-htaccess-config, например mod_security из репозитория atomic
ModSecurity: Execution error - PCRE limits exceeded
8b022e38e8 [id "981256"][file "/etc/httpd/modsecurity.d/activated_rules/modsecur
ity_crs_41_sql_injection_attacks.conf"][line "232"] - Execution error - PCRE lim
its exceeded (-8): (null). [hostname "example.com"] [uri "/forum"] [unique_id "U
im3j12qg3EAABGaVwoAAAAI"]
PCRE (Perl Compatible Regular Expressions) — библиотека, которая реализует работу регулярных выражений в стиле Perl, но с некоторыми отличиями.
Лимит для ModSecurity "PCRE limits" можно изменить следующим образом:
vi /etc/httpd/modsecurity.d/modsecurity.conf # PCRE Tuning # We want to avoid a potential RegEx DoS condition # SecPcreMatchLimit 1000 SecPcreMatchLimitRecursion 1000 apachectl graceful
Изменять лимит ModSecurity "PCRE limits" выше значения по умолчанию нерекомендуется! Значение по умолчанию для SecPcreMatchLimit и SecPcreMatchLimitRecursion = 1500.
Ошибка "ModSecurity: Execution error - PCRE limits exceeded" часто может возникать из-за неправильно составленных правил или например из-за того, что версия правил устаревшая и не соответствует версии самого модуля mod_security.
Другими словами если версия mod_security 2.7.5, а версия правил 2.2.6, то нам явно нужно обновить правила mod_security до версии 2.2.8, здесь читаем список изменений в правилах owasp-modsecurity-crs
После загрузки и распаковки/обновления правил также рекомендуется обновить и modsecurity_crs_10_setup.conf:
wget -O master.zip https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/master.zip unzip master.zip rm master.zip cp -Rf owasp-modsecurity-crs-master/* /etc/httpd/modsecurity.d/ rm -Rf owasp-modsecurity-crs-master cd /etc/httpd/modsecurity.d/ cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf ln -s /etc/httpd/modsecurity.d/modsecurity_crs_10_setup.conf \ /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_10_setup.conf for f in `ls base_rules` ; do ln -s /etc/httpd/modsecurity.d/base_rules/$f \ /etc/httpd/modsecurity.d/activated_rules/$f ; done ls -l activated_rules
Ссылки по теме:
Есть ошибка модуля ModSecurity, но нет решения, тогда пишем в комментарии...