フリーなCGIと自宅サーバー情報サイト
[必要なもの]
» postfix
» bsfilter
» db4
» db4-devel
» perl
» procmail
» DB_File(perlモジュール)
» Mail::SPF(perlモジュール)
*すべてapt-get、rpmを構築してインストールしています
*postfixにはsleepパッチを適用しています
*postfixはMaildir方式を採用します
*基本的なインストール、設定部分は省略しております
[運用ポリシー]
» 非スパムメールが誤判定により拒否された場合でも自動救済できるようにする
» 配送されたメールがスパムと判定された場合はそのメールを隔離する
» 隔離されたスパムメールの中に非スパムメールが混在していないか確認できるようにする
» 隔離されたスパムメールを容易に削除できるようにする
» 国内クライアントからの要求は制限をあまり厳しくしない
» 海外クライアントからの要求は制限を厳しくする
» 特定のドメインのみSPF認証を実施する
[本スパムメール対策の主な流れ]
1. エンベロープFROMが特定のドメインである場合のみSPF認証を実施する
2. クライアントの逆引きFQDNに動的IP要素が含まれているor逆引きできないクライアントのみを対象とする
3. 2のクライアントをCIDR_TABLEを使い国内or海外を区別する
4. 3で区別した国内クライアントは1度要求を拒否した後、5分以上120分以内に再送されてきた要求のみを許可する
5. 4で許可した要求は35秒間配送を遅延させる
6. 3で区別した海外クライアントは1度要求を拒否した後、10分以上120分以内に2度再送されてきた要求のみを許可する
7. 6で許可した要求は125秒間配送を遅延させる
8. 要求を許可したメールをDNSBL、URLBL、ベイジアンスパムフィルタで検査してスパムメールと判定した場合は隔離する
■SPF認証を行うスクリプトの設置
*このスクリプトはMail::SPFを使ってSPF認証を行います
> cd /usr/local/bin/
> wget https://cmf.ohtanz.com/download/receivespf.txt
> mv receivespf.txt receivespf
> chmod 755 receivespf
> vi receivespf
1. my $syslog_socktype = ‘unix’;
デバッグ用(RedHat、debian系はunix/solarisはstream)
2. my $syslog_facility = ‘mail’;
デバッグ用(固定値)
3. $syslog_options = ‘pid’;
デバッグ用(固定値)
4. $syslog_ident = ‘postfix/policy-spf’;
デバッグ用(固定値)
5. $result_ng = ‘450 Client address does not match SPF record’;
要求を拒否した際のメッセージ
6. $result_ok = ‘DUNNO’;
要求の許可方法(DUNNO/OK)
■ グレイリスティングを行うスクリプトの設置
*このスクリプトはクライアントのIPとエンベロープFROM、TOをキーにした情報をDB_Fileを使って記録します
> cd /usr/local/bin/
> wget https://cmf.ohtanz.com/download/receivegrey.txt
> mv receivegrey.txt receivegrey
> chmod 755 receivegrey
> vi receivegrey
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 https://cmf.ohtanz.com/download/getApnicCidr.txt
> mv getApnicCidr.txt getApnicCidr.pl
> chmod 755 getApnicCidr.pl
> vi getApnicCidr.pl
● 設置が完了したら手動で実行して下さい
> /usr/local/bin/getApnicCidr.pl
● cronに追加して1日1回自動更新するようにします
■ main.cfの設定
> vi /etc/postfix/main.cf
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_sender_spf
check_sender_spfから呼び出されるpostfix制限クラスの定義
15. check_smtp_auth =
check_smtp_authファイルから呼び出されるpostfix制限クラス(smtp認証用)
16. permit_sasl_authenticated
smtp認証をパスした要求は許可
17.check_dynamic_client =
check_dynamic_clientファイルから呼び出されるpostfix制限クラス
18.check_client_access cidr:/etc/postfix/check_client_country
check_dynamic_clientファイルにより動的IP要素が含まれているor逆引きできないクライアントと
判断されたクライアントの国内or海外を検査
* check_client_countryファイルの中身(getApnicCidr.plにより自動生成)
19.check_client_na
check_client_countryファイルにてクライアントが国内と判定されなかった場合に呼び出すpostfix制限クラス
20.check_client_jp =
check_client_countryファイルにてクライアントが国内と判定された場合に実施されるpostfix制限クラス
21.check_policy_service inet:10027
グレイリスティングを行うスクリプト(receivegrey)にて検査(国内)を実施
22.sleep 35
グレイリスティングを行うスクリプト(receivegrey)の検査(国内)をパスした要求を35秒間停滞
23.permit
グレイリスティングを行うスクリプト(receivegrey)の検査(国内)、35秒間の停滞をパスした要求を許可
24.check_client_na =
check_client_countryファイルにてクライアントが国内と判定されなかった場合に実施されるpostfix制限クラス
25.check_policy_service inet:10028
グレイリスティングを行うスクリプト(receivegrey)にて検査(海外)を実施
26.sleep 125
グレイリスティングを行うスクリプト(receivegrey)の検査(海外)をパスした要求を125秒間停滞
27.check_sender_spf =
check_sender_spfファイルとエンベロープFROMのドメインがマッチした場合に実施されるpostfix制限クラス
28.check_policy_service inet:10029
SPF認証を行うスクリプト(receivespf)の検査を実施
29.smtpd_recipient_restrictions =
RCPT TOコマンド時の制限
30.permit_mynetworks
自ネットワークからの要求は許可
31.check_client_access cidr:/etc/postfix/check_smtp_auth
smtp認証を許可するIP
* check_smtp_authファイルの中身(編集後はpostmap /etc/postfix/check_smtp_authを実施)
32.reject_unauth_destination
自ネットワーク以外への要求は拒否
33.reject_unlisted_recipient
宛先不明なアドレスへの要求は拒否
34.check_client_access regexp:/etc/postfix/check_special_client
IP、ホスト名によるホワイトリストorブラックリスト
* check_special_clientファイルの中身(手動設定)
35.check_sender_access regexp:/etc/postfix/check_special_sender
エンベロープFROMによるホワイトリストorブラックリスト
* check_special_senderファイルの中身(手動設定)
36.reject_non_fqdn_sender
エンベロープFROMがFQDN形式ではない場合は要求を拒否
37.reject_unverified_sender
エンベロープFROMがバウンスしたり配送先に到達できない場合は要求を拒否
38.check_sender_access regexp:/etc/postfix/check_sender_spf
SPF認証を行うエンベロープFROMのドメイン
* check_sender_spfファイルの中身
39.check_client_access regexp:/etc/postfix/check_dynamic_client
クライアントの逆引きFQDNに動的IP要素が含まれているor逆引きできないクライアントの判定
* グレイリスティングを行うスクリプト(receivegrey)により自動救済されるので多少荒っぽい設定にしてあります
* check_dynamic_clientファイルの中身
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
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. 127.0.0.1:10029 inet n n n – 16 spawn
SPF認証を行うスクリプト(receivespf)の設定
*16は同時起動可能数
4. user=nobody
receivegrey(receivespf)の実行ユーザー
5. argv=/usr/local/bin/receivegrey(receivespf)
receivegrey(receivespf)までのPATH
6. --DEBUG=0
詳細ログ(デバッグ)を出力する場合は1、しない場合は0を指定
7. --DBFILE=/tmp/receivegrey-jp.db(receivegrey-na.db)
クライアント情報を記録するファイルのPATH(nobody権限で作成できるディレクトリ配下を指定)(receivegreyのみ)
8. --TYPE=1
1度許可した要求を--ENDで指定した時間の間許可する場合は0、しない場合は1を指定(receivegreyのみ)
9. --COUNT=1
許可するまでの再送要求数(receivegreyのみ)
10. --BEGIN=5
最初の要求から再送要求を受け付けるまでの開始時間(receivegreyのみ)
11. --END=120
最初の要求から再送要求を受け付けるまでの終了時間(receivegreyのみ)
■ ベイジアンスパムフィルタ(bsfilter)の導入
> apt-get install bsfilter mecab mecab-ipadic ruby-mecab
> mkdir /var/lib/bsfilter
> chmod 755 /var/lib/bsfilter
> vi /etc/bsfilter.conf
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用)
● スパムなトークンを入手
> 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
> chmod 700 /usr/local/bin/bsfilter-clean.sh
* 使い方:/usr/local/bin/bsfilter-clean.sh ~hoge/Maildir/spam/***
● クリーンと認識されたスパムメールを学習させるスクリプトを作成
> vi /usr/local/bin/bsfilter-spam.sh
> chmod 700 /usr/local/bin/bsfilter-spam.sh
* 使い方:/usr/local/bin/bsfilter-spam.sh ~hoge/Maildir/new/***
■ DNSBL、URLBLチェックスクリプト(procdnsbl)の設置
* procdnsblはDNSBL、URLBLを参照し該当した場合にメールヘッダーにX-DnsBL、X-UrlBLを付与します
* 利用するDNSBL、URLBLを変更したい場合はprocdnsbl内の15行目の@DNS_BL、20行目の@URL_BLを変更して下さい
> wget https://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に追加
● スパムと判定されたメールを格納するspamディレクトリの作成
> mkdir ~hoge/Maildir/spam
> chown hoge:hoge ~hoge/Maildir/spam
> chmod 700 ~hoge/Maildir/spam
● spamディレクトリに入ったメールを1つのメールにまとめるスクリプトの作成
> vi /usr/local/bin/spamsend.sh
> chmod 700 /usr/local/bin/spamsend.sh
● spamsend.sh対象のアカウントを管理するファイルの作成
> vi /usr/local/etc/spamsend.txt
● spamsend.shをcronに追加
> vi crontab -e
● .forwardファイルの作成
> vi ~hoge/.forward
● .procmailrcファイルの作成
> vi ~hoge/.procmailrc
*SPF認証は後に追加したため、本統計には含まれておりません
● 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.zipのダウンロード
> wget https://cmf.ohtanz.com/download/RejectMail.zip
● RejectMail.zipを解凍してGrepMaillog.pl、index.cgiを編集
> cd /hoge/RejectMail
> vi GrepMaillog.pl
1. WWWアクセス可能な作業ディレクトリ
2. maillogのPATH
3. procmailログのPATH
4. WWW上からCGI実行可能なユーザー
> chmod 755 GrepMaillog.pl
> vi index.cgi
1. WWWアクセス可能な作業ディレクトリ
2. 作業ディレクトリのURI
3. このスクリプトのファイル名
4. REJECTメッセージの一覧(REJECTメッセージを追加する場合はここに追加して下さい)
> chmod 755 index.cgi
● cronにGrepMaillog.plを追加
以上ですべての説明は終わりです。