Apache Tips

Apache を使っていていて便利だったことや役立つこの備忘録です.

Nimda & Code Red 対策

Nimda や Code Red は IIS に感染するワームなので Apache には一見関係がなさそうですが, その感染数のためか鬱陶しいログがたくさん残ります.そこでログを分離します.

Nimda は root.exe cmd.exe を含むリクエストをします.また,Code Red は default.ida を含むリクエストをします. そこで Apache のモジュールである SetEnvIf を使ってログを分離します.

 
<IfModule mod_setenvif.c>
SetEnvIf Request_URI "default\.ida" worm
SetEnvIf Request_URI "cmd\.exe" worm
SetEnvIf Request_URI "root\.exe" worm
</IfModule>

CustomLog logs/access_log combined env=!worm
CustomLog logs/worm_log combined env=worm

これは要求された URI に default.ida cmd.exe root.exe が含まれていたら env を worm として, env が worm でないとき通常のログに書き込み,env が worm であるとき worm_log に書き込みます.

エラー表示の変更

例えば,要求したファイルが存在しないとき Apache は 404 error を返します. しかし,これでは少し味気が無さすぎます.トップへのリンクくらいは欲しいところです. そこでちょっとしたスクリプト(CGI)を作りました.このスクリプトは主に, 401 403 404 500 エラーに対応しています.使い方は Apache のドキュメントルートの適当なところにおいて, 404 ならば,[スクリプト名]?404 と呼び出すだけで OK です.以下に設定例を示します.

 
スクリプトのファイル名は error.cgi としています
ErrorDocument 500 "/path/to/file/error.cgi?500"
ErrorDocument 404 "/path/to/file/error.cgi?404"
ErrorDocument 403 "/path/to/file/error.cgi?403"
ErrorDocument 401 "/path/to/file/error.cgi?401"

.html にも SSI を

サイトを構築してからしばらくして SSI を使いたくなりました.通常,SSI はファイル名が .shtml のものに適用されます. ファイル名を変える手間はたいしたことありませんが,リンクを張りなおす手間を考えると億劫になります. だからといって,.html で SSI が使えるようにするのも節操が無さすぎます.そこで XBitHack の登場です. XBitHack on とすることにより,実行属性の付いた HTML ファイルで SSI を実行できるようになります.

 
AddType text/html .shtml
AddHandler server-parsed .shtml
XBitHack on

ちょっとした認証

Apache では Basic 認証という簡単な認証で特定のディレクトリにパスワードをかけることが出来ます. 例として,hogehuga というディレクトリに認証をつけてみましょう.

 
ユーザ名とパスワードの入ったファイルを作成します
-c が新規作成(Create),第2引数がファイル名,第3引数がユーザ名です
# htpasswd -c hogehuga hage
出来上がった hogehuga というファイルを適当な場所へコピーします
くれぐれもドキュメントルート下に置かないこと
# mv hogehuga /etc/apache2/usr

httpd.conf の適当なところに以下を追加します
<Location "/hogehuga">
AuthType Basic # 認証を Basic とする
AuthName "Users for hogehuga" # ブラウザの題名になる
AuthUserFile /etc/apache2/usr/hogehuga # ファイルの在り処(絶対パスで)
require valid-user # 認証されたユーザのみ許可
</Location>

.htaccess を使うときは認証したいディレクトリに,hogehuga を .htpasswd として制限をかけたいディレクトリに置き, .htaccess に上に記述した設定を書きます.(<Location "/hogehuga"></Location>はいりません)

worm はどこから?

nimda や Code Red のログを分離できるようになったものの,それだけではつまらなくなってきました. そこで,どこからのお客さまなのか調べることにしました.具体的にいうと,IP のみのログを取り, そこから,CCTLD を出すという方法です.IP から CCTLD を出力するのに,不正アクセスの発信地の国別統計をとろう! というサイトのスクリプトを使用しました.まず最初に worm の IP のみのログを作ります.

 
Apache の LogFromat に IP のみ書く設定を追加
LogFormat "%a" ip_address

そして worm の IP を取り出したログを作る
CustomLog logs/worm_log_ip ip_address env=worm

このログは結構大きくなるので,logrotated などできちんと管理しましょう.つぎに,IP を CCTLD に変換します.

 
/usr/local/ip2cctld に 
http://www.mtl.t.u-tokyo.ac.jp/~nminoru/memo/ip-address/what_country_from.html からのファイル
count_cctld.pl what_country.pl ipaddr_to_cctld.txt をおくとして
/usr/local/ip2cctld に以下のようなスクリプトを置きます.

#!/bin/sh

cd /usr/local/ip2cctld
cat /usr/local/apache2/logs/worm_log_ip* | ./what_country.pl | ./count_cctld.pl > access.txt
cat /usr/local/apache2/logs/worm_log_ip* | sort -u | ./what_country.pl | ./count_cctld.pl > host.txt
cp access.txt host.txt /home/httpd/html/server/worm
chown -R httpd.users /home/httpd/html/server/worm

* コピー先及びログのディレクトリは環境に合わせて適宜変更してください.

このスクリプトを cron に登録して適当な時間に更新します.当サーバでは 午前3時にしました.以下が結果です.
現在はバーチャルホストの設定により,直接 IP でアクセスしてくる類のワームはログに記録されなくなっています.Code Red や Nimda もその例に洩れず,最近はログから姿を消しているようです.

更新日2008/11/13 00:44 アクセス数集計


更新日2008/11/13 00:44 ホスト数集計


CCTLD がどこの国を指してるか判らないときは IANA | Root-Zone Whois Index by TLD Code を見れば大体判るはずです.