Установка и настройка mod_security на Apache 2 на базе CentOS

Установка и настройка mod_security на Apache 2 базе CentOS CentOS Сегодня будем нахлобучивать 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), примерно до такой кондиции:

cp /usr/share/doc/mod_security-2.7.2/modsecurity.conf-recommended 
  /etc/httpd/modsecurity.d/modsecurity.conf
 
vi /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
        Include modsecurity.d/modsecurity.conf
        Include modsecurity.d/modsecurity_crs_10_config.conf
        Include modsecurity.d/activated_rules/*.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>

В /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&amp;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: remotehelp.pp.ua
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 будет выглядеть следующим образом:

vi /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
        Include modsecurity.d/modsecurity.conf
        Include modsecurity.d/modsecurity_crs_10_config.conf
        Include modsecurity.d/activated_rules/*.conf
        # Disable rules ID
        SecRuleRemoveById 950109 950000 950003 960015 960017 981231 981318 950007 
960024 981172 981173 981257 981247 981243 973302 981203 981204 950006 960009
 
        #Include modsecurity.d/slr_rules/*.conf
        # Disable rules ID
        #SecRuleRemoveById
 
        # Rule management is handled by ASL
        Include modsecurity.d/00*exclude.conf
        Include modsecurity.d/*asl*.conf
        Include modsecurity.d/99*exclude.conf
 
</IfModule>
 
vi /etc/httpd/modsecurity.d/modsecurity.conf
# -- Rule engine initialization ----------------------------------------------
 
# Enable ModSecurity, attaching it to every transaction. Use detection
# only to start with, because that minimises the chances of post-installation
# disruption.
#
#SecRuleEngine DetectionOnly
SecRuleEngine On
 
# -- Request body handling ---------------------------------------------------
 
# Allow ModSecurity to access request bodies. If you don't, ModSecurity
# won't be able to see any POST parameters, which opens a large security
# hole for attackers to exploit.
#
#SecRequestBodyAccess On
SecRequestBodyAccess Off
 
# -- Response body handling --------------------------------------------------
 
# Allow ModSecurity to access response bodies.
# You should have this directive enabled in order to identify errors
# and data leakage issues.
#
# Do keep in mind that enabling this directive does increases both
# memory consumption and response latency.
#
SecResponseBodyAccess Off
 
rm /var/log/modsec_audit.log
service httpd restart
rm -R /var/cache/nginx/pagecache/*
less /var/log/modsec_audit.log

Правила из "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:

  • A - заголовок/начало записи
  • B - заголовки запроса
  • C - тело запроса
  • D - intended response headers (НЕ РЕАЛИЗОВАНО)
  • E - предполагаемое тело ответа
  • F - response headers
  • G - response body (НЕ РЕАЛИЗОВАНО)
  • H - журнал аудита
  • I - сокращённые составные тела запроса
  • J - multipart files information (НЕ РЕАЛИЗОВАНО)
  • K - информация о соответствии правила
  • Z - конец записи

Следующая команда поможет обнаружить самых злостных нарушителей:

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: remotehelp.pp.ua
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 существует довольно высокий процент ложных срабатываний, например наличие в строке &amp;id ([data "Matched Data: ;id found within ARGS_NAMES:amp;id: amp;id"]) определяется как "System Command Injection" (ИД 950006), но mod_security как идея хорошая и будем надеяться, что в будущем модуль и его правила будут доведены до ума и процент ложных срабатываний будет сведён к нулю.

Ссылки по теме


Комментарии   

en iyi bosanma
0 #4 en iyi bosanma 25.06.2015 10:40
This post will assist the internet viewers for creating new web
site or even a weblog from start to end.
Цитировать
Guest
0 #3 Guest 14.07.2014 08:00
It's nearly impossible to find well-informed people for this subject, but you sound like you know what you're talking
about! Thanks
Цитировать
АдМинь БагоИскатель
0 #2 АдМинь БагоИскатель 03.09.2013 08:55
По ссылке ниже есть некий извратный способ заставить их работать вместе.

Security : Linux : communication between mod_security and iptables to block IP's: http://spamcleaner.org/en/misc/modsec2ipt.html

Ещё есть некий модуль mod_qos для минимизации паразитной нагрузки на сайт: http://mod-qos.sourceforge.net/ У него там дофига всяких настроек по лимитам, это не то пальто, но может тоже быть полезно.
Цитировать
Guest
0 #1 Guest 03.09.2013 08:08
Может кто подскажет как mod_security заставлять банить ip с которого допустим пришло 3 левых запроса через iptables? Три запроса в теч 1 минуты и банить минут на 10.

Знаю опция такая есть, но сколько не гуглил, не получилось запустить. fail2ban в принципе помогает, но пока он сработает, десяток левых запросов уже прилетит, да и дополнительная программа
Цитировать

Добавить комментарий


Защитный код
Обновить

2 megabytes