Я пытаюсь ограничить доступ определенных хостов (например, AWS) к моему веб-серверу. Я пробовал различные вариации этого, но это не работает.
# Block AWS
SecRule REQUEST_HEADERS:Host ".*\.amazonaws\.com.*" \
"msg:'AWS blocked',id:10007,log,t:lowercase,drop,phase:1"
Я пробовал:
SecRule REQUEST_HEADERS:Host ".*\.amazonaws\.com.*"
SecRule REQUEST_HEADERS:Host "@rx ^.*\.amazonaws\.com.*$"
SecRule REQUEST_HEADERS:Host "@contains amazonaws.com"
Ничего из вышеперечисленного не работает, поэтому я прихожу к выводу, что что-то не так с синтаксисом моего запроса заголовка. Вот пример строки хоста, которую я пытаюсь подобрать для исключения: Host: ec2-12-34-56-78.compute-1.amazonaws.com
Итак, из того, что я понял, и как заметил @FarhadSakhaei, REQUEST_HEADERS: Host относится к запрошенному хосту, а не к удаленному хосту. Это странно, потому что REQUEST_HEADERS: User-Agent действительно возвращает пользовательский агент клиента.
Вместо этого будет работать SecRule REMOTE_HOST с директивой Apache HostnameLookups, установленной на «On».
например.
SecRule REMOTE_HOST "bad\.host\.com$" "msg:'Bad host blocked',id:99999,log,drop,phase:1"
Если HostnameLookups имеет значение «Off», REMOTE_HOST вернет IP-адрес запрашивающего клиента. Очевидно, ожидается некоторое снижение производительности при установке HostnameLookups на "On", так что это компромисс.
Использовал такие штуки:
HostnameLookups "On"
SecRule REMOTE_HOST "@rx (?:amazonaws\.com|your-server\.de)"\
"msg:'Bad host blocked - REMOTE HOST: %REMOTE_HOST}'\
,id:99999,log,drop,block,t:lowercase,phase:request,status:403"
Отлично работает, просто заполнил список плохих хостов....