#http #get #apache2 #mod-security #mod-security2
#http #получить #apache2 #мод-безопасность #mod-security2
Вопрос:
Я хочу создать правило mod security2x, которое будет блокировать запрос GET на определенный URL.
например, я хочу заблокировать URL-адрес с помощью GET в заголовке: ‘www.test.com ‘
Я никогда не создавал правило в modsecurity и не уверен, что это будет работать в режиме обнаружения аномалий.
Это будет примером запроса GET: GET/secure/bla/test/etc/
Это то, что у меня есть до сих пор: SecRule ARGS "www.test.com" phase:2,log,deny,id:'1234',msg:'403 Access Denied'
Ответ №1:
Вы хотите что-то вроде этого:
SecRule REQUEST_URI "@streq /secure/bla/test/etc/"
"phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase"
Вам нужно связать два правила вместе, поскольку вы хотите проверить два условия (путь /secure/bla/test/etc/ и метод GET).
Если вы хотите добавить третье правило для проверки хоста (например, если у вас несколько виртуальных хостов и этот URL-адрес действителен для запросов GET на некоторых из них), то вы можете:
SecRule REQUEST_URI "@streq /secure/bla/test/etc/"
"phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase,chain"
SecRule SERVER_NAME "@streq www.example.com"
Или, в качестве альтернативы, вы можете использовать REQUEST_URI_RAW, который будет включать протокол и имя хоста, а также запрашиваемый ресурс:
SecRule REQUEST_URI_RAW "^https?://www.test.com/secure/bla/test/etc/"
"phase:1,id:1234,t:none,t:urlDecode,t:lowercase,t:normalizePath,deny,status:403,msg:'403 Access Denied',chain"
SecRule REQUEST_METHOD "@streq get" "t:none,t:lowercase"
Вы заметите, что я также добавил довольно много функций преобразования ( t:
bits), чтобы помочь избежать попыток людей обойти это правило (например, с помощью пути like /secure/bla/TEST/../test/etc/
).
Все это описано в справочном руководстве: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual но, признаю, требуется немного практики, чтобы привыкнуть!
Простой режим обнаружения аномалий означает, что правила, которые могут срабатывать для допустимых запросов, не блокируются немедленно, а вместо этого присваивается оценка, и если общая оценка всех правил для этого запроса превышает определенный порог, то он блокируется, если нет, то нет. Это позволяет по-прежнему включать «шумные» правила, но игнорировать их, если только для запроса не срабатывает множество шумных правил или если срабатывает одно важное правило.
Ничто не мешает вам явно блокировать с помощью опции «запретить», как я сделал выше, даже в режиме обнаружения аномалий. Это правило кажется довольно безопасным от случайного запуска для законного запроса (после того, как вы проверили, что оно работает!), Поэтому я бы просто перешел от прямой блокировки, как я сделал выше. Альтернативой является замена deny
на block,setvar:tx.anomaly_score= %{tx.critical_anomaly_score}
, которая будет иметь тот же эффект, когда оценка будет проверена позже, но, на мой взгляд, излишне усложняет читаемость правила, поскольку оно всегда будет блокироваться в любом случае.
Оценка аномалий по сравнению с традиционной оценкой более подробно рассматривается в этом сообщении в блоге: http://blog.modsecurity.org/2010/11/advanced-topic-of-the-week-traditional-vs-anomaly-scoring-detection-modes.html
Комментарии:
1. Спасибо! У меня есть еще один вопрос, поэтому я изменил строку, которую вы добавили выше. Сделайте
2. Нужно ли мне добавлять всю эту строку? «GET /secure/bla/test/etc/=www.test.com»
3. SecRule REQUEST_URI «@streq /secure/bla/test/etc/=www.test.com» «фаза: 1,идентификатор: 1234,t: нет,t:urlDecode,t: нижний регистр,t:normalizePath,запретить, статус: 403, сообщение:’403 Доступ запрещен,цепочка'» SecRule REQUEST_METHOD «@streq get» «t: нет, t: нижний регистр»
4. Это не имеет смысла. REQUEST_URI содержит полный запрошенный путь (т.е. /secure/bla/test/etc). Он не содержит имя хоста. И, конечно, не в этом странном синтаксисе «path = hostname» — откуда вы это взяли? REQUEST_URI_RAW содержит протокол, хост и путь (например
http://www.example.com/secure/bla/test/
, etc), как я показал во втором примере выше. В качестве альтернативы вы можете добавить 3-е правило (также связанное) для проверки переменной SERVER_NAME. Отредактировал свой ответ, чтобы включить и эту опцию.5. Теперь я понимаю, хотя я продолжаю получать «ModSecurity: в правиле нет идентификатора действия», я изменил идентификатор правила на любой другой номер, и он все еще не работает
Ответ №2:
Я бы использовал метод белого списка, чтобы заблокировать запрос GET, например, login.php и change_password.php не требует никакого запроса GET.
SecRule REQUEST_URI|ARGS_NAMES|REQUEST_FILENAME "/secure/bla/test/etc/" "phase:2,t:none,deny,chain"
SecRule REQUEST_FILENAME "@pm login.php change_password.php"