OSSECの話題に触発されて、OSSECで独自のルールを定義する方法について書いてみます。
OSSECとOSのバージョンは以下のとおりです。
OSSEC: 2.8.3
OS: Ubuntu 14.04
既存のルールを変更する
OSSECを利用していると通常の操作を攻撃として検知してしまうことがあります(偽陽性の発生)。
例えばWEBアプリケーションからの連続したPOSTが攻撃とみなされることがありました。
OSSECのアラートを見ると、ルールIDが31533のルールにひっかかったことがわかりました。
Received From: hogehoge->/var/log/apache2/access.log Rule: 31533 fired (level 10) -> "High amount of POST requests in a small period of time (likely bot)."
1. ルールの確認
ルールIDが31533のルールは rules/web_appsec_rules.xml に定義されています。
<rule id="31533" level="10" timeframe="20" frequency="6"> <if_matched_sid>31530</if_matched_sid> <same_source_ip /> <description>High amount of POST requests in a small period of time (likely bot).</description> </rule>
同じ送信元IP(same_source_ip)から20秒以内(timeframe)に12回(frequencyに定義された回数*2)ルールIDが31530のルールにマッチするリクエストがあったことを検知するルールのようです。
ルールIDが31530のルールは同じファイルに定義されています。
<rule id="31530" level="3"> <if_sid>31100</if_sid> <match>] "POST </match> <options>no_log</options> <description>POST request received.</description> </rule>
ルールIDが31100のルールかつ「] “POST 」にマッチするログを検知するようです。
アラートを受け取ったルール(31533)は、連続POSTに対するルールだということがわかります。
ルールIDが31100のルールは rules/web_rules.xml に定義されおり、ログの解析対象がアクセスログであることを定義しています。
<rule id="31100" level="0"> <category>web-log</category> <description>Access log messages grouped.</description> </rule> </pre>
2. ルールの変更
WEBアプリの通常の操作で、同じIPアドレスから20秒以内に12回以上のPOSTを実行する可能性がある場合、31533のルールを変更する必要があります。
短時間での連続したPOST自体は検知したいので、検知する時間枠を20秒から15秒に変更することにしました。
rules/local_rules.xml にルールを定義します。
(31533のルールが定義されているファイルは直接編集しません。)
<group name="local,web,appsec,attack,"> <rule id="31533" level="10" timeframe="15" frequency="6" overwrite="yes"> <if_matched_sid>31530</if_matched_sid> <same_source_ip /> <description>High amount of POST requests in a small period of time (likely bot).</description> </rule> </group>
「overwrite=”yes”」とすると既存のルールを上書きします。
31533のルールの「timeframe」を20から15にすることで時間枠を15秒に変更しました。
「group」はアラートを分類するためのグループです。
今回は「local」と31533のgroupと同様の「web,appsec,attack」を定義した「group」内にルールを定義しました。
rules/local_rules.xml にルールを定義したら、OSSECを再起動してください。
新規のルールを定義する
先ほど変更したルール(31533)は、31530のルールにマッチするすべてのPOSTについて、同じIPアドレスからの連続POSTを検知するものでした。
では、31530のルールにマッチするPOSTについて、同じIPアドレスから特定URLへの連続POSTを検知できるようにするにはどうすればよいでしょうか?
新しいルールを rules/local_rules.xml に定義します。
<rule id="100041" level="10" timeframe="60" frequency="3"> <if_matched_sid>31530</if_matched_sid> <url>/users</url> <same_source_ip /> <description>Multiple login challenge from same source ip.</description> </rule>
「/users」に一致するURLに対して、同じIPアドレスから60秒以内に6回、31530のルールにマッチするリクエストがあったことを検知します。
上記の例は、「/users」へのリクエストが31530のルールにマッチすることが前提となっていますが、検知したいログがどのルールIDにマッチするのか(マッチするルールがないのか)は、 bin/ossec-logtest で確認することができます。
# ./bin/ossec-logtest 2016/10/14 18:09:25 ossec-testrule: INFO: Reading local decoder file. 2016/10/14 18:09:25 ossec-testrule: INFO: Started (pid: 20110). ossec-testrule: Type one log per line. 192.168.1.XX - - [14/Oct/2016:16:34:13 +0900] "POST /users/XXXX HTTP/1.1" 302 1297 "http://192.168.1.XX/users" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36" **Phase 1: Completed pre-decoding. full event: '192.168.1.XX - - [14/Oct/2016:16:34:13 +0900] "POST /users/XXXX HTTP/1.1" 302 1297 "http://192.168.1.XX/users" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"' hostname: 'hogehoge' program_name: '(null)' log: '192.168.1.XX - - [14/Oct/2016:16:34:13 +0900] "POST /users/XXXX HTTP/1.1" 302 1297 "http://192.168.1.XX/users" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"' **Phase 2: Completed decoding. decoder: 'web-accesslog' srcip: '192.168.1.XX' url: '/users/XXXX' id: '302' **Phase 3: Completed filtering (rules). Rule id: '31530' Level: '3' Description: 'POST request received.'
※一部伏字になっています。
bin/ossec-logtest を実行し、検知したいログを貼り付けるとデコーダーやルールIDを確認することができます。
OSSECのルールやルールの構文の詳細については公式ドキュメントを参照してください。
http://ossec.github.io/docs/