Table of Contents
注記
どう か、私の個人用メールアドレスにサポートの要求を送らないで下さい。私は質問に答えるのに時間を費しています。しかし、もはや私的な質問には答えませ ん。回答する事で、別のユーザーが自身でメールアーカイブを探す事を抑制する結果になるからです。あなたが回答を直ちに必要とする、又は、あなたが望むな らば回答時間を重視し保証するThining stone 商用サポートにしてください。
| cvs
-d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mod-security login cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mod-security co mod_security |
| http://www.modsecurity.org/download/snapshot/mod_security-snapshot.tar.gz |
| /apachehome/bin/apxs -cia mod_security.c |
| /apachehome/bin/apachectl stop
/apachehome/bin/apachectl start |
注記
私は、apxsユーティリティをインストールしないプラットフォームを使用している人々からの報告を持っています。
あるUnixディストリビューションでは、このツールは個別のパッケージで配布されています。そのパッケージがインストールされていないデフォルトでは問 題 が生じます。この問題を解決するには、あなたがどのようにして自分のカスタムApacheモジュールを加えることができるのかベンダーのドキュメンテー ションを読んでください。(いくつかのRedHatプラットフォームにおい ては、apxs にアクセスするために http-devel パッケージをインストールする必要があります)
| $ cd <apache1-source> $ cp <modsecurity-source>/apache1/mod_security.c ./src/modules/extra $ ./configure \ --activate-module=src/modules/extra/mod_security \ --enable-module=security |
| $ cd <apache2-source> $ cp <modsecurity-source>/apache2/mod_security.c ./modules/proxy $ ./configure \ --enable-security \ --with-module=proxy:mod_security.c |
| $ cd
<modsecurity-source>/apache2 $ mkdir -r <apache2-source>/modules/security $ cp mod_security.c Makefile.in config.m4 <apache2-source>/modules/security $ cd <apache2-source> $ ./buildconf |
| $ ./configure --enable-security |
| LoadModule security_module libexec/mod_security.so |
| AddModule mod_security.c |
| LoadModule security_module modules/mod_security.so |
| <IfModule
mod_security.c> # mod_security configuration directives # ... </IfModule> |
| Include conf/modsecurity.conf |
| SecFilterEngine On |
| SecFilterScanPOST On |
| SecFilterSelective
HTTP_Content-Type \ "!(^$|^application/x-www-form-urlencoded$|^multipart/formdata;)" |
| SetEnvIfNoCase Content-Type \ "^multipart/form-data;" "MODSEC_NOPOSTBUFFERING=Do not buffer file uploads" |
| SecFilterSelective HTTP_Transfer-Encoding "!^$" |
| SecFilterDefaultAction "deny,log,status:404" |
注記
1.8.6時点で、あなたが指定した致命的で無いデフォルトアクションリスト(例えばlog, passのようなリクエストをrejectしないリスト)を 指定したら、そのようなアクションリストは初期設定過程で無視されます。初期設定過程は、リクエストに関する情報を集めることを目指しています。致命的で 無いアクションの許可は数個のリクエストを見つけられなくします。この情報が内部処理のために必要になるので、そのようなアクションは許可することができ ません。もし、あなたがModsecurityを"detect-only"モードのオペレーションが必要なら全ての暗黙の検証を無効にする必要がありま す(URL encoding validation, Unicode encoding validation, cookie format validation, and byte range restrictions)
注記
いくつかのアクションはデフォルトリストに現れません。次のとおりです: id, rev, skipnext, chain, chained.
注記
1.9dev4 時点で、最初の暗黙のリクエスト検証の一部の Unicode エンコーディング検証はRefererヘッダーコンテンツには適用されません。これはこのヘッダが他のウェブサイトからの情報を時々含んでいるからです。 また、それらのエンコーディングは通常保護されたウェブサイト上で使用されるエンコーディングと異なります。
| SecFilterInheritance Off |
注記親コンテキストからの規則を継承しない場合、新しいコンテキストのための新しい規則を書くか、ある いは単に、様々なコンテキストへ同じ規則を含めるのに誘導用のIncludeディレクティブを使用することができます。時々、子コンテキスト中のルール セットの小さな変更のみ必要になります。そのような場合、inheritanceオプションを選択しても良い。次の2つのディレクティブの助けを借りてこ れを行えます:
設定とルールの継承は、常にデフォルトで有効です。もしあなたがもう 一つ下に設定コンテキストを持っているなら継承されません再び明示的に継承を無効にする必要があります。
注記例1: 親コンテキストからのルールは継承されません。しかし、単一のルールがインポートされます。
目標のルールIDがチェーンの一部であるルールを参照するなら、インポートと削除ディレクティブは全体のチェーンに影響、IDが参照するルールだけでは無 い。
| SecFilter XXX id:1001 SecFilter YYY id:1002 SecFilter ZZZ id:1003 <Location /subcontext/> SecFilterInheritance Off SecFilterImport 1003 </Location> |
| SecFilter XXX id:1001 SecFilter YYY id:1002 SecFilter ZZZ id:1003 <Location /subcontext/> SecFilterRemove 1001 1002 </Location> |
注記
Apacheウェブサーバーは様々なタイプのコンテキストをサポートします(例えば <Directory...>, <Locatio>, <files>, ...)コンテキストがマージされるオーダーは重要。継承および異なるタイプのコンテキストを混用しないようにすべき。コンフィグレーションテスト確認、 意図した動作確認、Apacheコンテキストマージドキュメントを注意深く読む: http://httpd.apache.org/docs-2.0/sections.html#mergin.
一つ目は、あなたは一定のルールを強制するマーク、 mandatory (強制)アクションを使えます。そのようなルールは、子コンテキスト中で常に継承されるでしょう。
注記
もしも、信頼し得ないユーザーならば(例えば、WEBホスティング環境での実行)彼らにModsecurityへのアクセスを決して認めてはいけませ ん。.htaccess機構はアプリケーションコードとModsecurityの設定維持の集中管理制御の分散化に役立ちます。しかし、設定を覆したい ユーザーに意図的に使われてしまいます。もし、あなたが相反する環境を実行しているなら、あなたは、.htaccess機能実装を切る- DDISABLE_HTACCESS_CONFIGスイッチでModsecurityをカスタムコンパイルすべきです。
| SecFilterInheritanceMandatory On |
注記あなたはこの状況に何が起こったのか驚くかもしれません:
SecFilterInheritance がコンテキスト中で常に enabled になり、SecFilterInheritanceMandatory は、常にコンテキスト中で disabled になります。親コンテキスト中で使っている値は問題ありません。
| SecFilter XXX id:1001 SecFilterInheritanceMandatory On <Location /subcontext/> SecFilterInheritance Off SecFilter YYY id:1002 SecFilter ZZZ id:1003,mandatory </Location> <Location /subcontext/another/> SecFilterRemove 1001 1002 1003 SecFilter QQQ id:1004 </Location> |
注記
あなたは、以前の skip アクションを作り使う事を避け、且つ、ルールを削除すべきです。そうでないならば、あなたの意図に相当する何某かの設定に、とても注意しなければいけませ ん。
| SecFilterCheckURLEncoding On |
注記
このディレクティブはPOSTペイロード中に"multipart/formdata"エン コーディング(file upload)を使っている場合、エンコーディングをチェックしません。それはURLエンコード使用に必須では無いので必然的にこのエンコーディングは使 われていません。
注記
UnicodeとUTF-8エンコーディングについてのより多くの情報はRFC 2279に見つけることができます。
(http://www.ietf.org/rfc/rfc2279.txt)
| SecFilterCheckUnicodeEncoding On |
| SecFilterForceByteRange 32 126 |
注記
このディレクティブは、multipart/form-data エンコーディング(ファイル・アップロード)が使用される 時、POSTペイロード中のバイトレンジをチェックしないでしょう。これを行う事でバイナリファイルのアップロードが防止できます。但し、それらのリクエ ストは有効な範囲にあるかチェック後にパラメータが抽出されます。
| SecFilter KEYWORD |
| SecFilter /bin/sh |
| SecFilter hidden |
| GET /one/two/three?p=visible%00hidden HTTP/1.0 |
| SecFilter KEYWORD [ACTIONS] |
注記2番目のパラメータはアクションリストの定義です。それは、フィル ターに一致する場合、何が起こるかを示します。アクションは、このマニュアル中で後述し説明されます。
2つの異なる正規表現エンジンが Apache 1.x と Apache 2.x で使われています。Apache 1.x は POSIX 準処の正規表現エンジンです。Apache 2.x は PCRE 準処の正規表現エンジンです。経験則では、Apache 1.xで働く正規表現は Apache 2.x で働く。しかし反対は働かない。もし、両方のメジャーブランチで働くルールを書く必要があるなら、それらを徹底的にテストしなければならないでしょう。
| SecFilter "!php" |
| SecFilterSelective LOCATION KEYWORD [ACTIONS] |
| SecFilterSelective "REMOTE_ADDR|REMOTE_HOST" KEYWORD |
| SecFilterSelective "ARGS|!ARG_param" KEYWORD |
| # enable version 1 (RFC 2965)
cookies SecFilterCookieFormat 1 |
| SecFilterNormalizeCookies On |
注記
これはSecFilterNormalizeCookieディレクティブ適用済みです。 ModSecurityバージョン1.8.7より SecFilterCheckCookieFormatディレクティブがサポートされました。最近の変更により1.8.7のこのディレクティブは現在、非 難されています。それは、今までどおり設定中で使用することができますが、何もしないのです。ディレクティブは、1.9.x branchで完全に削除されるでしょう。
| SecFilterScanOutput On |
| SecFilterSelective OUTPUT "credit card numbers" |
| SecFilterSelective OUTPUT
"Fatal error:" deny,status:500 ErrorDocument 500 /php-fatal-error.html |
注記アウトプットフィルタリングは単純なプレーンテキストと HTML 出力に役立ちます。バイナリの内容(例えば画像)に正規表現を適用することはサーバーを遅 くするだけです。デフォルトのModSecurity は content type無し、content type text/plan, content type text/html のレスポンスをアウトプットスキャンします。
skipnext とchain を使ったアクションはアウトプットフィルターでは働きません。
| SecFilterOutputMimeTypes "(null) text/html text/plain" |
注記アウトプットモニタリングは幾つかの状況で有用な特徴ですが、 フールプルーフでは無い事を承知しておくべきです。もしアタッカーがリクエスト処理のフルコントロール下なら、2つの方法でアウトプットモニタリングを回 避できます:
アプトプットバッファリングを使用すると、ModSsecurity はメモリ内にページ出力の 全体を維持します。それはとても大きく、メモリ消費量はページサイズの2倍強になります。
| SecFilterDefaultAction "deny,log,status:500" |
注記
1.8.6時点で、もしあなたが重大では無いデフォルトアクションを指定したなら("log, pass"など)mod_security初期 設定過程で無視されるでしょう。初期設定過程では重大では無いアクションを許可してリクエストに関する情報を集めます。重大では無いアク ションの許可は多 くのリクエスト断片を見付けられなくします(mod_securityの内部処理の為)。従ってmod_securityが"検出のみ"モードで動作する 事を望むなら暗黙の検証機能をすべて無効にすべきです。(check URL encoding, Unicode, cookie format, byte range)
注記
メタデータアクション (id, rev, msg, severity)と、ルールをコントロールするアクション(skip/skipnext, chain)は、SecFilterDefaultActiondirective に表わせません。
| SecFilterDefaultAction
log,deny,status:500 # The rule below will respond with actions # specified in the context it is executed in. # You should note that the context a rule is # executed in is not necessarily the context # that rule was created in. Through inheritance # one rule can be executed in many different # contexts. SecFilter 000 # Warning rules SecFilterSignatureAction log,pass SecFilter 111 id:1 SecFilter 222 id:2 # Error rules SecFilterSignatureAction log,deny,status:403 SecFilter 333 id:3 SecFilter 444 id:4 # Rule below, too, will reject with status 403 SecFilter 555 |
注記
SecFilterSignatureActionディレクティブの値は子コンテキスト中で継承されないでしょう。
| SecFilterSignatureAction
log,deny,status:403 SecFilterActionsRestricted On Include conf/third-party-rules.conf |
| SecFilter KEYWORD "pass,log" |
| # stop filter processing for
request coming from # the administrator's workstation SecFilterSelective REMOTE_ADDR "^192.168.2.99$" allow |
| SecFilter KEYWORD "deny,status:404" |
| SecFilter KEYWORD "redirect:http://www.modsecurity.org" |
| SecFilter KEYWORD
"proxy:http://www.example.com" |
| SecFilter KEYWORD "exec:/home/ivanr/report-attack.pl" |
注記
あなたはフォークしスレッド化されたプロセス結果中の新しいプロセス中の全ての生存し応答す るスレッドに気づいているべきで す。したがって、フォーキングは、マルチスレッドの オペレーション中には、より大きなオーバーヘッドを招くかもしれません。
| SecFilterSelective ARG_p
value1 skipnext:2 SecFilterSelective ARG_p value2 SecFilterSelective ARG_p value3 chain |
| SecFilterSelective
ARG_username admin chain SecFilterSelective REMOTE_ADDR "!^YOUR_IP_ADDRESS_HERE$" |
注記
このオプションがコストに跳ね返る事に用心してください。すべてのウェブサーバーのインスト レーションは、常に、サーブできる最 大のリク エストの数という限界で設定されています。長い遅延時間を備えたこのオプションの利用は、脆弱性スキャナーがパラレル(したがって多数)でリクエストを実 行している場合、"自ら" 強制サービス拒否攻撃を作ることになるかも知れません。
注記
これらのアクションは標準ルール上、あるいはチェーンを開始するルール上でのみ使われる。idアクションはどのようなテキストも含む事ができますが、単な る整数を使用する事を推奨します。将来のある時期に、私たちが有効なルールIDとして整数だけを認めるだろうという保証はありません。もし公にルールを公 表するつもりで無ければ、ローカル範囲の1 - 99,999を使用すべきです。これらがローカル範囲です。
注記
アクションid は単独利用されるスタンドアローンルール又は、チェーンを開始とするルール上で使用できます。
例えば:
| SecFilter 111 mandatory |
| SecFilter 111 mandatory,chain SecFilter 222 |
| SecFilter KEYWORD
setenv:name=value |
| SecFilter KEYWORD setenv:name |
| SecFilter KEYWORD setenv:!name |
| LogFormat "%h %l %u %t \"%r\"
%>s
%{mod_security-body}n |
注記
もしもリクエストが、multipart/request-data タイプ(ファイルアップロード)である場合、本物のリクエストボディは、シミュレートされた application/xwww-form-urlencoded の内容と取り替えられるでしょう。
| SecUploadDir /tmp |
| SecUploadApproveScript /full/path/to/the/script.sh |
| SecUploadKeepFiles On |
| SecUploadKeepFiles RelevantOnly |
| # mkdir /tmp/webfiles # chown httpd:clamav /tmp/files # chmod 2750 /tmp/files |
| #!/usr/bin/perl # # modsec-clamscan.pl # mod_security, http://www.modsecurity.org # Copyright (c) 2002-2004 Ivan Ristic <ivan # # $Id: modsecurity-manual.xml,v 1.7 2005/11/01 13:59:55 ivanr Exp # # This script is an interface between mod_security and its # ability to intercept files being uploaded through the # web server, and ClamAV # by default use the command-line version of ClamAV, # which is slower but more likely to work out of the # box $CLAMSCAN = "/usr/bin/clamscan"; # using ClamAV in daemon mode is faster since the # anti-virus engine is already running, but you also # need to configure file permissions to allow ClamAV, # usually running as a user other than the one Apache # is running as, to access the files # $CLAMSCAN = "/usr/bin/clamdscan"; if (@ARGV != 1) { print "Usage: modsec-clamscan.pl <filename>\n"; exit; } my ($FILE) = @ARGV; $cmd = "$CLAMSCAN --stdout --disable-summary $FILE"; $input = `$cmd`; $input =~ m/^(.+)/; $error_message = $1; $output = "0 Unable to parse clamscan output [$1]"; if ($error_message =~ m/: Empty file\.$/) { $output = "1 empty file"; } elsif ($error_message =~ m/: (.+) ERROR$/) { $output = "0 clamscan: $1"; } elsif ($error_message =~ m/: (.+) FOUND$/) { $output = "0 clamscan: $1"; } elsif ($error_message =~ m/: OK$/) { $output = "1 clamscan: OK"; } print "$output\n"; |
| SecUploadInMemoryLimit 125000 |
| SecServerSignature "Microsoft-IIS/5.0" |
| [Fri Jun 11 04:02:28 2004]
[notice] Microsoft-IIS/5.0 mod_ssl/2.8.12 OpenSSL/0.9.6b configured -- resuming normal operations |
注記SecServerSignatureディレクティブが公開サーバーのシグネチャを変更するために 使用される時、ModSecurityは識別を可能にす るためにエラーログに実際のウェブサーバーとモジュールのシグネチャを書き込みます。
順番にこのディレクティブを働かせる為には、あなたは Apache.conf の ServerTokens の"全部"を 残す/整える かしなければいけない。
| [Fri Jun 11 04:02:28 2004]
[notice]
mod_security/1.9dev1 configured - Apache/2.0.52 (Unix) PHP/4.3.10 proxy_html/2.4 |
| chroot /chroot/apache /usr/local/web/bin/apachectl start |
| SecChrootDir /chroot/apache |
注記もし、あなたが jail 外のログファイルを残すために chroot を形成したならば、Apache は jail の外のファイルに対して ファイル記述子ポインタを持つでしょう。chroot メカニズムは当初はありませんでした。セキュリティとこれに関して心配する多くの人々すべてのためにデザインしました。構成は自分自身で決定 して ください。多少実験的なものとしてこの機能を扱ってください。
Apache 2.x の AcceptMutex ディレクティブのデフォルト値は "pthread" です。時々、このセッティングは chroot 機能を使う Apache の働きを妨げます。 Set AcceptMutex は任意の他の設定でこの問題を回避できます。(例えば"posixsem")
注記
もし、あなたのインストールした Apache が mod_ssl を使用するなら、ファイルベースの SSL mutex が使用される場合に jail の外側のログ・ディレクトリーを探す事は不可能でしょう。これは、mod_ssl がスタート時に直ちにログ・ディレクトリー中でロック・ファイルを作成しますが、それをその後、見付ける事ができない場合、失敗します。この問題は他のあ るミューテック・タイプ (例えばSSLMutex sem) を使用するか、jail の内部のディレクトリー中のファイルベース mutex の場所を mod_ssl に伝えることにより回避することができます。(using SSLMutex file://path/to/file)
注記
もし、あなたが、マルチスレッド Apache の chroot の利用を試したいなら、pthread_cancel を働かせるため
に libgcc_s.so.1 のインストールが不可欠です。Apache設定ファイルに Load-File /lib/libgcc_s.so.1 を追記するとこの問題は解決します。
| ClearModuleList AddModule mod_security.c AddModule ... AddModule ... AddModule ... |
| ./httpd |
注記
Apache のバイナリと jail の外にサポートファイルを置くことに決めたら、"apachectl graceful"と"apachectl restart"コマンドは、もはや使用する事ができないでしょう。それは Apache が jail の外に達する事を必要とします。それは可能ではありません。Apache 2 や、"apachectl stop" コマンドでさえ働きません。将来のリリースでは、私は、置き換わるスクリプトを作成する為に、この問題の関係で働くでしょう。
注記Apache 2.xでは、モジュール順序を手動で設定する必要はありません。Apache 2.x が既に内部にサポートモジュールを含んでいます。ModSecurityは、chroot が呼ばれ、いつ働くか Apache2.x に正確に伝えるためにこの機能を使用します。(もし、あなたが問題を抱えているなら知らせてください)
このステップは、あなたが jail の内部にログファイルを残すつもりならば、必要ではありません。
| # mkdir -p
/chroot/apache/usr/local # cd /usr/local # mv apache /chroot/apache/usr/local # ln -s /chroot/apache/usr/local/apache |
| SecChrootDir /chroot/apache |
| /usr/local/apache/bin/apachectl
startssl |
注記
chroot 後の jail の場所中に Apache ファイルを残すアプローチの手続きについての記述です。これは 常に働くので推奨アプローチです。そして、chroot から none-chroot への切り替えは非常に簡単です。(単に設定ファイル中の sec-ChrootDir 行をコメントにします)しかしながら、大抵の jail 外部ファイル作成は可能です。しかし、これは更に難しいオプションです。chrootのメカニズムを十分理解する事は、それを正しく行うために必要です。
注記
バージョン1.8以降、ModSecurity が任意の理由で、chrootを実行できない場合、サーバースタートを防止するでしょう。構成段階中に chroot 失敗を検知せず、次にランタイムでそれを検知する場合、エラー・ログ中にそれに関するメッセージを書き、子プロセスから抜けます。これは美しくないかもし れません。しかし、そのような保護を考える場合に、chroot jail の保護なし動作が存在するより良い。
注記
バージョン1.8以降、もし ModSecurity が何らかの理由で chroot を実行しない場合、サーバー起動を防止 します。もし、設定中に chroot 失敗を検知せず、その後ランタイムで検知する場合、エラーログ中にそれに関するメッセージを書き込み、子プロセスを終 了するでしょう。これは美しくないかもしれない。しかし、それは、chroot jail の保護なしで実行する既存の保護より良いと思う。
| CustomLog logs/timer_log "%h
%l %u %t \"%r\" %>s %b - \ %{mod_security-time1}n %{mod_security-time2}n \ %{mod_security-time2}n %D |
| 82.70.94.182 - -
[19/Nov/2004:11:33:52 +0000] "GET /cgi-bin/modsectest. pl HTTP/1.1" 200 1418 - 532 1490 13115 14120 |
| SecFilterDebugLog logs/modsec_debug_log |
| SecFilterDebugLevel 4 |
注記
ModSecurityは内部で9段階のログレベルを使います,しかし、それらはデバッグ目的 だけに役立ちます。
| SecAuditEngine On SecAuditLog logs/audit_log |
| ========================================
Request: 192.168.0.2 - - [[18/May/2003:11:20:43 +0100]] "GET /cgibin/ printenv?p1=666 HTTP/1.0" 406 822 Handler: cgi-script ---------------------------------------- GET /cgi-bin/printenv?p1=666 HTTP/1.0 Host: wkx.dyndns.org:8080 User-Agent: mod_security regression test utility Connection: Close mod_security-message: Access denied with code 406. Pattern match "666" at ARGS_SELECTIVE. mod_security-action: 406 HTTP/1.0 406 Not Acceptable ======================================== |
この時に、監査ログにApache 1.xのエラーメッセージ部分の Handler: 行下を記録します。この行は、、常にError: から始まるでしょう。可能な場合は、この機能性が Apache 2.x モジュールに加えられます。注記
監査ログデータの扱いには気を付けてください。このファイルは、ネットワーク上で受け取られたフィルターされていないバイナリデータを含んでいるかもしれ ません。そのようなデータは、適切に扱われていなければ、危険かもしれません。(例えば、それはターミナルのエスケープシーケンスを含んでいるかもしれま せん。)
注記注記
監査ログ・サブシステムはリクエスト・タイムアウトを記録しません。
| SecAuditLogRelevantStatus ^5 |
| AddType application/x-httpd-php .php |
| AddHandler application/x-httpd-php .php |
注記構成例:
新しい監査ログタイプはmod_unique_idmodule が有効に働く事が不可欠です。
| # Yes, we want to use the new format SecAuditLogType Concurrent # Directory where the files will be stored # MUST NOT BE THE SAME AS THE APACHE LOGS FOLDER SecAuditLogStorageDir /var/www/audit_log/ # The index of all files created SecAuditLog /var/www/audit_log/index # Choose what to log . everything (default is ABCFHZ) SecAuditLogParts ABCDEFGHZ |
| 192.168.2.101 192.168.2.11
- -[15/Jul/2005:11:56:52 +0100] \ "POST /form.php HTTP/1.1" 403 3 "http://192.168.2.101:8080/form.php" \ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 \ Firefox/1.0.4" G3yTd38AAAEAAAM7BLwAAAAA "-" \ /20050715/20050715-1156/20050715-115652-G3yTd38AAAEAAAM7BLwAAAAA 0 1031 \ md5:dc910f6d647d47b32ae6e47326f0ca42 |
| - -67458b6b-A- - [15/Jul/2005:11:56:52 +0100] G3yTd38AAAEAAAM7BLwAAAAA \ 192.168.2.11 4236 192.168.2.101 8080 - -67458b6b-B- - POST /form.php HTTP/1.1 Host: 192.168.2.101:8080 User-Agent: Mozilla/5.0 Accept: */* Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://192.168.2.101:8080/form.php Content-Type: application/x-www-form-urlencoded Content-Length: 5 - -67458b6b-C- - f=111 - -67458b6b-E- - 403 (Response body) - -67458b6b-F- - HTTP/1.1 403 Forbidden Last-Modified: Fri, 08 Jul 2005 14:25:30 GMT ETag: "decb4-3-34b96a80" Accept-Ranges: bytes Content-Length: 19 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html - -67458b6b-H- - Message: Pattern match "111" at POST_PAYLOAD \ [id "1"] [rev "2"] [msg "3"] [severity "4"] Apache-Handler: application/x-httpd-php Stopwatch: 1126536042708000 11024 (7276* 7375 9842) - -67458b6b-Z- - |
注記利用可能な監査ログパーツ:
監査ログデータの扱いには気を付けてください。このファイルは、ネットワーク上で受け取られたフィルターされていないバイナリデータを含んでいるかもしれ ません。そのようなデータは、適切に扱われていなければ、危険かもしれません。(例えば、それはターミナルのエスケープシーケンスを含んでいるかもしれま せん。)
| SecGuardianLog |/path/to/httpd-guardian |
| CustomLog
logs/modsec_custom_log \ "%h %l %u %t \"%r\" %>s %b %{mod_security-message}i" \ env=mod_security-relevant |
| Cookie: innocent=”; nasty=payload; third=” |
| $
./run-test.pl Usage: ./run-test.pl host[:port] testfile1, testfile2, ... |
| # 01 Simple keyword filter # # mod_security is configured not to allow # the "/cgi-bin/keyword" pattern # GET /cgi-bin/keyword HTTP/1.0 |
| # 10 Keyword in POST # POST /cgi-bin/printenv HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-Length: 5 p=333 |
| # 14 Redirect action (requires
302) GET /cgi-bin/test.cgi?p=xxx HTTP/1.0 |
| SecFilter "\.\./" |
| SecFilter
"<script" SecFilter "<.+>" |
| <Location
/cms/article-update.php> SecFilterInheritance Off # other filters here ... SecFilterSelective "ARGS|!ARG_body" "<.+>" </Location> |
| SecFilter
"delete[[:space:]]+from" SecFilter "insert[[:space:]]+into" SecFilter "select.+from" |
| SecFilterSelective ARGS "bin/" |
| SecFilterByteRange 32 126 |
| SecFilterSelective THE_REQUEST "!^[\x0a\x0d\x20-\x7f]+$" |
| <?php // this is the beginning of the page if ($authorised) { // do something protected } // the rest of the page here ?> |
| <Location
"/vulnerable-application/"> SecFilterSelective ARG_authorised "!$^" SecFilterSelective COOKIE_authorised "!$^" </Location> |
注記
Apache 2 バージョンのモジュールのデバッグログは、Modsecurityの全てのリクエストプロセスと個々のルールの時間を表します。
| SecFilterSelective ARG_parameter "!^[0-9]{1,5}$" |
| # Reject requests with header
"Content-Type" set # to "multipart/form-data" SecFilterSelective HTTP_CONTENT_TYPE multipart/form-data # Only for the script that performs upload <Location /upload.php> # Do not inherit filters from the parent folder SecFilterInheritance Off </Location> |
| # Only for the FormMail script
<Location /cgi-bin/FormMail> # Reject request where the value of parameter "recipient" # does not end with "@webkreator.com" SecFilterSelective ARG_recipient "!@webkreator.com$"> </Location> |
| # Turn ModSecurity On SecFilterEngine On # Reject requests with status 403 SecFilterDefaultAction "deny,log,status:403" # Some sane defaults SecFilterScanPOST On SecFilterCheckURLEncoding On SecFilterCheckUnicodeEncoding Off # Accept almost all byte values SecFilterForceByteRange 1 255 # Server masking is optional # SecServerSignature "Microsoft-IIS/5.0" SecUploadDir /tmp SecUploadKeepFiles Off # Only record the interesting stuff SecAuditEngine RelevantOnly SecAuditLog logs/audit_log # You normally won't need debug logging SecFilterDebugLevel 0 SecFilterDebugLog logs/modsec_debug_log # Only accept request encodings we know how to handle # we exclude GET requests from this because some (automated) # clients supply "text/html" as Content-Type SecFilterSelective REQUEST_METHOD "!^(GET|HEAD)$" chain SecFilterSelective HTTP_Content-Type \ "!(^application/x-www-form-urlencoded$|^multipart/form-data;)" # Require Content-Length to be provided with # every POST request SecFilterSelective REQUEST_METHOD "^POST$" chain SecFilterSelective HTTP_Content-Length "^$" # Don't accept transfer encodings we know we don't handle SecFilterSelective HTTP_Transfer-Encoding "!^$ |