Как настроить простейший полезный набор правил запрета по умолчанию для mod_security
?
Я хочу настроить mod_security
позволять только очень специфические запросы к одному каталогу:
Вкратце: я использую Apache как обратный прокси для каталога /web_app/
, в этом каталоге будет один файл php с именем get.php
. Я хочу передать этому скрипту только те запросы, которые соответствуют следующему регулярному выражению:
get\.php\?ver=1&id=[a-f\d]{16,16}&v=[-.a-z\d\ ]{1,20}
Другими словами, запросы только с тремя полями: id
, ver
и v
. Где первая цифра - 1, вторая - 16-значная шестнадцатеричная, а третья - строка длиной не более 20 символов с буквами, цифрами, точками, дефисами и пробелами. Он должен отклонять или удалять из запросов что-либо, кроме значений POST и GET, а именно: загрузки файлов, файлы cookie, все несущественные заголовки, значения, отличные от указанных 3, и т. Д.
Я не хочу менять способ работы других каталогов, просто /web_app/
. Отфильтровать неправильный UTF или экранирование / кодировку URL не проблема, поэтому включите mod_security
не должно быть проблемой само по себе.
Полагаю, вам нужно что-то вроде этого:
<LocationMatch "^/web_app/">
SecRule REQUEST_URI "!(:?get\.php\?ver=1&id=([a-f\d]){16,16}&v=([-.a-z\d\ ]){1,20})" "id:123,phase:2, deny, status:406"
</LocationMatch>
Для REQUEST_METHOD вы можете добавить одно дополнительное правило для блокировки, если REQUEST_METHOD не соответствует методу, который вы хотите / разрешите.
Для фильтрации аргументов существует гораздо более простой способ, чем использование регулярных выражений для всего uri:
<Location /web_app>
SecFilterSelective ARG_NAMES "!^(id|ver|v)$"
SecFilterSelective ARG_ver "!^1$"
SecFilterSelective ARG_id "!^[a-f\d]{16,16}"
SecFilterSelective ARG_v "!^[-\.a-z\d\ ]{1,20}"
# Here the same for the request type
SecFilterSelective REQUEST_METHOD "!^(GET|HEAD|POST)$"
</Location>
Соответствует любому аргументу НЕ в списке только под /web_app
.
Вы можете найти хорошие примеры в документации mod_security: http://www.modsecurity.org/documentation/modsecurity-apache/1.9.3/html-multipage/09-examples.html
Там же можно найти все другие параметры.