up_l dmy up_r
dmy home dmy dmy dmy

●排除率99.97%のスパムメール対策 for postfix●
(2010/06/05)

旧スパムメール対策1旧スパムメール対策2

[インストール環境]
   »  vine linux 4.2
   »  postfix-2.4.7-2vl5
   »  bsfilter-1.0.16-0vl1
   »  db4-4.2.52-6vl6
   »  db4-devel-4.2.52-6vl6
   »  DB_File.pm(perl)
   
   ※ すべてapt-get、rpmを構築してインストールしています。
   ※ postfixにはsleepパッチを適用しています。
   ※ postfixはMaildir方式を採用します。
   ※ postfixのインストールはpostfix + cyrus-sasl(pam)でsmtp認証(Vine4.2)をご覧下さい。
   ※ 基本的な考え方はtaRgreyを元にしています。
   ※ お約束ですが”自己責任”で行ってください。
   

[運用ポリシー]
   »  非スパムメールが誤判定により拒否された場合でも自動救済できるようにする。
   »  配送されたメールがスパムと判定された場合はそのメールを隔離する。
   »  隔離されたスパムメールの中に非スパムメールが混在していないか確認できるようにする。
   »  隔離されたスパムメールを容易に削除できるようにする。
   »  国内クライアントからの要求は制限をあまり厳しくしない。
   »  海外クライアントからの要求は制限を厳しくする。


[本スパムメール対策の主な流れ]
   1. クライアントの逆引きFQDNに動的IP要素が含まれているor逆引きできないクライアントのみを対象とする。
   2. 1のクライアントをCIDR_TABLEを使い国内or海外を区別する。
   3. 2で区別した国内クライアントは1度要求を拒否した後、5分以上120分以内に再送されてきた要求のみを許可する。
   4. 3で許可した要求は35秒間配送を遅延させる。
   5. 2で区別した海外クライアントは1度要求を拒否した後、10分以上120分以内に2度再送されてきた要求のみを許可する。
   6. 5で許可した要求は125秒間配送を遅延させる。
   7. 要求を許可したメールをDNSBL、URLBL、ベイジアンスパムフィルタで検査してスパムメールと判定した場合は隔離する。


■ グレイリスティングを行うスクリプトの設置
   ※このスクリプトはクライアントのIPとエンベロープFROM、TOをキーにした情報をDB_Fileを使って記録します。
   
   > cd /usr/local/bin/
   > wget http://cmf.ohtanz.com/download/receivegrey.txt
   > mv receivegrey.txt receivegrey
   > chmod 755 receivegrey
   > vi receivegrey
   ----------------------------------------------------------------------------------------------------------------------------------
   my $SYSLOG_SOCKTYPE = 'unix';                                                 #1
   my $SYSLOG_FACILITY = 'mail';                                                 #2
   my $SYSLOG_OPTIONS  = 'pid';                                                  #3
   my $SYSLOG_IDENT    = 'postfix/policy-service';                               #4
   
   my $RESULT_NG       = '450 In order to receive mail, please try again later'; #5
   my $RESULT_OK       = 'DUNNO';                                                #6
   ----------------------------------------------------------------------------------------------------------------------------------
   
   1. my $SYSLOG_SOCKTYPE = 'unix';
      デバッグ用(RedHat、debian系はunix/solarisはstream)。
   2. my $SYSLOG_FACILITY = 'mail';
      デバッグ用(固定値)
   3. $SYSLOG_OPTIONS = 'pid';
      デバッグ用(固定値)
   4. $SYSLOG_IDENT = 'postfix/policy-service';
      デバッグ用(固定値)
   5. $RESULT_NG = '450 In order to receive mail, please try again later';
      要求を拒否した際のメッセージ。
   6. $RESULT_OK = 'DUNNO';
      要求の許可方法(DUNNO/OK)


CIDR_TABLE自動生成(更新)スクリプトの設置
   > cd /usr/local/bin/
   > wget http://cmf.ohtanz.com/download/getApnicCidr.txt 
   > mv getApnicCidr.txt getApnicCidr.pl
   > chmod 755 getApnicCidr.pl
   > vi getApnicCidr.pl
   ----------------------------------------------------------------------------------------------------------------------------------
   my $CIDR_TABLE = '/etc/postfix/check_client_country';
   ----------------------------------------------------------------------------------------------------------------------------------
   ※ 上記はCIDR_TABLEファイルのPATH。
   
   ※ このスクリプトは日本国内のIPアドレスを収集しCIDR_TABLEを生成します。
   
   ● 設置が完了したら手動で実行して下さい。
      > /usr/local/bin/getApnicCidr.pl
   
   ● cronに追加して1日1回自動更新するようにします。
   -------------------------------------------------------------------------------------------------------------------------------
   0 5 * * * /usr/local/bin/getApnicCidr.pl
   -------------------------------------------------------------------------------------------------------------------------------

   ※ 毎朝5時に実行

■ main.cfの設定
   > vi /etc/postfix/main.cf
   ----------------------------------------------------------------------------------------------------------------------------------
   disable_vrfy_command = yes                                       #1
   allow_min_user = yes                                             #2
   smtpd_sasl_auth_enable = yes                                     #3
   smtpd_sasl_security_options = noanonymous                        #4
   broken_sasl_auth_clients = yes                                   #5
   non_fqdn_reject_code = 450                                       #6
   127.0.0.1:10027_time_limit = 3600                                #7
   127.0.0.1:10028_time_limit = 3600                                #8
   
   smtpd_restriction_classes =                                      #9
       check_smtp_auth                                              #10
       check_dynamic_client                                         #11
       check_client_jp                                              #12
       check_client_na                                              #13
   
   check_smtp_auth =                                                #14
       permit_sasl_authenticated                                    #15
    
   check_dynamic_client =                                           #16
       check_client_access cidr:/etc/postfix/check_client_country   #17
       check_client_na                                              #18
   
   check_client_jp =                                                #19
       check_policy_service inet:10027                              #20
       sleep 35                                                     #21
       permit                                                       #22
   
   check_client_na =                                                #23
       check_policy_service inet:10028                              #24
       sleep 125                                                    #25
   
   smtpd_recipient_restrictions =                                   #26
       permit_mynetworks                                            #27
       check_client_access cidr:/etc/postfix/check_smtp_auth        #28
       reject_unauth_destination                                    #29
       reject_unlisted_recipient                                    #30
       check_client_access regexp:/etc/postfix/check_special_client #31
       check_sender_access regexp:/etc/postfix/check_special_sender #32
       reject_non_fqdn_sender                                       #33
       reject_unverified_sender                                     #34
       check_client_access regexp:/etc/postfix/check_dynamic_client #35
   ----------------------------------------------------------------------------------------------------------------------------------
   
   1. disable_vrfy_command = yes
      VEFYコマンドを禁止
   2. allow_min_user = yes
      ハイフンで始まるメールアドレスを許可
   3. smtpd_sasl_auth_enable = yes
      smtp認証用
   4. smtpd_sasl_security_options = noanonymous
      smtp認証用
   5. broken_sasl_auth_clients = yes
      smtp認証用
   6. non_fqdn_reject_code = 450
      reject_non_fqdn_senderで拒否した際のリターンコード
   7. 127.0.0.1:10027_time_limit = 3600
      グレイリスティングを行うスクリプト(receivegrey)の時間制限(要求元クライアントが国内の場合)
   8. 127.0.0.1:10028_time_limit = 3600
      グレイリスティングを行うスクリプト(receivegrey)の時間制限(要求元クライアントが海外の場合)
   9. smtpd_restriction_classes =
      postfix制限クラスの設定 
   10. check_smtp_auth
      check_smtp_authファイルから呼び出されるpostfix制限クラスの定義(smtp認証用)
   11.check_dynamic_client
      check_dynamic_clientファイルから呼び出されるpostfix制限クラスの定義
   12.check_client_jp
      check_client_countryファイルから呼び出されるpostfix制限クラスの定義
   13.check_client_na
      check_dynamic_clientから呼び出されるpostfix制限クラスの定義
   14. check_smtp_auth =
      check_smtp_authファイルから呼び出されるpostfix制限クラス(smtp認証用)
   15. permit_sasl_authenticated
      smtp認証をパスした要求は許可
   16.check_dynamic_client =
      check_dynamic_clientファイルから呼び出されるpostfix制限クラス
   17.check_client_access cidr:/etc/postfix/check_client_country
      check_dynamic_clientファイルにより動的IP要素が含まれているor逆引きできないクライアントと
      判断されたクライアントの国内or海外を検査
   
      ※ check_client_countryファイルの中身(getApnicCidr.plにより自動生成)
      -------------------------------------------------------------------------------------------------------------------------------
      # LastUpdate: Sat Jul 19 05:00:00 2008
      # [Japan Network]
      58.0.0.0/15             check_client_jp
      58.3.0.0/17             check_client_jp
      58.3.128.0/17           check_client_jp
      58.4.0.0/15             check_client_jp
      58.12.0.0/15            check_client_jp
      58.65.32.0/19           check_client_jp
      58.70.0.0/16            check_client_jp
      58.80.0.0/15            check_client_jp
      58.84.0.0/18            check_client_jp
      ・
      ・
      ・
      -------------------------------------------------------------------------------------------------------------------------------
   18.check_client_na
      check_client_countryファイルにてクライアントが国内と判定されなかった場合に呼び出すpostfix制限クラス
   19.check_client_jp =
      check_client_countryファイルにてクライアントが国内と判定された場合に実施されるpostfix制限クラス
   20.check_policy_service inet:10027
      グレイリスティングを行うスクリプト(receivegrey)にて検査(国内)を実施
   21.sleep 35
      グレイリスティングを行うスクリプト(receivegrey)の検査(国内)をパスした要求を35秒間停滞
   22.permit
      グレイリスティングを行うスクリプト(receivegrey)の検査(国内)、35秒間の停滞をパスした要求を許可
   23.check_client_na =
      check_client_countryファイルにてクライアントが国内と判定されなかった場合に実施されるpostfix制限クラス
   24.check_policy_service inet:10028
      グレイリスティングを行うスクリプト(receivegrey)にて検査(海外)を実施
   25.sleep 125
      グレイリスティングを行うスクリプト(receivegrey)の検査(海外)をパスした要求を125秒間停滞
   26.smtpd_recipient_restrictions =
      RCPT TOコマンド時の制限
   27.permit_mynetworks
      自ネットワークからの要求は許可
   28.check_client_access cidr:/etc/postfix/check_smtp_auth
      smtp認証を許可するIP
      
      ※ check_smtp_authファイルの中身(編集後はpostmap /etc/postfix/check_smtp_authを実施)
      -------------------------------------------------------------------------------------------------------------------------------
      192.168.120.0/24  check_smtp_auth
      127.0.0.1/32      check_smtp_auth
      -------------------------------------------------------------------------------------------------------------------------------
   29.reject_unauth_destination
      自ネットワーク以外への要求は拒否
   30.reject_unlisted_recipient
      宛先不明なアドレスへの要求は拒否
   31.check_client_access regexp:/etc/postfix/check_special_client
      IP、ホスト名によるホワイトリストorブラックリスト
   
      ※ check_special_clientファイルの中身(手動設定)
      -------------------------------------------------------------------------------------------------------------------------------
      /^192\.168\.100\.123$/ 450 you are judged spam
      /example\.com$/        450 you are judged spam
      /example\.jp$/         OK
      ・
      ・
      ・
      -------------------------------------------------------------------------------------------------------------------------------
   32.check_sender_access regexp:/etc/postfix/check_special_sender
      エンベロープFROMによるホワイトリストorブラックリスト
   
      ※ check_special_senderファイルの中身(手動設定)
      -------------------------------------------------------------------------------------------------------------------------------
      /.*@example\.com$/ 450 you are judged spam
      /.*@example\.jp$/  OK
      ・
      ・
      ・
      -------------------------------------------------------------------------------------------------------------------------------
   33.reject_non_fqdn_sender
      エンベロープFROMがFQDN形式ではない場合は要求を拒否
   34.reject_unverified_sender
      エンベロープFROMがバウンスしたり配送先に到達できない場合は要求を拒否
   35.check_client_access regexp:/etc/postfix/check_dynamic_client
      クライアントの逆引きFQDNに動的IP要素が含まれているor逆引きできないクライアントの判定
   
      ※ グレイリスティングを行うスクリプト(receivegrey)により自動救済されるので多少荒っぽい設定にしてあります。

      ※ check_dynamic_clientファイルの中身
      -------------------------------------------------------------------------------------------------------------------------------
      if !/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/                                                                #1
      /^unknown$/                                                                                      check_dynamic_client #2
      /^[^.]*[0-9][^a-z0-9]+[0-9][^.]*/                                                                check_dynamic_client #3
      /.*[0-9]{4,}[^.]*\..+\.[^j][a-z]+$/                                                              check_dynamic_client #4
      /^[^.]*[0-9]{5,}/                                                                                check_dynamic_client #5
      /.*(broad|dynamic|dhcp|dial|ppp|flets|ftth|dsl|pool).*\.[^.]+\.[a-z]+$/                          check_dynamic_client #6
      /.*(broad|dynamic|dhcp|dial|ppp|flets|ftth|dsl|pool|cable|catv|proxy|vps).*\.[^.]+\.[^j][a-z]+$/ check_dynamic_client #7
      /^[^.]+\.[^.]*[0-9][^a-z0-9]+[0-9][^.]*/                                                         check_dynamic_client #8
      /^[^.]*[0-9]{3,}[a-z]{3,}[^.]*\.[^.]+\.[^.]+\.[^j]+/                                             check_dynamic_client #9
      /^[pcsx][0-9]{2,}[^.0-9]+/                                                                       check_dynamic_client #10
      /^(gw|fw)-[^.]*/                                                                                 check_dynamic_client #11
      /[^.]*[0-9]+[a-z]+[0-9]+[^.]*\..+\.[^j][a-z]+$/                                                  check_dynamic_client #12
      !/\.(jp|com|net)$/                                                                               check_dynamic_client #13
      endif                                                                                                                 #14
      -------------------------------------------------------------------------------------------------------------------------------
   
      1. if !/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/
         IPアドレス以外の場合に2行目以降を実施
      2. /^unknown$/
         逆引きできないクライアントの場合はcheck_dynamic_clientの検査を実施
      3. /^[^.]*[0-9][^a-z0-9]+[0-9][^.]*/
         逆引きFQDNの最下位に英数字以外で2つに区切られた数字が含まれる場合はcheck_dynamic_clientの検査を実施
      4. /.*[0-9]{4,}[^.]*\..+\.[^j][a-z]+$/
         逆引きFQDNの3番目以降に4桁以上の連続した数字を含みtldがj以外で始まる場合はcheck_dynamic_clientの検査を実施
      5. /^[^.]*[0-9]{5,}/
         逆引きFQDNの最下位に5桁以上の連続した数字を含む場合はcheck_dynamic_clientの検査を実施
      6. /.*(broad|dynamic|dhcp|dial|ppp|flets|ftth|dsl|pool).*\.[^.]+\.[a-z]+$/
         逆引きFQDNの3番目以降にbroad、dynamic、dhcp、dial、ppp、flets、ftth、dsl、poolを含む場合はcheck_dynamic_client
         の検査を実施
      7. /.*(broad|dynamic|dhcp|dial|ppp|flets|ftth|dsl|pool|cable|catv|proxy|vps).*\.[^.]+\.[^j][a-z]+$/
         逆引きFQDNの3番目以降にbroad、dynamic、dhcp、dial、ppp、flets、ftth、dsl、pool、cable、catv、proxy、vpsを含みtld
         がj以外で始まる場合はcheck_dynamic_clientの検査を実施
      8. /^[^.]+\.[^.]*[0-9][^a-z0-9]+[0-9][^.]*/
         逆引きFQDNの最下位から2番目に英数字以外で2つ以上に区切られた数字が含まれる場合はcheck_dynamic_clientの検査を実施
      9. /^[^.]*[0-9]{3,}[a-z]{3,}[^.]*\.[^.]+\.[^.]+\.[^j]+/
         逆引きFQDNの最下位が英字で2つに区切られた連続した3桁以上数字を含み最下位から4番目がj以外の文字で始まる場合は
         check_dynamic_clientの検査を実施
      10./^[pcsx][0-9]{2,}[^.0-9]+/
         逆引きFQDNの最下位の先頭がp、c、s、xで始まりドット、数字以外の文字列で終わる連続した2桁以上の数字が含まれる場合は
         check_dynamic_clientの検査を実施
      11./^(gw|fw)-[^.]*/
         逆引きFQDNの最下位の先頭がgw、fwで始まる場合はcheck_dynamic_clientの検査を実施
      12./[^.]*[0-9]+[a-z]+[0-9]+[^.]*\..+\.[^j][a-z]+$/
         逆引きFQDNの3番目以降に連続した英字で2つに区切られた連続した数字を含みtldがj以外で始まる場合はcheck_dynamic_client
         の検査を実施
      13.!/\.(jp|com|net)$/
         tldがjp、com、net以外の場合はcheck_dynamic_clientの検査を実施
      14.endif
         if文の終了宣言


■ master.cfの設定
   > vi /etc/postfix/master.cf
   -------------------------------------------------------------------------------------------------------------------------------
   127.0.0.1:10027 inet n  n       n       -       16      spawn
     user=nobody argv=/usr/local/bin/receivegrey --DEBUG=0 --DBFILE=/tmp/receivegrey-jp.db --TYPE=1 --COUNT=1 --BEGIN=5 --END=120
   127.0.0.1:10028 inet n  n       n       -       16      spawn
     user=nobody argv=/usr/local/bin/receivegrey --DEBUG=0 --DBFILE=/tmp/receivegrey-na.db --TYPE=1 --COUNT=2 --BEGIN=10 --END=120
   -------------------------------------------------------------------------------------------------------------------------------
   
   1. 127.0.0.1:10027 inet n n n - 16 spawn
      グレイリスティングを行うスクリプト(receivegrey)の設定(国内クライアント用)
      ※16は同時起動可能数
   2. 127.0.0.1:10028 inet n n n - 16 spawn
      グレイリスティングを行うスクリプト(receivegrey)の設定(海外クライアント用)
      ※16は同時起動可能数
   3. user=nobody
      receivegreyの実行ユーザー
   2. argv=/usr/local/bin/receivegrey
      receivegreyまでのPATH
   3. --DEBUG=0
      詳細ログ(デバッグ)を出力する場合は1、しない場合は0を指定
   4. --DBFILE=/tmp/receivegrey-jp.db
      クライアント情報を記録するファイルのPATH(nobody権限で作成できるディレクトリ配下を指定)
   5. --TYPE=1
      1度許可した要求を--ENDで指定した時間の間許可する場合は0、しない場合は1を指定
   6. --COUNT=1
      許可するまでの再送要求数
   7. --BEGIN=5
      最初の要求から再送要求を受け付けるまでの開始時間
   8. --END=120
      最初の要求から再送要求を受け付けるまでの終了時間


■ ベイジアンスパムフィルタ(bsfilter)の導入
   > apt-get install bsfilter mecab mecab-ipadic ruby-mecab
   > mkdir /var/lib/bsfilter
   > chmod 755 /var/lib/bsfilter
   > vi /etc/bsfilter.conf
   -------------------------------------------------------------------------------------------------------------------------------
   homedir /var/lib/bsfilter #1
   jtokenizer mecab          #2
   insert-revision           #3
   insert-flag               #4
   insert-probability        #5
   auto-update               #6
   pipe                      #7
   -------------------------------------------------------------------------------------------------------------------------------

   1. homedir /var/lib/bsfilter
      作業ディレクトリ
   2. jtokenizer mecab
      形態要素解析エンジンMeCabを使う
   3. insert-revision
      メールのヘッダに「X-Spam-Revision」を追加
   4. insert-flag
      メールのヘッダに「X-Spam-Flag」を追加
   5. insert-probability
      メールのヘッダに「X-Spam-Probability」を追加
   6. auto-update
      cleanかspamか判定した後、その結果をtokenデータベースに追加し確率データベースも更新
   7. pipe
      標準出力する(procmail用)

   ● http://www.db.is.kyushu-u.ac.jp/computer/solarisserver/bs.spamからスパムなトークンを入手
   > wget http://www.db.is.kyushu-u.ac.jp/computer/solarisserver/bs.spam

   ● スパムなトークンを学習させる
   > bsfilter --config-file /etc/bsfilter.conf --import-spam ./bs.spam

   ● クリーンなメールを学習させる(普段使っているメーラーがmbox形式だったのでそれを全部入れてみました)
   > bsfilter --config-file /etc/bsfilter.conf --mbox --jtokenizer mecab --add-clean ./***.mbx

   ● sdbmを更新
   > bsfilter --update --config-file /etc/bsfilter.conf

   ● オーナーの関係でデータベースが読み込みできなかったのでパーミッションを変更
   > chmod 666 /var/lib/bsfilter/*

   ● スパムと認識されたクリーンなメールを学習させるスクリプトを作成
   > vi /usr/local/bin/bsfilter-clean.sh
   -------------------------------------------------------------------------------------------------------------------------------
   #!/bin/sh

   FILE=$1

   if [ -n "$1" ]; then
       bsfilter --homedir /var/lib/bsfilter --sub-spam --jtokenizer mecab --add-clean --update ${FILE}
       chmod 666 /var/lib/bsfilter/*
   fi
   -------------------------------------------------------------------------------------------------------------------------------

   > chmod 700 /usr/local/bin/bsfilter-clean.sh

   ※ 使い方:/usr/local/bin/bsfilter-clean.sh クリーンなメール

   ● クリーンと認識されたスパムメールを学習させるスクリプトを作成
   > vi /usr/local/bin/bsfilter-spam.sh
   -------------------------------------------------------------------------------------------------------------------------------
   #!/bin/sh

   FILE=$1

   if [ -n "$1" ]; then
       bsfilter --homedir /var/lib/bsfilter --sub-clean --jtokenizer mecab --add-spam --update ${FILE}
       chmod 666 /var/lib/bsfilter/*
   fi
   -------------------------------------------------------------------------------------------------------------------------------

   > chmod 700 /usr/local/bin/bsfilter-spam.sh

   ※ 使い方:/usr/local/bin/bsfilter-spam.sh スパムメール


■ DNSBL、URLBLチェックスクリプト(procdnsbl)の設置
   ※ procdnsblはDNSBL、URLBLに該当した場合にメールヘッダーにX-DnsBL、X-UrlBLを付与します。
   ※ 利用するDNSBL、URLBLを変更したい場合はprocdnsbl内の15行目の@DNS_BL、20行目の@URL_BLを変更して下さい。

   > wget http://cmf.ohtanz.com/download/procdnsbl.txt
   > mv procdnsbl.txt /usr/local/bin/procdnsbl 
   > chmod 755 /usr/local/bin/procdnsbl 

■ procmailのインストール
   > apt-get install procmail

   ● procmail用ログファイルの作成   
   > touch /var/log/procmail
   > chmod 666 /var/log/procmail

   ● procmail用ログファイルをlogrotateに追加   
   > vi /etc/logrotate.d/procmail
   -------------------------------------------------------------------------------------------------------------------------------
   /var/log/procmail {
       create 666 root root
   }
   -------------------------------------------------------------------------------------------------------------------------------

   ● スパムと判定されたメールを格納するspamディレクトリの作成 
   > mkdir ~hoge/Maildir/spam 
   > chown hoge:hoge ~hoge/Maildir/spam 
   > chmod 700 ~hoge/Maildir/spam

   ● spamディレクトリに入ったメールを1つのメールにまとめるスクリプトの作成 
   > vi /usr/local/bin/spamsend.sh
   -------------------------------------------------------------------------------------------------------------------------------
   #!/bin/sh

   export LANG=en
   PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
   CONF=/usr/local/etc/spamsend.txt
   HOST=`hostname`
   MAILDATE=`date "+%a, %d %b %Y %H:%M:%S +0900"`

   LIST=`cat $CONF`

   for u in $LIST
   do
       COUNT=`ls /home/$u/Maildir/spam/ | wc -l`

       if [ $COUNT -ne 0 ]; then
           FILEDATE=`date '+%s'`
           MAIL=/home/$u/Maildir/new/$FILEDATE.$$.$HOST

           echo "Date: $MAILDATE" >> $MAIL
           echo "From: postmaster@example.com" >> $MAIL
           echo "To: $u@example.com" >> $MAIL
           echo "Subject: SPAM MAIL LIST" >> $MAIL
           echo "MIME-Version: 1.0" >> $MAIL
           echo "Content-Type: text/plain; charset=iso-2022-jp" >> $MAIL
           echo "Content-Transfer-Encoding: 7bit" >> $MAIL
           echo "" >> $MAIL
           echo "[[[[[SPAM MAIL LIST]]]]]" >> $MAIL
           echo "" >> $MAIL

           nkf -mj /home/$u/Maildir/spam/* >> $MAIL
           chown $u:$u $MAIL
           chmod 600 $MAIL
           rm -f /home/$u/Maildir/spam/*
       fi
   done
   -------------------------------------------------------------------------------------------------------------------------------

   ※From、Toのメールアドレスは適宜修正して下さい。

   > chmod 700 /usr/local/bin/spamsend.sh

   ● spamsend.sh対象のアカウントを管理するファイルの作成 
   > vi /usr/local/etc/spamsend.txt 
   -------------------------------------------------------------------------------------------------------------------------------
   hoge
   hogehoge
   -------------------------------------------------------------------------------------------------------------------------------

   ● spamsend.shをcronに追加 
   > vi crontab -e 
   -------------------------------------------------------------------------------------------------------------------------------
   0 0-23/4 * * * /usr/local/bin/spamsend.sh
   -------------------------------------------------------------------------------------------------------------------------------

   ※ 4時間おきに実行

   ● .forwardファイルの作成 
   > vi ~hoge/.forward 
   -------------------------------------------------------------------------------------------------------------------------------
   "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #~/Maildir/"
   -------------------------------------------------------------------------------------------------------------------------------

   ● .procmailrcファイルの作成 
   > vi ~hoge/.procmailrc 
   -------------------------------------------------------------------------------------------------------------------------------
   PATH=/bin:/usr/bin:/usr/local/bin
   LOGFILE=/var/log/procmail
   MAILDIR=${HOME}/Maildir
   DEFAULT=${MAILDIR}
   
   :0 fw
   | /usr/local/bin/procdnsbl
   
   :0
   * ^X-(Dns|Url)BL: *
   ${MAILDIR}/spam/.
   
   :0 fw
   | /usr/bin/bsfilter --config-file /etc/bsfilter.conf
   
   :0
   * ^X-Spam-Probability: *(1|0\.[89])
   ${MAILDIR}/spam/.
   
   :0
   ${MAILDIR}/
   -------------------------------------------------------------------------------------------------------------------------------

■ 本スパムメール対策の統計
   toukei

   ● REJECTの各項目
      1. reject_unlisted_recipientで拒否した数
      2. reject_unverified_senderで拒否した数
      3. reject_non_fqdn_senderで拒否した数
      4. reject_unauth_destinationで拒否した数
      5. グレイリスティングで拒否した数
      6. sleepで諦めた数
      7. ブラックリストで拒否した数
      8. procmail(bsfilter+DNSBL+URLBL)でspam判定された数
   ● OKは配送されたすべてのメール数
   ● TRUE JUDGEはOKの中で配送されたスパムの数
   ● FALSE JUDGEは拒否した非スパムの数
   ● REJECT RATE(postfix)はpostfixのみの拒否率
   ● REJECT RATE(ALL)はpostfix、procmailをあわせた拒否率
   ● 1番下のREJECT RATEは設定毎の拒否率
   
   -----2008年06月から2010年05月までの統計-----
   ● postfixのみの排除率は99.73%
   ● postfix+procmail(bsfilter+DNSBL+URLBL)を合わせた排除率は99.99%
   ● すり抜けたスパムメールは22通
   ● 非スパムメールがスパムメール判定された数は0通
   ------------------------------------------
   2008年06月から2010年05月までの統計2010年05月分の統計2010年04月分の統計2010年03月分の統計2010年02月分の統計2010年01月分の統計2009年12月分の統計2009年11月分の統計2009年10月分の統計2009年09月分の統計2009年08月分の統計2009年07月分の統計2009年06月分の統計2009年05月分の統計2009年04月分の統計2009年03月分の統計2009年02月分の統計2009年01月分の統計2008年12月分の統計2008年11月分の統計2008年10月分の統計2008年9月分の統計2008年8月分の統計2008年7月分の統計2008年6月分の統計

■ 統計を取る為のスクリプト
   RejectMail

   ● RejectMail.zipのダウンロード
   > wget http://cmf.ohtanz.com/download/RejectMail.zip

   ● RejectMail.zipを解凍してGrepMaillog.pl、index.cgiを編集
   > cd /hoge/RejectMail
   > vi GrepMaillog.pl
   -------------------------------------------------------------------------------------------------------------------------------
   my $VIEWDIR  = '/hoge/RejectMail';  #1
   my $MAILLOG  = '/var/log/maillog';  #2
   my $PROCMAIL = '/var/log/procmail'; #3
   my $WWWUSER  = 'www';               #4
   -------------------------------------------------------------------------------------------------------------------------------

   1. WWWアクセス可能な作業ディレクトリ
   2. maillogのPATH
   3. procmailログのPATH
   4. WWW上からCGI実行可能なユーザー

   > chmod 755 GrepMaillog.pl

   > vi index.cgi
   -------------------------------------------------------------------------------------------------------------------------------
   my $VIEW_DIR = '/hoge/RejectMail';                  #1
   my $VIEW_URI = 'http://www.example.com/RejectMail'; #2
   my $MY_SCR   = 'index.cgi';                         #3
   my %REJECT_MESS = (                                 #4
   '1' => 'Recipient address rejected: User unknown in local recipient table',
   '2' => 'Sender address rejected: undeliverable address',
   '3' => 'Sender address rejected: unverified address',
   '4' => 'Sender address rejected: Domain not found',
   '5' => 'Sender address rejected: need fully-qualified address',
   '6' => 'Relay access denied',
   '7' => 'Sender address rejected: you are judged spam',
   '8' => 'Client host rejected: rejected: you are judged spam',
   '9' => 'Recipient address rejected: User unknown in virtual alias table',
   '10' => 'Client host rejected: In order to receive mail, please try again later',
   '11' => 'lost connection',
   );
   -------------------------------------------------------------------------------------------------------------------------------

   1. WWWアクセス可能な作業ディレクトリ
   2. 作業ディレクトリのURI
   3. このスクリプトのファイル名
   4. REJECTメッセージの一覧(REJECTメッセージを追加する場合はここに追加して下さい)

   > chmod 755 index.cgi

   ● cronにGrepMaillog.plを追加
   -------------------------------------------------------------------------------------------------------------------------------
   15,30,45,59 * * * * /hoge/RejectMail/GrepMaillog.pl
   -------------------------------------------------------------------------------------------------------------------------------

   ※ 毎時15分、30分、45分、59分に実行


以上ですべての説明は終わりです。

最後に現在のmain.cfを上げておきますので参考までに。

▲TOP

dmy
low_l dmy low_r