Случайным образом modsecurity блокирует запросы легитимных клиентов с ошибкой 403. Вот параграф modsec_audit.log:
---d6e99f36-A--
[21/Jun/2020:07:14:45 +0100] Xu761X8AAAEAADI1YrAAAABQ xxx.xxx.xxx.xxx 60036 xxx.xxx.xxx.xxx 443
--d6e99f36-B--
GET /s/p.json?eyJ0IjoyLjksImYiOnsiZmxpX3BsIjoiYXNwZXJzb3IiLCJmbGlfZyI6LTEsImZsaV9jIjotMSwiZmxpX20iOjAsImZsaV9hIjoyMDE1fSwiY3NyZiI6ImE5MDMwMDkxLTBlZjg$
Host: fneon.eu
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: */*
Accept-Language: pt-PT,pt;q=0.8,en;q=0.5,en-US;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://example.com/
Content-Type: application/json,charset=UTF-8
DNT: 1
Connection: keep-alive
Cookie: jwt=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyYzMwOGQwYTc5NGEyZWU2MjMxYzI2M2EyYWMzNjkwMCIsImV4cCI6MTU5MzY0NDQwMCwiaWF0IjoxNTkyNzE5ODg1$
Pragma: no-cache
Cache-Control: no-cache
--d6e99f36-F--
HTTP/1.1 403 Forbidden
X-FRAME-OPTIONS: DENY
X-Content-Type-Options: nosniff
Content-Length: 199
Keep-Alive: timeout=5, max=89
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
--d6e99f36-E--
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>
--d6e99f36-H--
Apache-Error: [file "mod_evasive20.c"] [line 259] [level 3] client denied by server configuration: %s
Apache-Handler: proxy-server
Stopwatch: 1592720085355364 815 (- - -)
Stopwatch2: 1592720085355364 815; combined=42, p1=35, p2=0, p3=1, p4=0, p5=5, sr=0, sw=1, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.9.0 (http://www.modsecurity.org/).
Server: Apache
Engine-Mode: "ENABLED"
--d6e99f36-Z--
Вот моя конфигурация (только изменения):
/etc/modsecurity/modsecurity.conf
SecRuleEngine On
SecResponseBodyAccess Off
SecRequestBodyLimit 5242880 (15Mb)
/etc/apache2/mods-enabled/evasive.conf
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 10
DOSSiteCount 75
DOSPageInterval 5
DOSSiteInterval 1
DOSBlockingPeriod 3000
DOSWhitelist 127.0.0.1
DOSWhitelist xxx.xxx.xxx.xxx
DOSWhitelist xxx.xxx.xxx.xxx
DOSWhitelist xxx.xxx.xxx.xxx
DOSLogDir "/var/log/mod_evasive"
</IfModule>
/etc/apache2/conf-enabled/security.conf
ServerTokens Prod
Один из способов воспроизвести проблему - это когда клиент делает запрос следующего типа:
https://example.com/s/p.json?eyJ0IjoyLjksImYiOnsiZmxpX3BsIjoiYXNwZXJzb3IiLCJmbGlfZyI6LTEsImZsaV9jIjotMSwiZmxpX20iOjAsImZsaV9hIjoyMDExfSwiY3NyZiI6ImE5MDMwMDkxLTBlZjgtNDcyOC05YjQ1LTU1MWY3M2U5YjQ5MCJ9
... что в моем случае является законным запросом. Может кто подскажет, как решить эту проблему? Спасибо.
Это нормально, что ModSecurity вызывает ложные срабатывания при включенных правилах по умолчанию. Вот почему тебе следует отключите правила, которые вызывают проблемы, желательно только для URL-адресов, которые не будут работать без их отключения. Поскольку в ваших цитатах из журналов отсутствуют идентификаторы правил, трудно дать точный ответ, но вот пример процесса:
Сначала найдите правила, вызывающие проблемы. Если, например, IP-адрес легитимного клиента 198.51.100.123
, ты можешь:
grep "198.51.100.123" /var/log/apache2/example.com-error.log
Важно ограничить поиск известными хорошими IP-адресами; иначе вы допустите что-то действительно вредоносное!
Посмотрите на ModSecurity: Warning
линий и сконцентрируйтесь на [id ""]
и [uri ""]
. Допустим, вы нашли строки, в которых [uri "/s/p.json"]
и они стреляют по правилам [id "941100"]
и [id "941120"]
.
Настройте свой Apache либо глобально, либо на виртуальном хосте, чтобы отключить эти правила, например
<LocationMatch "/s/p.json">
SecRuleRemoveById 941100 941120
</LocationMatch>
Некоторые статьи о ModSecurity и обработке ложных срабатываний: