Мы наблюдаем много реферального спама на один из наших серверов, поэтому я решил добавить несколько пользовательских правил безопасности модов, чтобы попытаться остановить хотя бы некоторые из них.
Я добавил несколько правил, например:
SecRule REQUEST_HEADERS:User-Agent "/\byourekillingme.org\b/" \
"phase:1,log,deny,status:503,msg:'Referer spam1',id:101"
SecRule REQUEST_HEADERS:User-Agent "/\bahrefs.com/robot\b/" \
"phase:1,log,deny,status:503,msg:'Referer spam2',id:102"
SecRule REQUEST_HEADERS:User-Agent "/\bsemrush.com/bot\b/" \
"phase:1,log,deny,status:503,msg:'Referer spam6',id:106"
но, как вы можете видеть из вывода журнала, пока применяется правило ahrefs (идентификатор 102 выше), другие нет (есть и другие, но работает только ahrefs):
107.180.120.23 - - [23/Nov/2017:11:08:00 +0000] "GET /tri-levlen-28-side-effects-3f1 HTTP/1.1" 200 50965 "http://www.mydomain.co.uk/tri-levlen-28-side-effects-3f1#elephant" "WordPress/4.9; http://yourekillingme.org"
51.255.65.42 - - [23/Nov/2017:10:40:51 +0000] "GET /pink-viagra-price-52c HTTP/1.1" 503 315459 "-" "Mozilla/5.0 (compatible; AhrefsBot/5.2; +http://ahrefs.com/robot/)"
46.229.168.73 - - [23/Nov/2017:11:07:50 +0000] "GET /viagra-for-sale-online-cheap-52c HTTP/1.1" 200 51060 "-" "Mozilla/5.0 (compatible; SemrushBot/1.2~bl; +http://www.semrush.com/bot.html)"
Я также проверил /usr/local/apache/logs/modsec_audit.log, чтобы убедиться, что это мое правило вызывает 503, а не другое правило где-то еще, и это просто показывает множество записей для:
Message: Access denied with code 503 (phase 1). Pattern match "/\\bahrefs.com/robot\\b/" at REQUEST_HEADERS:User-Agent. [file "/usr/local/apache/conf/modsec2.myrules.conf"] [line "8"] [id "102"] [msg "Referer spam2"]
указывая, что это мое правило modsec останавливает его.
Кто-нибудь может понять, почему не применяются другие мои правила?
Это косые черты. Регулярные выражения в ModSecurity не ограничиваются косой чертой, поэтому они интерпретируются как буквальная часть регулярного выражения.
Все ваши выражения соответствуют URL-адресам, поэтому первая косая черта соответствует последней косой черте в http://
часть URL-адреса, но только URL-адрес AHrefs имеет косую черту в конце, так что это единственный, который в конечном итоге соответствует этим регулярным выражениям.
Я не уверен \b
тоже делает что-нибудь полезное. Кажется, что эти три совпадают либо на .
или /
или конец строки. Если это действительно понимается ModSecurity, это может привести к тому, что в будущем выражения для других ботов не будут соответствовать, когда вы ожидаете их совпадения.