Разработка электроники,
Систем автоматики,
Программного обеспечения
ООО "Антех ПСБ",
Санкт-Петербург
+79811865082
anteh@bk.ru
28.12.2015 https://anteh.ru
Апач стоит
Установка mod_security
# cd /usr/ports/www/mod_security
...
Ставим git-lite без опций
# cd /usr/ports/devel/git-lite
...
Скачиваем правила OWASP ModSecurity Core Rule Set (CRS) в /usr/local/etc/modsecurity/crs директорию:
|
Файл /usr/local/etc/modsecurity/crs/modsecurity_crs_10_setup.conf.example копируем в ту же папку с переименованием в modsecurity_crs_10_setup.conf
Удаляем git-lite
...
==> You should manually remove the "git_daemon" user.
удаляем "git_daemon" пользователя, удобно удалить через # bsdconfig -> Login/Group Management -> Delete Login
В конфигурации апача:
|
Проверяем, чтобы апач подключал unique_id_module, без него mod_security работать не будет:
LoadModule unique_id_module libexec/apache24/mod_unique_id.so
После перезапуска с подключённым mod_unique_id.so, апач может не запуститься. Если в error логе апача такое сообщение:
|
2 варианта решения:
1. В /usr/local/etc/apache24/httpd.conf параметр some.host.name строки "ServerName some.host.name" меняем на реально зарегистрированное DNS имя. В текущем случае "ServerName anteh.ru:80". Далее # bsdconfig -> Networking Management -> Hostname/Domain и проверяем, чтобы было anteh.ru -это реальное DNS имя.
2. Или в /usr/local/etc/apache24/httpd.conf параметр some.host.name строки "ServerName some.host.name" меняем на реальный статический адрес "ServerName aa.bb.cc.dd:80" и bsdconfig -> Networking Management -> Hostname/Domain меняем на aa.bb.cc.dd. Т.е. теперь hostname сервера -это его внешний статический адрес.
После этого нужно открыть доступ к DNS серверу/серверам провайдера на 53 порт. Например, если на сервере используется блокирующий IPFW и нет DNS сервера, то ему можно задать такие правила:
|
Правилами разрешено с любого порта сетевого интерфейса ${ext} с IP адресом ${ip_ext} отправлять udp пакеты на 53 порт DNS серверов ${dns_1} и ${dns_2} провайдера. Причём инициировать передачу может только сервер, если передача будет инициирована DNS серверами провайдера, то эти udp пакеты будут отброшены.
В /usr/local/etc/modsecurity/modsecurity.conf меняем "SecRuleEngine DetectionOnly" -только информирование на "SecRuleEngine On" -применение.
Перезапуск апача для запуска modsecurity # apachectl restart
В httpd-error логе апача должно быть что-то похожее на:
|
Ключевая фраза: "StatusEngine call successfully sent"
Загруженные модули апача можно посмотреть так:
# apachectl -t -D DUMP_MODULES
# httpd -M
# apachectl -M
...
security2_module (shared)
...
Теперь проверяем, что получилось:
Здесь логи modsecurity /var/log/modsec_audit.log
Опция "SecAuditEngine RelevantOnly" означает занесение в лог только отфильтрованных "нехороших" запросов. Можно временно установим опцию "SecAuditEngine On" тогда в лог будет попадать всё.
Проверяем работоспособность по наличию обращения на DNS провайдера при перезапуске апача, наличию строки "ModSecurity: StatusEngine call successfully sent. For more information visit: http://status.modsecurity.org/" в error логах апача после перезапуска. По наличию записей в /var/log/modsec_audit.log
Главный признак работоспособности mod_security -это сообщения в логе. Нужно убедится, что содержимое запрашиваемых страниц в буквальном виде не заносится в лог. Иначе нужно исправлять содержимое страниц. Например были ситуации, когда страница заносилась в лог и не отдавалась клиенту из-за наличия недопустимых символов и/или их сочетания, тэг pre и замена стандартных запрещённых символов не помогла. Искал проблемные блоки текста последовательно удаляя из со страницы и проверяя лог mod_security.
Теперь, когда что-то заработало, настраиваем mod_security.
1.
|
Пробное отключение сжатия проблему устраяло. Решение, в httpd-vhosts.conf или httpd.conf:
|
"SecDisableBackendCompression on" -эта опция в конфигурационном файле апача решает проблему
2. Execution error - PCRE limits exceeded (-8)
|
PCRE -Perl Compatible Regular Expressions
Проверяем установленные модули perl:
|
|
Всё в порядке.
В файле /path/modsecurity/modsecurity.conf
Есть параметры
SecPcreMatchLimit 1000
SecPcreMatchLimitRecursion 1000
Для решения проблемы рекомендуют выставить такие параметры:
SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000
150000 сто пятьдесят тысяч. Встречалась информация, что это может снизить производительность.
Проблема вроде решена, сообщений в логе modsecurity по поводу PCRE больше не наблюдается, для проверяемой страницы. Позже сообщения снова появились, но для станиц с очень большим количеством текста, чем ранее тестируемая страница сайта. Увеличил параметр ещё раз:
SecPcreMatchLimit 900000
SecPcreMatchLimitRecursion 900000
Страницы с большим количеством текста стали недоступны, в логе обнаружились записи о наличии недопустимых символов -что для текущего контента обычное дело. Т.е. при увеличении параметра, страницы стали обрабатываться и у них обнаружились проблемы, которые и заблокировали выдачу страницы. Было 2 статьи с большим количеством текста, содержащими недопустимые спец символы. Спец символы экранируем, статьи разбиваем, SecPcreMatchLimit и SecPcreMatchLimitRecursion уменьшаем до минимального, чтобы не появлялись записи в логе modsecurity.
Если в лог файле modsecurity появляется полное содержимое страницы, значит параметры SecPcreMatchLimit SecPcreMatchLimitRecursion нужно увеличить, если страница не отображается в браузере, то скорее всего проблема в наличии запрещённых символов или комбинации символов на странице.
В итоге для html страницы из 117000 символов SecPcreMatchLimit SecPcreMatchLimitRecursion были установлены в 800000 восемьсот тысяч.
modsecurity блокирует страницу с текстом:меняем на mysql _. Между mysql и нижним подчёркиванием вставляем пробел. Это знание тяжело далось.
3. operator eq matched 0 at request_headers
Здесь обсуждение на тему http://serverfault.com/questions/580651/mod-security-960015-blocks-google- and-other-good-bots
Согласно RFC 2616 заголовок accept должен быть во всех запросах к серверу. И в то же время это не является абсолютным требованием. Браузеры отправляют заголовок, многие боты не отправляют. Правило в modsecure на обязательность наличия заголовка нужно для борьбы со спамом. Получается, что "хороших" ботов modsecurity может блокировать. В логе modsecurity часто встречались записи Message: Access denied with code 403 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. для:
user-agent: Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)
User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; YPC 3.0.2; .NET CLR 1.1.4322; yplus 4.4.02b)
Для Google бота такая же проблема и для ряда других ботов.
Наблюдалась такая картина: в Google резко упала позиция выдачи по отслеживаемому запросу c начала 3й на конец пятой страницы, затем в течении недели сайт плавно поднимался и почти добрался до 4й страницы, потом упал в начало 6й. В Yandex изменений вроде не было или не заметил. В Google webmaster tools на вкладке "Сведения о файле Sitemap" наблюдались предупреждения URL недоступны. Разное количество от 6 до 10, причём страницы через браузер были доступны. Не уточнял вопрос, но получается, что Google ботов несколько и какие-то из них не содержат нужного заголовка, поэтому в webtools выдаётся предупреждение не на все страницы сайта а только на некотрые, которые пытался проиндексировать агент с отсутствующим заготовком, который и блокировался modsecure. Что и навело на мысль о проблемах с modsecure. Но это всё предположения.
Решение проблемы в httpd-vhosts.conf, после загрузки mod_security2.so и соответствующих правил добавляем:
|
Для Google Mail Yandex ботов отключаем правило 960015. Если от этих ботов приходят запросы без заголовка, то они не блокируются. Работоспособность решения проверена. Загрузка mod_security2.so с правилами может производиться и в другом конфигурационном файле апача.
Сейчас доступ к серверу разрешон Google Mail Yandex ботам с наличием и без наличия заголовка accept. Все другие боты без accept блокируются. В течении суток ошибки доступа к страницам сайта при просмотре через google webmaster tools исчезли.
09.03.2016 По опыту использования, правило 960015 нужно отключить совсем, в том же месте конфигурационного файла apache прописываем:
SecRuleRemoveById 960015
Базовая работоспособность modsecurity получена, приступаем к настройке