clamdscan は clamav というウィルススキャナのdaemonを使って、メールなどのウィルスのチェックをするものです。Courier-mtaを使っていると多くの場合mailfilter を使ってローカルデリバリーをしていると思います。clamav を使うのに一番簡単そうなのは、この設定ファイル .mailfiter に設定してここから使うこと[1]だと思うのですが、そうすると
lstat() failed: Permission denied. ERROR
のようなエラーが出てしまい、うまく生きません。これは、clamdがユーザclamdの権限で走っているために、メールファイルが読めないということのようです。
これを回避するには、clamdscanではなくclamscanにすれば良いのですが、毎回ウィルスDBをロードするのでパフォーマンスが悪すぎます。
結局、数時間調べるのにかかってしまったのですが、一番参考になったのは「HOWTO_Install_Courier_with_maildrop_and_ClamAV_and_SpamA」という記事でした。
これによると、まず次のような /usr/bin/clamdscan.sh を用意します。
#!/bin/bash
# Created by Tom Walsh, slim at ala.net
# slightly modified by Wolfgang Ziegler, nuppla at gmx.at
# RUN=clamscan
# Enable this line, if you are using the clamav-daemon.
RUN=clamdscan
#start
MSG=$(< /proc/self/fd/0) # stdin -> $MSG
SCAN=$(echo "$MSG" | $RUN - --stdout --disable-summary)
EXIT="$?"
VIRUS=$(echo "$SCAN" | awk '{print $2}')
SUBJECT=$(echo "$MSG" | reformail -x Subject:)
if [ "$EXIT" == "1" ]; then
SUBJECT="**VIRUS** [$VIRUS] $SUBJECT"
MSG=$(echo "$MSG" | reformail -i"X-Virus-Status: INFECTED")
MSG=$(echo "$MSG" | reformail -i"Subject: $(echo "$SUBJECT")")
else
MSG=$(echo "$MSG" | reformail -i"X-Virus-Status: CLEAN")
fi
echo "$MSG"
exit 0
このファイルを実行可能にします。
chmod +x /usr/bin/clamscan.sh
その上で、.mailfilterに以下を追加します。
MAILDIR="$HOME/Maildir"
DEFAULT="$MAILDIR"
FOLDERS="$DEFAULT/."
SPAM="${FOLDERS}junk"
CLAMDSCAN="/usr/bin/clamdcan.sh"
`${CLAMDSCAN}`
if ( /^X-Virus-Status:.*INFECTED/ )
{
log "Clamdscan: Virus found\n"
to $SPAM
}
たぶん、これで動いているかな…。Clamav は一応zipの中味まで見てくれるので、その点が良いですね。
.exe とかの添付が付いたメールだけをを叩き落とすだけ[2]なら、何もclamavにご登場いただくまでもなく、次のような感じでよいです。
# attachments are in the body, so :b flag
if ( /^Content-type: (audio|application)/:b \
&& /name=.*\.(bat|com|exe|hta|pif|scr|shs|vb[es]|ws[fh])/:b )
{
xfilter "${REFORMAIL} -a'$SPAMHEADER potential virus attachment'"
log "Illegal Extention\n"
to $SPAM
}
絶対こういうメールは受け取ら無いぞという場合、to $SPAMでなくてexitしてしまっても良いのですが、本文だけは読みたいこともありますものね。reformailでattachmentセクションを落とすというのもありそうですが、サボっててやっていません。
でわでわ
[1] メールサーバ自体に入れろよと言うのもありますが、個人レベルだとこっちの方が簡単だったので。perlmailfilter 使ってやるのも、テスト用サーバを建てたりする余裕ができたらやってみます。
[2] 年金機構の漏洩問題で数日前から話題ですね。