ネットワークやシステムのセキュリティを維持するために,ウイルス対策は今や不可欠である。ウイルス対策としてまず考えられるのが,アンチウイルス・ソフトの導入であるが,万全ではない。新しく出現したウイルスにはすぐに対応できない場合があるからだ。その場合に有用なのが,メール・サーバーやメール・エージェントを利用したコンテンツ・フィルタリングである。アンチウイルス・ソフトが対応するまでの間,特定のウイルス添付メールの侵入を防ぐことができる。今回のコラムでは,「procmail」によるコンテンツ・フィルタリングを,できるだけ具体的に紹介する。

アンチウイルス・ソフトの弱点

 現在では,電子メールを介して感染を広げるウイルスがほとんどである。その対策としては,(1)アンチウイルス・ソフトを導入する,(2)添付ファイルをむやみに実行しない,(3)ウイルスの影響を受けない電子メール・クライアントを利用する――といったものが一般的である。

 このうちシステムで実現できるものとして各企業で進められているのが,アンチウイルス・ソフト――特に,ゲートウエイ型――の導入である。しかし,アンチウイルス・ソフトには弱点がある。新しく出現したウイルスについては,アンチウイルス・ベンダーがそのウイルスに対応した定義情報(「ウイルス定義ファイル」や「パターンファイル」などと,ベンダーによって呼び名が異なる)を公開するまでは検出することができない。

 例えば,7月15日に出現した「Frethem」ウイルスの変種は,定義情報が公開されるまでの数時間に,急激に感染を広げた(関連記事)。アンチウイルス・ソフトだけに依存すると,このような事態に対応できないのである。そこで,アンチウイルス・ソフトを補強する対策が求められる。

アンチウイルス・ソフトだけに頼らない

 ゲートウエイやプロキシなどでトラフィックの内容(コンテンツ)をチェックし,ポリシーに基づいてその流入あるいは流出を制御することをコンテンツ・フィルタリングと呼ぶ。例えば,Webプロキシにおいて,管理者が意図しないコンテンツ(例えば性的描写が含まれるもの)へのアクセスを,URLなどに基づいて禁止することは,今日ではある程度身近になっているコンテンツ・フィルタリングである。

 ゲートウエイ型アンチウイルス・ソフトが実施するウイルス・チェックも,コンテンツ・フィルタリングの一種である。ウイルス定義情報とメールに添付されたファイルの特徴を比較し,合致すればそのメールの配送を制御する。

 しかし上述のように,アンチウイルス・ベンダーがウイルスに関する定義情報を公開するまでの間,一時的ではあるがフィルタリングに“空白期間”が生じてしまう。そこで,この空白期間をできるだけ短くするために,アンチウイルス・ソフト以外によるコンテンツ・フィルタリングが必要となる。

 具体的には,メールを配送あるいは配信する「MTA(Mail Transfer Agent)」*1 あるいはMDA(Mail Delivery Agent)*2 でコンテンツ・フィルタリングを行う。これらを利用すれば,SMTP(Simple Mail Transfer Protocol)の「DATA」コマンドでやり取りされる内容――例えば,「To:」「From:」「Subject」「MIMEヘッダー」および本文――でフィルタリングすることが可能となる。

 ウイルスの中には,それが添付されたメールのSubject(件名)や本文が特徴的であるものも多い。それらでフィルタリングすれば,ウイルス対策としてのコンテンツ・フィルタリングが可能となるのだ。

*1 MTA(Mail Transfer Agent):メールを配送するためのプログラム。メール・サーバー・ソフトなどとも呼ばれる。メール・サーバー間でのメールの転送や,転送されてきたメールの各ユーザーへの配信といった機能を持つ。実際の郵便で考えれば,郵便局間の配送を受け持つ郵便局にあたる。代表的なMTAとしては,sendmail や qmail,postfix,Microsoft Exchangeなどが挙げられる。

*2 MDA(Mail Delivery Agent):MTA のメール・キューから,ユーザーのメール・ボックスにメールを配信するプログラム。実際の郵便では,郵便配達人に相当する。MTAの機能の一部として実装されていることも多い。具体的には,「/bin/mail」や「/bin/mail.local」,「qmail-local」などがこれにあたる。

procmailのフィルタリング機能を活用する

 それでは次に,フィルタリングのための設定を具体的に紹介する。今回採り上げるのは,MDAの一つである「procmail」である。procmailは Solaris や HP-UX,AIXなどの商用UNIX をはじめ,Linux や FreeBSD,OpenBSD などでも動作する。加えて,設定も容易なので“題材”としては適しているだろう。

 procmailでフィルタリングを行うには,その設定ファイルである「.procmailrc」を作成し,必要な情報を記述しなければならない。.procmailrcは各ユーザーのホーム・ディレクトリに置かれる。

 手順としては,まずホーム・ディレクトリに.procmailrcを作成する。次に,.procmailrc内に必要な環境変数とフィルタリングの内容を記述する。フィルタリングの内容は「レシピ」と呼ばれ,1つの動作を3行で示す。具体的には,次のようになる。

◆.procmailrc の基本形
--------------------------------------------------------------
:0       #レシピの始まり
*^From ABCDE
ABCDE/
--------------------------------------------------------------

 上記のレシピは,「本文内の From:(Fromヘッダー)に,『ABCDE』という文字列が含まれている場合には,『ABCDE』ディレクトリへそのメールを転送する」という意味である。

 なお,MTAとして sendmail を使っている場合には,ユーザーに配送されたメールをprocmail にわたすために,「.forward」ファイルに次の行を記述する必要がある。

◆.forward に追記
--------------------------------------------------------------
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #{username}”
--------------------------------------------------------------

 .forward ファイルとは,各ユーザーのホーム・ディレクトリに置かれた,sendmailの設定ファイルである。

Frethem対策の設定例

  次に,ウイルス添付メールをフィルタリングするための,設定ファイルの記述例を紹介する。今回のコラムでは,7月に流行したFrethemウイルス用の設定ファイルを紹介する。Frethemには多数の変種(亜種)が出現しているので,ここでは「W32.Frethem.J@mm」(アンチウイルス・ベンダーのシマンテックによる命名)を採り上げる。

◆W32.Frethem.J@mm 対策のための .procmailrc の例
--------------------------------------------------------------
VERBOSE=on
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=/usr/home/abc/Mail
LOGFILE=/usr/home/abc/Mail/log
LOCKFILE=/usr/home/abc/Mail/.Lockfile
DEFAULT=$MAILDIR
SHELL=/bin/sh
PMDIR=/usr/home/abc/.procmail

#Frethem CHECK.
:0
* ^Subject:.*Re:.*Your password!
{
    :0
    * ^Content-Type: multipart/mixed;
    {
        :0B
        *filename=\/".*\.exe"
        /usr/home/abc/Mail/virus
    }
}


#VIRUS CHECK.
:0
* ^Content-Type: multipart/mixed;
{
    :0B
    *filename=\/".*\.(bat|exe|com|vbs)"
    /usr/home/abc/Mail/virus
}
--------------------------------------------------------------

 上記設定の意味は以下の通りである。

  • 「W32.Frethem.J@mm」を添付している疑いがあるメール(Subjectが「Re:Your password!」で,MIMEヘッダー「Content-Type: multipart/mixed」であり,添付ファイルの拡張子が.exe)を /usr/home/abc/Mail/virus ディレクトリへ配送する
  • ウイルスである可能性があるファイルを添付しているメール(MIMEヘッダー「Content-Type: multipart/mixed」であり,添付ファイルの拡張子が.bat .exe .com .vbs のいずれか)を /usr/home/abc/Mail/virus ディレクトリへ配送する

万全ではないフィルタリング,スクリプトで対処

 一見すると,上記の .procmailrc で Frethemをきちんとフィルタリングできるようだが,実は万全ではない。というのも,メールに含まれる文字列のチェックに,正規表現によるマッチングを行っているために,ウイルスを添付していないメールまでフィルタリングしてしまう恐れがあるのだ。

 そこで,フィルタリングしたメールの中から,正規のメールを選別する必要がある。その選別処理には,シェル・スクリプトの利用が有効だ。以下に示すシェル・スクリプトを,cronで定期的に実行すれば,誤ってウイルスと判断したメールを復旧できるとともに,処理のログを残すことができる。

◆シェル・スクリプト logcheck
--------------------------------------------------------------
#!/bin/sh
PATH=/bin:/usr/bin
# Log file
LOGFILE=/usr/home/abc/Mail/log
# The file for recording a character
LOGA=/usr/home/abc/Mail/logcpy
LOGB=/usr/home/abc/Mail/log.old
# The address which sends mail
ADDRESS=log-check@localhost
# Performed time
DATE=`/bin/date`

# Log file Check.
if [ ! -f $LOGFILE ] ; then
  echo "There is no log file." > /dev/stderr
  exit 1
fi

# Check the file for recording a character
if [ ! -f $LOGA ] ; then
  /usr/bin/touch $LOGA
  echo "$LOGA was created." > /dev/null
fi
if [ ! -f $LOGB ] ; then
  /usr/bin/touch $LOGB
  echo "$LOGB was created." > /dev/null
fi

# Initialization of a file
/bin/cp /dev/null $LOGA

# Delete a unnecessary line.
/usr/bin/grep -v "^procmail" $LOGFILE > $LOGA

# Send mail.
(/bin/date; echo; /usr/bin/diff $LOGA $LOGB | /usr/bin/mail $ADDRESS -s LOG_CHECK_ALL_LOG)

# Move the file.
/bin/cp $LOGA $LOGB

# Delete the file.
/bin/rm $LOGA

# Chenge permission
/bin/chmod 600 $LOGB

# Finish!
exit 0
--------------------------------------------------------------

 上記のスクリプトでは,以下の処理を行っている。

  1. .procmailrcが出力した最新のログ・ファイルをlogA($LOGA),前回処理したログ・ファイルをlogB($LOGA)とする
  2. diffで差分をとり,logAとlogBを比較する
    1. 同じ場合には,何もしない
    2. 異なる場合には,差分を抽出し,「From」「Subject」「Folder」の情報を抜き出す。そして,抜き出した情報を自分あてにメールで送信する
  3. logBにlogAを上書きする
  4. logAを削除する
  5. logBのパーミッションを「600」にする

 なお,上記スクリプト「logcheck」をcronで定期的に実行するには,cronの設定ファイルである「crontab」に次の一行を加える必要がある(ユーザーIDが「abc」,logcheckが/usr/home/abc/ディレクトリに置かれている場合)。

◆ユーザー abc の crontab に追記
--------------------------------------------------------------
10 * * * * abc /usr/home/abc/logcheck
--------------------------------------------------------------

◇     ◇     ◇     ◇     ◇     ◇

 今回紹介したフィルタリング設定はあくまでも一例であり,応用すればより複雑なフィルタリングも可能になる。新しく出現したウイルス対策は時間との勝負である。アンチウイルス・ベンダーから定義情報が公開されるのを座して待つよりも,今回紹介したようなフィルタリングを試すことをお勧めしたい。特にFrethemのように,ウイルスを添付したメールの特徴が明らかで,なおかつ感染拡大が早いウイルスには効果的だ。


阿部正道 (ABE Masamichi) masamichi.abe@lac.co.jp
石山和行 (ISHIYAMA Kazuyuki) kazuyuki.ishiyama@lac.co.jp
株式会社ラック セキュアネットサービス事業本部


 IT Proセキュリティ・サイトが提供する「今週のSecurity Check [一般編]」は,その週に起きたUNIX関連およびセキュリティ全般のニュースや動向をまとめた週刊コラムです。セキュリティ・ベンダーである「株式会社ラック」のスタッフの方を執筆陣に迎え,専門家の立場から解説していただきます。