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