clamdscanをcourier-mtaで使う

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] 年金機構の漏洩問題で数日前から話題ですね。

コメントを残す

メールアドレスが公開されることはありません。

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください