masaharu@mutsuyoshi.net
2004/01/05

procmail によるスパムメール撃退対策

スパムメール対策として、.procmailrc をこんな設定にしています。

(正規表現が冗長なのは許してください)

SHELL=/bin/sh
PATH=/usr/local/bin:/opt/sfw/bin:/usr/bin:/bin
CONFDIR=/export/home/mailuser/masaharu
LOGFILE=/export/home/mailuser/masaharu/var/log/procmail
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
NGWORD=$CONFDIR/procmail-bwd
NGEXT=$CONFDIR/procmail-ext
BLACKLIST=$CONFDIR/black-list

To: か Cc: に5つ以上、小生と同じプロバイダと同じドメインが、含まれる場合はスパムとみなすレシピ

:0 H
    * 9876543210^0 ^To:\/.*@プロバイダのドメイン
    * 9876543210^0 ^To:\/<.*@プロバイダのドメイン>
    * ? echo "$MATCH" | perl -pe 's/[<>[:space:]\r\n]//g' | egrep '@プロバイダのドメイン,.*@プロバイダのドメイン,.*@プロバイダのドメイン,.*@プロバイダのドメイン,.*@プロバイダのドメイン'
    {
         EXITCODE=67
         :0
         /dev/null

    }

:0 H
    * 9876543210^0 ^Cc:\/.*@プロバイダのドメイン
    * 9876543210^0 ^Cc:\/<.*@プロバイダのドメイン>
    * ? echo "$MATCH" | perl -pe 's/[<>[:space:]\r\n]//g' | egrep '@プロバイダのドメイン,.*@プロバイダのドメイン,.*@プロバイダのドメイン,.*@プロバイダのドメイン,.*@プロバイダのドメイン'
    {
         EXITCODE=67
         :0
         /dev/null

    }

ウィルスをバラ撒きまくっている馬鹿の証拠収集。
エラーメールで返すと From 宛になるので特別なフォルダに入れて、正常終了。

:0 H
* ^Return-Path:.*\/.*
* ? echo "$MATCH" | egrep ウィルス付メールを数ヶ月もバラ撒きまくってる馬鹿のメールアドレス
{
     EXITCODE=0
     :0
    baka-error
}

メッセージIDに、自宅サーバのドメインが含まれているにも拘らず、Return-Path が自宅サーバ以外の場合はスパムとみなすレシピ。

:0 H
* ^Message-Id:.*mutsuyoshi.net
{
     :0 h
    * ! ^Return-Path:.*mutsuyoshi.net.*
     {
         EXITCODE=67
         :0
         /dev/null
     }
}

Subject: に禁止ワードが含まれる場合は、スパムとみなす。

:0 H
* ^Subject:.*\/.*
{
     DECWORD=$MATCH
     :0 h
     * ^Subject:.*
     DECWORD=|echo "$MATCH" | nkf -me

     :0 h
     *$ ? test -s $NGWORD
     * ? echo $DECWORD | procmail-sub -w $NGWORD
     {
        EXITCODE=67
        :0
        /dev/null
     }
}

特定の拡張子が添付されているメールは、スパムとみなすレシピ(ウィルス対策)

:0 B
* (filename|name)=.*\/.*
{
    DECEXT=$MATCH
    :0 b
    * (filename|name)=.*
    DECEXT=|echo "$MATCH" | nkf -me
    :0 b
    *$ ? test -s $NGEXT
    * ? echo $DECEXT | procmail-sub -e $NGEXT
    {
         EXITCODE=67
         :0
         /dev/null
     }
}

特定のアドレスから送付されているメールは、スパムとみなすレシピ

#
BLACKLIST=$HOME/.blacklist
#
:0
* ? test -s $BLACKLIST
* ? (formail -x From: -x Reply-To: -x Sender: -x From: -x Return-Path: | fgrep -iqf $BLACKLIST)
{
     EXITCODE=67
     :0
     /dev/null

}

特定のドメインから送付されているメールは、スパムとみなすレシピ

:0 H
* ^From:.*colonize.com
* ^From:.*2mediaz.com
* ^From:.*kawaneba.net
* ^From:.*hosyou.net
* ^From:.*oshirase.biz
{
     EXITCODE=67
     :0
     /dev/null
}

:0 H
* ^Return-Path:.*@kawaneba.net
{
     EXITCODE=67
     :0
     /dev/null
}

Base64でエンコードされたHTMLメールは、スパムとみなすレシピ(通常のメーラーはそんな手の込んだことしない)

:0 H
* ^Content-Type:.*multipart/alternative
{
     :0 b
     * ^Content-Type:.*text/html
     {
         :0 b
         * ^Content-Transfer-Encoding:.*base64
         {
            EXITCODE=67
            :0
            /dev/null
         }
     }
}

:0 H
* ^Content-Type:.*text/html
{
     :0 h
     * ^Content-Transfer-Encoding:.*base64
     {
     EXITCODE=67
     :0
     /dev/null
     }
}

本文中にNGワードが含まれるテキストメールをスパムとみなすレシピ。行末や改行文字を取り除いて検査している。数値エンコードされた文字が10文字以上あるHTMLもスパムとみなす。

:0 cw
* < 20000
{
     :0 bf
     | sed 's/=$//g' | perl -pe 's/[[:cntrl:]]//g'

     :0 B
    * 9876543210^0 &#[0-9]*;&#[0-9]*;&#[0-9]*;&#[0-9]*;&#[0-9]*;&#[0-9]*;&#[0-9]*;&#[0-9]*;&#[0-9]*;
     * 9876543210^0 blind date
    (途中略)
     * 9876543210^0 remove.html
     { EXITCODE=1 }
     LOGFILE=/dev/null
     HOST
}
:0 e
{
     EXITCODE=67
     :0
     /dev/null
}

本文中にNGワードが含まれるHTMLメールをスパムとみなすレシピ。HTMLタグ行末や改行文字を取り除いて検査している。lynxの出力するリンク先のアドレスも設定すると吉

:0 cw
* < 20000
{
     :0 bf
    | sed -n '/<[hHBb][tTOo][mMDd][lLYy]/,$p' | sed 's/=$//g' | perl -pe 's/[[:cntrl:]]//g' | /lynx -stdin -dump -width=20000

     :0 B
     * 9876543210^0 A UNIVERSITY DEGREE CAN BE YOURS

   (中略)

     * 9876543210^0 penis
     * 9876543210^0 (Get|Generic|Herbal) Viagra

     { EXITCODE=1 }
     LOGFILE=/dev/null
     HOST
}
:0 e
{
     EXITCODE=67
     :0
     /dev/null
}