Сегодня будем нахлобучивать mod_security на Apache 2 в CentOS. Мало просто тупо установить mod_security на Apache 2, нужно ещё подключить правила, потом проверить доступ ко всем частям сайта в режиме "SecRuleEngine DetectionOnly" и уже потом переходить в режим "SecRuleEngine on" защиты.
Что такое mod_security и с чем его едят долго рассказывать не нужно - это типа брандмауэр для серванта, нахлобучиваем (т.е. устанавливаем:) mod_security на Apache 2:
yum install mod_security Loaded plugins: downloadonly, fastestmirror, priorities Loading mirror speeds from cached hostfile * atomic: www7.atomicorp.com * base: mirror.majorhost.net * epel: mirror.xfes.ru * extras: mirror.majorhost.net * rpmforge: archive.cs.uu.nl * updates: mirror.majorhost.net 408 packages excluded due to repository priority protections Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package mod_security.x86_64 0:2.7.2-13.el6.art will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: mod_security x86_64 2.7.2-13.el6.art atomic 167 k Transaction Summary ================================================================================ Install 1 Package(s) Total download size: 167 k Installed size: 438 k Is this ok [y/N]: y Downloading Packages: mod_security-2.7.2-13.el6.art.x86_64.rpm | 167 kB 00:01 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : mod_security-2.7.2-13.el6.art.x86_64 1/1 Verifying : mod_security-2.7.2-13.el6.art.x86_64 1/1 Installed: mod_security.x86_64 0:2.7.2-13.el6.art Complete!
После установки модуля в каталоге /etc/httpd/conf.d/ получаем конф файл mod_security.conf или /etc/httpd/conf.d/00_mod_security.conf
less /etc/httpd/conf.d/00_mod_security.conf # ASL mod_security Template: /var/asl/data/templates/template-00_mod_security.co nf # LoadModule security2_module modules/mod_security2.so LoadModule unique_id_module modules/mod_unique_id.so # <IfModule mod_security2.c> # Basic configuration goes in here Include modsecurity.d/tortix_waf.conf # Rule management is handled by ASL Include modsecurity.d/00*exclude.conf Include modsecurity.d/*asl*.conf Include modsecurity.d/99*exclude.conf </IfModule>
И пустой tortix_waf.conf в каталоге /etc/httpd/modsecurity.d/, документация умалчивает о том, какая миссия на него (tortix_waf.conf) возложена - мы на него просто забьем!
ASL это типа "Rule Updater" для специфической среды вроде контрольных панелей ака cpanel или directadmin:
Rule Updater (ASL-Lite)
Install just the rules. ASL Lite is a free lightweight rule updater project designed specifically as an atomicorp.com mod_security rule downloader for custom apache environments, control panel software like cpanel and directadmin, or non-apache/mixed web server implementations.
ASL Lite is a free unsupported lightweight rule updater project designed specifically as an atomicorp.com mod_security rule downloader for custom apache environments or non-apache/mixed web server implementations.
ASL и ASL-Lite доступны как в репозиториях (asl.x86_64, asl-lite.x86_64), так и на сайте http://www.atomicorp.com/, инструкции по установке по этому адресу http://www.atomicorp.com/wiki/index.php/ASL_Lite
Это ещё не всё, модуль mod_security уже установлен, но к нему пока ещё нет правил. Теперь Устанавливаем базовый набор правил mod_security_crs (Core Rule Set) и/или расширенный набор mod_security_crs-extras:
yum install mod_security_crs Loaded plugins: downloadonly, fastestmirror, priorities Loading mirror speeds from cached hostfile * atomic: www7.atomicorp.com * base: mirror.majorhost.net * epel: mirror.xfes.ru * extras: mirror.majorhost.net * rpmforge: archive.cs.uu.nl * updates: mirror.majorhost.net 408 packages excluded due to repository priority protections Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package mod_security_crs.noarch 0:2.2.6-3.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: mod_security_crs noarch 2.2.6-3.el6 epel 92 k Transaction Summary ================================================================================ Install 1 Package(s) Total download size: 92 k Installed size: 365 k Is this ok [y/N]: y Downloading Packages: mod_security_crs-2.2.6-3.el6.noarch.rpm | 92 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : mod_security_crs-2.2.6-3.el6.noarch 1/1 Verifying : mod_security_crs-2.2.6-3.el6.noarch 1/1 Installed: mod_security_crs.noarch 0:2.2.6-3.el6 Complete!
После установки mod_security_crs получаем каталог /etc/httpd/modsecurity.d/activated_rules с базовыми правилами, которые уже установлены, но пока не подключены:
ls /etc/httpd/modsecurity.d/activated_rules modsecurity_35_bad_robots.data modsecurity_35_scanners.data modsecurity_40_generic_attacks.data modsecurity_41_sql_injection_attacks.data modsecurity_50_outbound.data modsecurity_50_outbound_malware.data modsecurity_crs_20_protocol_violations.conf modsecurity_crs_21_protocol_anomalies.conf modsecurity_crs_23_request_limits.conf modsecurity_crs_30_http_policy.conf modsecurity_crs_35_bad_robots.conf modsecurity_crs_40_generic_attacks.conf modsecurity_crs_41_sql_injection_attacks.conf modsecurity_crs_41_xss_attacks.conf modsecurity_crs_42_tight_security.conf modsecurity_crs_45_trojans.conf modsecurity_crs_47_common_exceptions.conf modsecurity_crs_48_local_exceptions.conf.example modsecurity_crs_49_inbound_blocking.conf modsecurity_crs_50_outbound.conf modsecurity_crs_59_outbound_blocking.conf modsecurity_crs_60_correlation.conf
В каталоге /etc/httpd/modsecurity.d/ также появится файл modsecurity_crs_10_config.conf, который содержит важные управляющие функции для подключаемых CRS правил (less /usr/share/doc/mod_security_crs-2.2.6/INSTALL), который также как и базовые правила из /etc/httpd/modsecurity.d/activated_rules не подключен к модулю по умолчанию.
Установим дополнительные правила mod_security_crs-extras, пусть будут на всяк случай:
yum install mod_security_crs-extras Loaded plugins: downloadonly, fastestmirror, priorities Loading mirror speeds from cached hostfile * atomic: www7.atomicorp.com * base: mirror.yandex.ru * epel: mirror.xfes.ru * extras: mirror.yandex.ru * rpmforge: archive.cs.uu.nl * updates: mirror.yandex.ru 408 packages excluded due to repository priority protections Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package mod_security_crs-extras.noarch 0:2.2.6-3.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: mod_security_crs-extras noarch 2.2.6-3.el6 epel 134 k Transaction Summary ================================================================================ Install 1 Package(s) Total download size: 134 k Installed size: 1.9 M Is this ok [y/N]: y Downloading Packages: mod_security_crs-extras-2.2.6-3.el6.noarch.rpm | 134 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : mod_security_crs-extras-2.2.6-3.el6.noarch 1/1 Verifying : mod_security_crs-extras-2.2.6-3.el6.noarch 1/1 Installed: mod_security_crs-extras.noarch 0:2.2.6-3.el6 Complete!
После установки самого модуля mod_security и его правил mod_security_crs и mod_security_crs-extras, все доступные для использования правила мы найдём в каталоге /usr/lib/modsecurity.d/:
ls -la /usr/lib/modsecurity.d/ total 24 drwxr-xr-x 6 root root 4096 Feb 4 16:48 . dr-xr-xr-x 26 root root 4096 Feb 4 16:24 .. drwxr-xr-x 2 root root 4096 Feb 4 16:24 base_rules drwxr-xr-x 2 root root 4096 Feb 4 16:48 experimental_rules drwxr-xr-x 2 root root 4096 Feb 4 16:48 optional_rules drwxr-xr-x 2 root root 4096 Feb 4 16:48 slr_rules
Правила /etc/httpd/modsecurity.d/activated_rules и /usr/lib/modsecurity.d/base_rules являются одними и теми же правилами. Возможно в будущем нам пригодятся ещё и правила из каталога /usr/lib/modsecurity.d/slr_rules (SpiderLabs Research (SLR) rules) - копируем cp -R /usr/lib/modsecurity.d/slr_rules /etc/httpd/modsecurity.d/
Теперь, что нам осталось сделать - это скопировать и подключить основной файл настроек modsecurity.conf-recommended, базовый файл обработки правил modsecurity_crs_10_config.conf и собственно сами правила из каталога /etc/httpd/modsecurity.d/activated_rules, для чего модифицируем главный конфиг файл модуля mod_security, в нашем случае /etc/httpd/conf.d/00_mod_security.conf (или /etc/httpd/conf.d/mod_security.conf), примерно до такой кондиции:
Только после полного отключения блокировщика скриптов и рекламы на этом месте появится полезная подсказка/ссылка/код/пример конфигурации/etc!
В /etc/httpd/modsecurity.d/modsecurity.conf по умолчанию установлен тестовый режим "SecRuleEngine DetectionOnly" и только после успешной проверки доступа к сайту рекомендуется устанавливать в "SecRuleEngine On", но об этом позже, а пока проверяем конфиги и перезапускаем апач:
httpd -t Syntax OK apachectl graceful # or service httpd restart tail -f /var/log/httpd/error_log # or less /var/log/httpd/error_log
Если видим мессаги примерно такого же содержания как показано ниже, то значит всё гуд:
[Mon Feb 04 18:39:43 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin /suexec) [Mon Feb 04 18:39:44 2013] [notice] SSL FIPS mode disabled [Mon Feb 04 18:39:44 2013] [notice] ModSecurity for Apache/2.7.2 (http://www.mod security.org/) configured. [Mon Feb 04 18:39:44 2013] [notice] ModSecurity: APR compiled version="1.3.9"; l oaded version="1.3.9" [Mon Feb 04 18:39:44 2013] [notice] ModSecurity: PCRE compiled version="7.8 "; l oaded version="7.8 2008-09-05" [Mon Feb 04 18:39:44 2013] [notice] ModSecurity: LUA compiled version="Lua 5.1" [Mon Feb 04 18:39:44 2013] [notice] ModSecurity: LIBXML compiled version="2.7.6" [Mon Feb 04 18:39:45 2013] [notice] SSL FIPS mode disabled [eAccelerator] This build of "eAccelerator" was compiled for PHP version 5.3.18. Rebuild it for your PHP version (5.3.21) or download precompiled binaries. [Mon Feb 04 18:39:45 2013] [notice] Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/ 1.0.0-fips mod_fcgid/2.3.7 PHP/5.3.21 configured -- resuming normal operations
Настройка и проверка mod_security
Теперь нужно проверить mod_security на ложные срабатывания, которые будут обязательно и привести настройки в /etc/httpd/modsecurity.d/modsecurity.conf под условия работы нашего серванта. Если используются движки с многими параметрами в строке запроса, то ложных срабатываний mod_security может выдавать довольно большое количество.
Как ранее упоминалось, первоначальное тестирование желательно проводить в режиме "SecRuleEngine DetectionOnly" (/etc/httpd/modsecurity.d/modsecurity.conf), а уже потом, когда все возможные ложные срабатывания модуля mod_security устранены, переводить mod_security в режим "SecRuleEngine On".
В ходе проверки ложных срабатываний модуля mod_security и его более тонкой настройки нам придется редактировать файлы и выполнять некие команды:
vi /etc/httpd/conf.d/00_mod_security.conf vi /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf vi /etc/httpd/modsecurity.d/modsecurity.conf rm /var/log/modsec_audit.log service httpd restart rm -R /var/cache/nginx/pagecache/* less /var/log/modsec_audit.log
Больше всего ложных срабатываний модуля mod_security пришлось на правила из файла /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf, которые идентифицировали обращение к странице, содержащей в своём адресе параметр "id=122%253A", как "Restricted SQL Character Anomaly Detection Aler". Ниже перечислены правила mod_security которые нам пришлось отключить для доступа к страницам сайта пользователей и некоторых специфических поисковых роботов, а также ниже приводятся краткие пояснения причин/условий их срабатывания:
/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_20_protocol_violations.conf [line "464"] [id "950109"] - Multiple URL Encoding Detected /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_21_protocol_anomalies.conf [line "47"] [id "960015"] - Request Missing an Accept Header [line "66"] [id "960009"] - Request Missing a User Agent Header [line "98"] [id "960017"] - Host header is a numeric IP address /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_40_generic_attacks.conf [line "182"] [id "950000"] - Session Fixation [line "176"] [id "950003"] - Session Fixation /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf [line "49"] [id "981231"] - SQL Comment Sequence Detected. [line "64"] [id "981318"] - SQL Injection Attack: Common Injection Testing Detected [line "116"] [id "950007"] - Blind SQL Injection Attack [line "154"] [id "960024"] - Restricted SQL Character Anomaly Detection Aler [line "168"] [id "981172"] - Restricted SQL Character Anomaly Detection Aler [line "170"] [id "981173"] - Restricted SQL Character Anomaly Detection Aler [line "220"] [id "981257"] - Detects MySQL comment-/space-obfuscated injections and backtick termination [line "254"] [id "981247"] - Execution error - PCRE limits exceeded [line "256"] [id "981243"] - Detects classic SQL injection probings 2/2 /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_xss_attacks.conf [line "289"] [id "973302"] - Execution error - PCRE limits exceeded /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_60_correlation.conf [line "33"] [id "981203"] - Inbound Anomaly Score (Total Inbound Score: 3, SQLi=1, XSS=): Restricted SQL Character Anomaly Detection Alert [line "37"] [id "981204"] - Inbound Anomaly Score Exceeded (Total Inbound Score: 6, SQLi=1, XSS=): Restricted SQL Character Anomaly Detection Alert
Правила из modsecurity_crs_41_sql_injection_attacks.conf не любят GET запросы в строке которых присутствуют аргументы (ARGS) такого вида id=122%253A:
GET /index.php?option=com_content&view=article&id=129%253Aobnaruzhen-\ novyj-generator-virusov-diy&Itemid=63 HTTP/1.0 Message: [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_20\ _protocol_violations.conf"] [line "464"] [id "950109"] [rev "2"] \ [msg "Multiple URL Encoding Detected"] [severity "WARNING"] [ver \ "OWASP_CRS/2.2.6"] [maturity "6"] [accuracy "8"] [tag "OWASP_CRS/\ PROTOCOL_VIOLATION/EVASION"] Warning. Pattern match "\\%((?!$|\\W)|\ [0-9a-fA-F]{2}|u[0-9a-fA-F]{4})" at ARGS:id. Message: [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql\ _injection_attacks.conf"] [line "170"] [id "981173"] [rev "2"] [msg "Restricted \ SQL Character Anomaly Detection Alert - Total # of special characters exceeded"] \ [data "Matched Data: - found within ARGS:id: 129:obnaruzhen-novyj-generator-\ virusov-diy"] [ver "OWASP_CRS/2.2.6"] [maturity "9"] [accuracy "8"] Warning. \ Pattern match "([\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)\\-\\+\\=\\{\\}\\[\\]\\|\\:\\;\"\\ xc2\xb4\\\xe2\x80\x99\\\xe2\x80\x98\\`\\<\\>].*?){4,}" at ARGS:id. ------------------ GET /index.php?option=com_jcomments&task=rss&object_id=53&object_group=com_conte nt&format=raw HTTP/1.0 Host: remoteshaman.com X-Real-IP: 66.249.75.33 Connection: close Accept: */* From: googlebot(at)googlebot.com User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.h tml) Accept-Encoding: gzip,deflate Message: [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql _injection_attacks.conf"] [line "116"] [id "950007"] [rev "2"] [msg "Blind SQL I njection Attack"] [data "Matched Data: object_id found within ARGS_NAMES:object_ id: object_id"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.6"] [maturity "9"] [ac curacy "8"] [tag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION"] [tag "WASCTC/WASC-19"] [t ag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/CIE1"] [tag "PCI/6.5.2"] Warning. Pa ttern match "(?i:(?:\\b(?:(?:s(?:ys\\.(?:user_(?:(?:t(?:ab(?:_column|le)|rigger) |object|view)s|c(?:onstraints|atalog))|all_tables|tab)|elect\\b.{0,40}\\b(?:subs tring|users?|ascii))|m(?:sys(?:(?:queri|ac)e|relationship|column|object)s|ysql\\ .(db|user))|c(?:onstraint ..." at ARGS_NAMES:object_id. ------------------ ID: 960024 981257 981243 --4baebb79-C-- &option=community&no_html=1&task=azrul_ajax&func=activities,\ ajaxGetActivities&77cab17749effd3b8aabd3de6d2f9a97=1\ &arg2=["_d_",""]&arg3=["_d_","active-profile"]&a rg4=["_d_","64"]&arg5=["_d_","119"]&arg6=["_d_","true"]\ &arg7=["_d_","self"]& --4baebb79-F--
Модулю mod_security не понравилось наличие в строке запроса параметра object_id, который присутствовал в строке /index.php?option=com_jcomments&task=rss&object_id=53&object_group=com_content&format=raw, по этому адресу находится лента комментариев для поста.
В CMS Joomla, да и не только в Joomla, могут быть компоненты/модули использующие ajax обновление данных на странице в реальном времени, как например строка запроса вида "...&arg5=["_d_","119"]&arg6=["_d_","true"]...", что по определению правил mod_security (ID: 960024 981257 981243) считается как "Restricted SQL Character Anomaly Detection Aler", "Detects MySQL comment-/space-obfuscated injections and backtick termination" и "Detects classic SQL injection probings 2/2".
Попытка авторизации на сайте тоже была определена как "SQL Injection Attack: Common Injection Testing Detected" ([line "64"] [id "981318"])
Добавление комментариев через jComments "POST /index.php?option=com_jcomments&tmpl=component HTTP/1.0" тоже считается атакой:))
"NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" Connection: close Content-Type: text/plain; charset="utf-8" --72b5be1a-H-- Message: Rule 7f6ef92c8308 [id "981247"][file "/etc/httpd/modsecurity.d/activate d_rules/modsecurity_crs_41_sql_injection_attacks.conf"][line "254"] - Execution error - PCRE limits exceeded (-8): (null). Message: Rule 7f6ef8e2c7a0 [id "973302"][file "/etc/httpd/modsecurity.d/activate d_rules/modsecurity_crs_41_xss_attacks.conf"][line "289"] - Execution error - PC RE limits exceeded (-8): (null).
Вот так:)...
Строка "totalnoe-keshirovanie-bekenda-na-apache--php-53-aka-fcgi-v-frontende-nginx&catid=59:srvers-common-cat&Itemid=125" попала под паттерн правила ([line "49"] [id "981231"]) "SQL Comment Sequence Detected." из всё того же /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf - вероятно два дефиса "--" стало решающим аргументом для срабатывания этого правила.
Запрещены также попытки обращения по ИП адресу!;(, файл /etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_21_protocol_anomalies.conf, [line "98"] [id "960017"] - Host header is a numeric IP address.
Что же касается правила из modsecurity_crs_21_protocol_anomalies.conf ([line "47"] [id "960015"] - Request Missing an Accept Header), то обычно запросы без заголовка "Accept: */*" встречаются редко и такие запросы считаются необычными но, есть боты которые запрашивая страницу не передают заголовка "Accept: */*", примером такого бота может служить Rambler:
GET /index.php?option=com_content&view=frontpage&format=feed&type=rss HTTP/1.0 Host: itmag.pro X-Real-IP: 81.19.66.131 Connection: close Accept-Encoding: identity User-Agent: StackRambler/2.0 (MSIE incompatible; Top100) ...... Message: [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_21_pro tocol_anomalies.conf"] [line "47"] [id "960015"] [rev "1"] [msg "Request Missing an Accept Header"] [severity "NOTICE"] [ver "OWASP_CRS/2.2.6"] [maturity "9"] [ accuracy "9"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/MISSING_HEADER_ACCEPT"] [tag "W ASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] Warning. Operator EQ matched 0 at REQUEST_HEADERS. Apache-Handler: php5-fcgi Stopwatch: 1360052462980723 55655 (- - -) Stopwatch2: 1360052462980723 55655; combined=49396, p1=2731, p2=46423, p3=1, p4= 221, p5=20, sr=2593, sw=0, l=0, gc=0 Response-Body-Transformed: Dechunked WAF: ModSecurity for Apache/2.7.2 (http://www.modsecurity.org/); OWASP_CRS/2.2.6 ...... >whosip 81.19.66.131 WHOIS Source: RIPE NCC IP Address: 81.19.66.131 Country: Russian Federation Network Name: RAMTEL Owner Name: Rambler main network From IP: 81.19.64.0 To IP: 81.19.66.255 Allocated: Yes Contact Name: Victor Popov Address: Rambler Telecom, 3 floor, Leninskaya Sloboda st., 19, Omega Plaza, Moscow, RU Email: vvp@ramtel.ru Abuse Email: abuse@rambler-co.ru Phone: +7 495 989-2909 Fax: +7 495 989-2908
Гугля может приходить без строки юзверь-агента ([line "66"] [id "960009"] - Request Missing a User Agent Header) с ИП 74.125.18.17 (74.125.0.0-74.125.255.255).
Все те правила модуля mod_security, срабатывания которых в нашем случае можно считать явно ложными нужно отключить, для этого не обязательно лазить в каждый .conf файл правила из /etc/httpd/modsecurity.d/activated_rules и ставить там комментарий "#" перед директивой "SecRule ..."! Для отключения какого-то правила mod_security достаточно в директиве SecRuleRemoveById перечислить через пробел ID тех правил, которые нужно отключить, кажись ранее для отключения правил применялась директива SecFilterRemvoe.
Директива SecRuleRemoveById должна размещается после включения тех правил mod_security, ID которых нужно отключить! В нашем случае конфигурация mod_security будет выглядеть следующим образом:
Только после полного отключения блокировщика скриптов и рекламы на этом месте появится полезная подсказка/ссылка/код/пример конфигурации/etc!
Правила из "modsecurity.d/slr_rules/*.conf" (SpiderLabs Research (SLR) rules) отключены ибо вызывают ошибку "ModSecurity: No action id present within the rule". На оф. сайте производителя сих правил по этому поводу мы создали вопрос "How to enable slr_rules? ModSecurity: No action id present within the rule", но ответа пока нет - будем ждать:)...
Проверку исходящих ответов сервера "SecResponseBodyAccess Off" мы отключили имхо нам ни к чему задержки ответа и дополнительная нагрузка на оперативную память, а также ответ может оказаться больше установленного лимита - короче с исходящими ответами мы решили не паритца.
Проверку же входящих методом POST тоже пришлось "SecRequestBodyAccess Off" отключить потому, что добавляемые на сайт материалы обычно посвящены программированию, сохраняются методом POST и одна из передаваемых переменных "text" часто содержит всяческие символы и знаки постоянно попадающие практически под все шаблоны из modsecurity_crs_40_generic_attacks.conf и modsecurity_crs_41_sql_injection_attacks.conf, ID 950010 950018 950910 950911 950005 950901 981317 ("LDAP Injection Attack", "Execution error - PCRE limits exceeded (-8): (null)", "HTTP Response Splitting Attack", "Remote File Access Attempt", "SQL Injection Attack: SQL Tautology Detected.", SQL SELECT Statement Anomaly Detection Alert), а если мы просто добавим их в исключение, то таким образом мы сделаем уязвимыми для этих типов атак не только область POST запросов, но и область GET запросов - т.е. из двух зол мы выбрали меньшее!
Теперь немного подробнее про настройки /etc/httpd/modsecurity.d/modsecurity.conf. В главном файле modsecurity.conf настройки модуля mod_security есть несколько основных секций - "Rule engine initialization" отвечает за инициализацию/поведение модуля, "Request body handling" отвечает за обработку входящих запросов к серванту, "Response body handling" отвечает за обработку ответов сервера Apache.
- SecRequestBodyAccess - если установлен в Off, то mod_security не будет проверять POST запросы;
- SecRequestBodyLimit - устанавливает максимальный размер запроса в байтах, по умолчанию равен 13107200, для загрузки больших файлов нужно увеличить значение, лучше сразу привести значение этого параметра в соответствие с max_file_size из php.ini;
- SecRequestBodyInMemoryLimit - размер тела запроса который позволено хранить в оперативной памяти, по умолчанию 131072 (128 кб), после превышения этого лимита будет использован жесткий диск. Своего рода системный кэш для mod_security;
- SecResponseBodyAccess - если установлен в Off, то mod_security не будет проверять исходящие ответы сервера, по умолчанию On. Имейте ввиду, что включение этой директивы увеличивает потребление памяти и задержку ответа сервера;
- SecResponseBodyLimit - максимальный размер тела ответа, по умолчанию = 524288 (512 кб)
Жидкая документация по модулю:
/usr/share/doc/mod_security-2.7.2 /usr/share/doc/mod_security_crs-2.2.6 /usr/share/doc/mod_security-2.7.2/CHANGES /usr/share/doc/mod_security-2.7.2/LICENSE /usr/share/doc/mod_security-2.7.2/README.TXT /usr/share/doc/mod_security-2.7.2/doc /usr/share/doc/mod_security-2.7.2/modsecurity.conf-recommended /usr/share/doc/mod_security-2.7.2/doc/README.txt /usr/share/doc/mod_security_crs-2.2.6/CHANGELOG /usr/share/doc/mod_security_crs-2.2.6/INSTALL /usr/share/doc/mod_security_crs-2.2.6/LICENSE /usr/share/doc/mod_security_crs-2.2.6/README.md
ModSecurity есть также и for Nginx только он сейчас пока пребывает в статусе "Beta Release Quality", дождёмся статуса "Stable Release Quality", а потом и на Nginx будем нахлобучивать ModSecurity:)
Краткая расшифровка формата /var/log/modsec_audit.log
Формат файла modsec_audit.log состоит из нескольких разделов, каждый в своём формате. Сепараторы/разделители используются для определения разделов.
Сепаратор/разделитель всегда начинается с новой строки и соответствует следующему формату "--3a36234a-A--":
- "--" - два тире;
- "3a36234a" - уникальный идентификатор, состоящий из нескольких шестнадцатеричных символов;
"-" - одно тире;
"A" - идентификатор раздела, состоящий из одной литинской буквы;
"--" - два тире.
Существуют такие идентификаторы разделов modsec_audit.log:
Только после полного отключения блокировщика скриптов и рекламы на этом месте появится полезная подсказка/ссылка/код/пример конфигурации/etc!
Следующая команда поможет обнаружить самых злостных нарушителей:
less /var/log/modsec_audit.log | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9] {1,3}\.[0-9]{1,3}' | sort | uniq -c 4 217.216.162.213 4 218.104.111.91 70 218.234.77.241 8 218.28.254.77 4 218.65.30.132
Так находим все ИП адреса, сортируем, выбираем и подсчитываем уникальные - нужно принимать во внимание то, что каждый ИП в лог файле упоминается дважды, а значит реальное количество получается делением результата на два, т.е. например 70/2 = 35 попыток с адреса 218.234.77.241.
Следующая команда покажет время когда с адреса 218.234.77.241 были попытки наехать
less /var/log/modsec_audit.log | grep 218.234.77.241 | grep -oE '\[.*\]' [07/Feb/2013:18:39:06 +0200] [07/Feb/2013:18:39:11 +0200] [07/Feb/2013:18:39:28 +0200] [07/Feb/2013:20:00:19 +0200] [07/Feb/2013:20:00:22 +0200] [07/Feb/2013:20:00:24 +0200] [07/Feb/2013:20:00:26 +0200] [07/Feb/2013:20:03:52 +0200] [07/Feb/2013:20:03:54 +0200] [07/Feb/2013:20:03:56 +0200] [07/Feb/2013:20:04:14 +0200] [07/Feb/2013:20:06:17 +0200] [07/Feb/2013:20:06:18 +0200] [07/Feb/2013:20:06:19 +0200] [07/Feb/2013:20:06:20 +0200] [07/Feb/2013:20:08:15 +0200] [07/Feb/2013:20:08:16 +0200] [07/Feb/2013:20:08:17 +0200] [07/Feb/2013:20:08:30 +0200] [07/Feb/2013:20:10:16 +0200] [07/Feb/2013:20:10:17 +0200] [07/Feb/2013:20:10:17 +0200] [07/Feb/2013:20:10:31 +0200] [07/Feb/2013:20:12:32 +0200] [07/Feb/2013:20:12:33 +0200] [07/Feb/2013:20:12:34 +0200] [07/Feb/2013:20:12:47 +0200] [07/Feb/2013:20:14:29 +0200] [07/Feb/2013:20:14:30 +0200] [07/Feb/2013:20:14:31 +0200] [07/Feb/2013:20:14:32 +0200] [07/Feb/2013:20:16:25 +0200] [07/Feb/2013:20:16:31 +0200] [07/Feb/2013:20:16:32 +0200] [07/Feb/2013:20:17:01 +0200]
Более подробную информацию даст команда:
less /var/log/modsec_audit.log | grep 218.234.77.241 -A 13 | more [07/Feb/2013:18:39:06 +0200] URPYql2qgHIAAECq14QAAAAA 218.234.77.241 43044 127.0 .0.1 81 --b68d1c6d-B-- GET /?option=com_customproperties&task=tag&tagId=55&Itemid=91&sa=U&ei=K9 gTUcrGIpHxiQKTmoDwCw&ved=0CFAQFjAS&usg=AFQjCNEQwtoWcIw66Lp6ereU1rtJouDBP g/wp-content/themes/clockstone/theme/classes/timthumb.php?src=http%3A%2F%2Fpicas a.com.compraonlinecr.com%2Findex.php HTTP/1.0 Host: itmag.pro X-Real-IP: 218.234.77.241 Connection: close TE: deflate,gzip;q=0.3 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/2010 0115 Firefox/3.6 --b68d1c6d-F-- HTTP/1.1 403 Forbidden Accept-Ranges: bytes Content-Length: 5043 Connection: close Content-Type: text/html; charset=UTF-8 --b68d1c6d-H-- Message: [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_xss _attacks.conf"] [line "152"] [id "958030"] [rev "2"] [msg "Cross-site Scripting (XSS) Attack"] [data "Matched Data: src=http: found within ARGS:amp;usg: afqjcne qwtowciw66lp6ereu1rtjoudbpg/wp-content/themes/clockstone/theme/classes/timthumb. php?src=http://picasa.com.compraonlinecr.com/index.php"] [severity "CRITICAL"] [ ver "OWASP_CRS/2.2.6"] [maturity "8"] [accuracy "8"] [tag "OWASP_CRS/WEB_ATTACK/ XSS"] [tag "WASCTC/WASC-8"] [tag "WASCTC/WASC-22"] [tag "OWASP_TOP_10/A2"] [tag "OWASP_AppSensor/IE1"] [tag "PCI/6.5.1"] Access denied with code 403 (phase 2). Pattern match "\\bsrc\\b\\W*?\\bhttp:" at ARGS:amp;usg. --
Итоги
Модуль mod_security после своей установки требует более тонкой настройки чем, просто установка и подключение правил, а в целом оправдывает своё существование. Имеет в своём арсенале, каталог optional_rules, правила для борьбы со спамом modsecurity_crs_42_comment_spam.conf, modsecurity_crs_11_dos_protection.conf из experimental_rules для защиты от ДОС атак, а также другие правила для борьбы с другими видами атак, которые можно подключить опционально. Есть также платные правила, которых насчитывается более 15.000.
mod_security неплохо справляется с поставленными задачами и за небольшое время своей работы успешно отловил несколько кривых/спам запросов к сайту из Китая и США, вот содержимое тел нескольких из них:
117.21.225.25 --bf92be48-C-- name=praipien&email=colbyOt%40hotmail.com&homepage=http%3A%2F%2Fwww.louis-vuitto nonline-shop.com%2F%0D%0A&comment=get+cheap+<a+href%3D%22http%3A%2F%2Fwww.louis- vuittononline-shop.com%2F+%22>lv+online+shopping<%2Fa>++online+++YLCJmWoa++<a+hr ef%3D%22http%3A%2F%2Fwww.louis-vuittononline-shop.com%2F+%22>+http%3A%2F%2Fwww.l ouis-vuittononline-shop.com%2F+<%2Fa>+%0D%0A&subscribe=1&captcha-refid=%21UNKNOW N_TYPE%21&object_id=68&object_group=com_content 216.152.252.53 --f5a89b1c-C-- name=exiplieva&email=zmpcwwlilyxln%40gmail.com&homepage=http%3A%2F%2Fwww.evolgri nder.com%2Flouisvuitton%2Flouis-vuitton-neverfull-quanto-custa-p-10500.html&comm ent=Dhy+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Flouis-vui tton-bags-under-50-p-5976.html%22>Louis+Vuitton+Bags+Under+%2450<%2Fa>+Frg+<a+hr ef%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Flouis-vuitton-ipad-cas e-2011-usa-p-8815.html%22>Louis+Vuitton+Ipad+Case+2011+Usa<%2Fa>+Oti+<a+href%3D% 22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Flouis-vuitton-outlet-ct-p-11 088.html%22>Louis+Vuitton+Outlet+Ct<%2Fa>+Itu+<a+href%3D%22http%3A%2F%2Fwww.evol grinder.com%2Flouisvuitton%2Flouis-vuitton-discount-handbags-p-7066.html%22>Loui s+Vuitton+Discount+Handbags<%2Fa>+Btr+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder. com%2Flouisvuitton%2Fauthentic-louis-vuitton-online-p-1432.html%22>Authentic+Lou is+Vuitton+Online<%2Fa>+Ghq+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Floui svuitton%2Fknock-off-louis-vuitton-handbags-cheap-p-4723.html%22>Knock+Off+Louis +Vuitton+Handbags+Cheap<%2Fa>+Vda+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com% 2Flouisvuitton%2Ffabulous-ft-j-cole-louis-vuitton-download-p-4457.html%22>Fabulo us+Ft+J+Cole+Louis+Vuitton+Download<%2Fa>+Bmy+<a+href%3D%22http%3A%2F%2Fwww.evol grinder.com%2Flouisvuitton%2Flouis-vuitton-handbags-prices-in-canada-sale-p-8442 .html%22>Louis+Vuitton+Handbags+Prices+In+Canada+Sale<%2Fa>+Rjm+<a+href%3D%22htt p%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Fdiscount-louis-vuitton-accessorie s-replica-usa-p-3600.html%22>Discount+Louis+Vuitton+Accessories+Replica+Usa<%2Fa >+Jih+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Fdiscount-lo uis-vuitton-yellow-epi-usa-p-4251.html%22>Discount+Louis+Vuitton+Yellow+Epi+Usa< %2Fa>+Xzo+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Flvtrave lmonogramvernis-usa-p-15572.html%22>LVtravelmonogramvernis+Usa<%2Fa>+Luo+<a+href %3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Fvery-cheap-louis-vuitton -bags-replica-sale-p-18516.html%22>Very+Cheap+Louis+Vuitton+Bags+Replica+Sale<%2 Fa>+Dne+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Fpre-owned -louis-vuitton-outlet-sale-p-15874.html%22>Pre+Owned+Louis+Vuitton+Outlet+Sale<% 2Fa>+Bop+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Freal-lv- bags-p-16542.html%22>Real+LV+Bags<%2Fa>+Nlw+<a+href%3D%22http%3A%2F%2Fwww.evolgr inder.com%2Flouisvuitton%2Flouis-vuitton-usa-official-p-13997.html%22>Louis+Vuit ton+Usa+Official<%2Fa>+Ysm+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouis vuitton%2Freal-louis-vuitton-women-bags-sale-p-16535.html%22>Real+Louis+Vuitton+ Women+Bags+Sale<%2Fa>+Iue+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisv uitton%2Flouis-vuitton-tote-us-p-13619.html%22>Louis+Vuitton+Tote+Us<%2Fa>+Cct+< a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Fcheap-louis-vuitto n-alma-bag-damier-sale-p-2403.html%22>Cheap+Louis+Vuitton+Alma+Bag+Damier+Sale<% 2Fa>+Mhw+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Flv-damie r-handbags-p-15022.html%22>LV+Damier+Handbags<%2Fa>+Gvd+<a+href%3D%22http%3A%2F% 2Fwww.evolgrinder.com%2Flouisvuitton%2Fauthentic-louis-vuitton-for-less-outlet-u sa-p-1132.html%22>Authentic+Louis+Vuitton+For+Less+Outlet+Usa<%2Fa>+Mqj+<a+href% 3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Flouis-vuitton-hats-and-sc arves-usa-p-8620.html%22>Louis+Vuitton+Hats+And+Scarves+Usa<%2Fa>+Xic+<a+href%3D %22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Flv-price-replica-sale-p-154 88.html%22>LV+Price+Replica+Sale<%2Fa>+Mez+<a+href%3D%22http%3A%2F%2Fwww.evolgri nder.com%2Flouisvuitton%2Flouis-vuitton-bags-under-500-p-5982.html%22>Louis+Vuit ton+Bags+Under+500<%2Fa>+Nlb+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flou isvuitton%2Flouis-vuitton-online-store-authentic-usa-p-10892.html%22>Louis+Vuitt on+Online+Store+Authentic+Usa<%2Fa>+Ecy+<a+href%3D%22http%3A%2F%2Fwww.evolgrinde r.com%2Flouisvuitton%2Flouis-vuitton-outlet-in-vancouver-bc-p-11278.html%22>Loui s+Vuitton+Outlet+In+Vancouver+Bc<%2Fa>+Ppo+<a+href%3D%22http%3A%2F%2Fwww.evolgri nder.com%2Flouisvuitton%2Flouis-vuitton-online-deals-p-10740.html%22>Louis+Vuitt on+Online+Deals<%2Fa>+Lsg+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisv uitton%2Flouis-vuitton-2008-bags-p-4942.html%22>Louis+Vuitton+2008+Bags<%2Fa>+Bh r+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Flouisvuitton%2Fdiscount-louis- vuitton-x-stephen-sprouse-tee-usa-p-4238.html%22>Discount+Louis+Vuitton+X+Stephe n+Sprouse+Tee+Usa<%2Fa>+Cmg+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.com%2Floui svuitton%2Fauthentic-louis-vuitton-vernis-alma-usa-p-1718.html%22>Authentic+Loui s+Vuitton+Vernis+Alma+Usa<%2Fa>+Wdf+<a+href%3D%22http%3A%2F%2Fwww.evolgrinder.co m%2Flouisvuitton%2Flouis-vuitton-black-friday-2011-usa-p-6167.html%22>Louis+Vuit ton+Black+Friday+2011+Usa<%2Fa>+&subscribe=1&captcha-refid=%21UNKNOWN_TYPE%21&ob ject_id=98&object_group=com_content
Хотя нужно признать, что в mod_security существует довольно высокий процент ложных срабатываний, например наличие в строке &id ([data "Matched Data: ;id found within ARGS_NAMES:amp;id: amp;id"]) определяется как "System Command Injection" (ИД 950006), но mod_security как идея хорошая и будем надеяться, что в будущем модуль и его правила будут доведены до ума и процент ложных срабатываний будет сведён к нулю.
Ссылки по теме
- Pages · SpiderLabs/ModSecurity Wiki
- Commercial Rules
- Refer mod_security documentations to understand security policies.
- ModSecurity Rule Writing Workshop
- Mod_security settings for Wordpress 3.x