さっき書き終わったばかりですが、egrep についての訂正です。アップロードしていないので普通に書き換えてもいいのですが、日時も設定しちゃったので。
|
はエスケープしないと怒られると書きましたが、正規表現を シングルクォーテーションで括れば大丈夫でした。ダブルクォーテーションで括ったらエラーになったので、括っても駄目だと思い込んでいました。また、エラーログファイルのほうには過去記録されたワームによるエラーが記録されたままになってしまいますが、egrep のオプションの -v を使うことで、正規表現に一致しない行を抽出することが出来ました。一旦別のファイルに結果を書き出しておき、再び戻すかリネームするとワームと関係ないエラーのみが残ります。直接 grep の結果を自分に戻すことも出来そうなのですが、下手をすると全て亡くなる危険性があったので、念のため別のファイルを経由しました。
相変わらず CodeRed や Nimda などのワームが猛威を振るっています。ローカルサーバのエラーログの9割以上がこれです。鬱陶しくて専用のログファイルに記録するようにしましたので、覚書を兼ねた解説です。
まず、前提としてサーバは Apache です。2.0 が既に使えますが、移行が面倒なのと互換性が気になるのでまだ 1.3x のままです。OS は FreeBSD(98) 4.5R-rev01 ですが、やり方には影響しないでしょう。
初めに必要なのは、モジュール mod_setenvif と mod_log_config を有効にしておくことです。この2つの機能を使うので、確実に有効にしてください。
まずは、mod_setenvif の機能を使ってワームかどうかの判別処理を追加します。構文については先ほどのリンク先にある説明を見てください。記述箇所は、<IfModule mod_setenvif> と 直後の </IfModule> の間で、私は以下のようにしました。
SetEnvIf Request_URI "default\.ida" worm
SetEnvIf Request_URI "cmd\.exe" worm
SetEnvIf Request_URI "root\.exe" worm
SetEnvIf Request_URI "Admin\.dll" worm
これで、CodeRed や Nimida によるアクセスの場合は環境変数 worm が作られ、その値は 1 になります。もし新たな攻撃をするワームが現れても、その特徴となる文字列を追加指定してやれば済みます。
次に、ログファイルの振り分けです。振り分けには環境変数を使いますが、当然先ほど SetEnvIf で設定した worm を使います。変更箇所は、CustomLog ログファイル名 ログフォーマット名 となっているところです。仮に、ログファイル名を /var/log/www/access.log 、ログフォーマット名を combined とします。
変更前
CustomLog /var/log/www/access.log combined
変更後
CustomLog /var/log/www/worms.log combined env=worm
CustomLog /var/log/www/access.log combined env=!worm
変更後の1行目がワームによるアクセスの場合、2行目がそれ以外です。これで、ワームによるアクセスは /worms.log に記録され、それ以外で正常なアクセスは access.log に記録されます。
ここまで書き終わって、変更の効果は出たかなとログファイルを覗いてみましたが、肝心なときにと言うかなんと言うか、ワームによるアクセスはなかったようで、ファイルは空っぽでした。せっかくなので、ついでにエラーログのワームによる行だけを抽出しておくことにしました。なれた人は既に予想はついているかもしれませんが、grep(複数一致をさせたいので、実際には egrep を使いました。)を使います。コマンドは以下の通り。
egrep /default\.ida\|cmd\.exe\|root\.exe\|Admin\.dll/ エラーログファイル > ワームログファイル
|
ではなく \|
です。エスケープをしないと、パイプとして処理されてしまいます。cmd.exe がないと怒られてしまい、これではワームの出すエラーログと同じようでしゃれになりません。変な仕様ですが、こういうものだと思って使うしかないのでしょう。とりあえず、今回はここまで。