特定の文字列が含まれている場合、URLまたはBodyリクエストのPost/GetへのアクセスをブロックするModSecurityルールが必要です。
たとえば、この文字列をブロックしたい: "km0ae9gr6m"
私はこのルールを適切に持っていますが、機能していないようです。
SecRule ARGS "km0ae9gr6m" "log,deny,msg:'Access Denied'"
私が見逃していたのは、処理フェーズだけでした。このフェーズでは、このルールを機能させる必要があります。実際のルールはこちらです。
SecRule REQUEST_URI|ARGS|REQUEST_BODY "km0ae9gr6m" "phase:4,log,deny,msg:'Access Denied'"
このルールにより、ユーザーに見せたくないあらゆるタイプの応答を簡単にブロックできます。 Modsecurityは、サーバーに向かう途中でそれを検出し、ブロックします。
どのModSecurityバージョンを使用していますか? ARGS
変数には、バージョン1.Xでは_QUERY_STRING
_ + _POST_PAYLOAD
_のみが含まれます。上記のルールでバージョン2.Xを実行している場合は、以下のリクエストでテストします。
_http://domain.com/a?b=km0ae9gr6m
_
_audit_log
_に次のようなものが表示されます。
[modsecurity] [client x.x.x.x] [domain domain.com] [302] [/20120813/20120813-1226/20120813-122624-70QXqH8AAAEA AEucDbkAAAAA] [file "/etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf"] [line "305"] [msg "Access Denied"] Access denied with code 403 (phase 2). Pattern match "km0ae9gr6m" at ARGS:b.
ModSecurity 2.xでは、ARGS
は個々の変数に展開されます。だから、これを試してください:
_SecRule REQUEST_URI|ARGS|REQUEST_BODY "km0ae9gr6m" "log,deny,msg:'Access Denied'"
_
上記の答えは正しいです、フェーズを使用してください:1。 「@contains」部分文字列一致演算子を使用して、不要な文字列が長い文字列の一部であるリクエストを停止することもできます。たとえば、Word Pressがないため、wp-login、wp-adminなどのリクエストを受け取ったときに、1つのルールでそれらすべてをブロックできます。SecRuleREQUEST_URI "@contains wp-" "id:101、フェーズ:1、拒否、ステータス:409、メッセージ:「拒否」」
余談ですが、msg:からのメッセージはログにのみ表示されるようです。ユーザーが見るメッセージは、Apache config ErrorDocument 409 "ACCESS STRICTLY FORBIDDEN"に追加されています。