[025] Apacheのログを分類して記録する方法

2015年5月21日

当サイトには広告が含まれています。

NimdaやCodeRedなど、wormのlogを別logとして保存します。さらに画像のlogやローカルからのアクセスは残さないようにします。肥大化しがちなlogを、コンパクトに整理しましょう。

Apacheのlog(ログ)

Apacheは広く使われているオープンソースのWEBサーバソフトです。
デフォルトではaccess_log(Win32の場合はaccess.log)にlogを残します。
その中に、下記のようなlogが頻繁に見付かります。

“GET /default.ida?XXXXXXXXXXXXXXXXXXXXX(中略)00%u00=a HTTP/1.0" 404 205
“GET /scripts/..%252f../winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 232
“GET /_vti_bin/(中略)/winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 249
“GET /MSADC/root.exe?/c+dir HTTP/1.0" 404 208
“GET /c/winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 218
“GET /d/winnt/system32/cmd.exe?/c+dir HTTP/1.0" 404 218

これらはワームの攻撃にて残されたlogです。

これらのlogは一般的に長く、正当なアクセスによるlogの中に混じってしまうと、
解析時に邪魔になることがあるので、別logとして記録することにします。
(もちろん、記録しないようにすることも可能)

Apacheの設定ファイルである「httpd.conf」に記述することで行います。

ワームを別logに記録する

logの中に"AAA"という文字列が含まれていればworm.logに記録する場合、

SetEnvIf Request_URI “AAA" worm nolog
CustomLog logs/worm.log common env=worm

となります。
ここでの「common」は、ログの記録形式の指定です。
(commonやcombinedなどがある)

ワームが残したであろうlogを見て、特徴的な部分を"AAA"に記します。

例えば

SetEnvIf Request_URI “default.ida" worm nolog
SetEnvIf Request_URI “root.exe" worm nolog
SetEnvIf Request_URI “cmd.exe" worm nolog
SetEnvIf Request_URI “Admin.dll" worm nolog
SetEnvIf Request_URI “mem_bin" worm nolog
SetEnvIf Request_URI “vti_bin" worm nolog
SetEnvIf Request_URI “MSADC" worm nolog
SetEnvIf Request_URI “scripts" worm nolog

のようになります。

新しいワームが登場した際には、上記を追記していくことで対応可能です。

画像ファイル等の除外

デフォルトではlogは画像やcss(スタイルシート)のアクセスも記録します。

つまり、1ページのアクセスであっても、それが画像5枚とcssを1つ含む場合、
合計7行のlogが残ることになり、logは膨れ上がっていきます。

そこで、画像やcssのlogを記録しないように設定します。
画像の拡張子を*.gif,*jpg,*.pngとし、cssの拡張子を*.cssとすれば、

SetEnvIf Request_URI “¥.(gif)|(jpg)|(png)|(css)$" nolog

と指定します。
上の例ならば、1行のlogが記録されるだけで済みます。

ローカルからのアクセスを除外

IPアドレスを指定することで、そこからのアクセスをlogに残さないようにできます。
これを使い、ローカルからの(自分の)アクセスを記録しないようにします。

SetEnvIf Remote_Addr 192.168.0.10 nolog
SetEnvIf Remote_Addr 192.168.0.20 nolog
SetEnvIf Remote_Addr 127.0.0.1 nolog

行儀の悪いUser-Agentを除外する

コンテンツを一気に収集するソフトは、大量のデータを短期間で得ようとしますから、
他の閲覧者の妨害になることがあります。

robots.txtで制限をしても、無視してくる(or robots.txtを読まない)、
行儀の悪いものもあります。

そこで、これらのUser-Agentのアクセスを禁止(403)し、さらにlogを分けましょう。

まずは、除外するUser-Agentを宣言し、403にします。

SetEnvIf User-Agent “blogWatcher_Spider" badrobot
SetEnvIf User-Agent “Pockey-GetHTML" badrobot

<Files *>
Order allow,deny
Allow from all
Deny from env=badrobot
</Files>

次に、これらのlogを別ファイルとして記録します。
(もちろん、記録しないようにすることも可能)

記録する場合は、上で403としていますので、403として記録されます。

まとめ

組み合わせると、以下のようになります。

# 画像、スタイルシートのアクセスはログに記録しない。
SetEnvIf Request_URI “¥.(gif)|(jpg)|(png)|(css)$" nolog

# ワームはworm.logに記録し、access.logには記録しない。
SetEnvIf Request_URI “default.ida" worm nolog
SetEnvIf Request_URI “root.exe" worm nolog
SetEnvIf Request_URI “cmd.exe" worm nolog
SetEnvIf Request_URI “Admin.dll" worm nolog
SetEnvIf Request_URI “mem_bin" worm nolog
SetEnvIf Request_URI “vti_bin" worm nolog
SetEnvIf Request_URI “msadc" worm nolog
SetEnvIf Request_URI “MSADC" worm nolog
SetEnvIf Request_URI “scripts" worm nolog

# ローカルからのアクセスはログに記録しない。
SetEnvIf Remote_Addr 192.168.0.10 nolog
SetEnvIf Remote_Addr 192.168.0.20 nolog
SetEnvIf Remote_Addr 127.0.0.1 nolog

# 指定したUser-Agentからのアクセスはbadrobot.logに記録し、
# access.logには記録しない。
SetEnvIf User-Agent “Pockey-GetHTML" badrobot nolog

# ワームはworm.logに記録する。
CustomLog logs/worm.log common env=worm
(詳細まで取る必要がないので「common」としている)

# 指定したUser-Agentからのアクセスはbadrobot.logに記録する。
CustomLog logs/badrobot.log common env=badrobot
(詳細まで取る必要がないので「common」としている)

# 上記で除外したアクセスはaccess.logに記録する。
CustomLog logs/access.log combined env=!nolog
(必要なlogなので、詳細まで取るために「combined」としている)

先に除外する条件を指定し、それを抜けたものがaccess.logに記録されるわけです。

logは知らぬ間に膨大になりますから、不要なlogは取らないようにしておきましょう。

更新履歴