文書一覧に戻る | GreetPause | milter-greylist | milter-regex | milter-blockdomain | 最終更新日:2021/02/13 |
スパム対策は、メールの運営者や利用者の要件によって異なり、万能・唯一といった方式があるわけではなく、
複数の方式を組み合わせることにより、より効果的な結果が得られます。
ここでは、以下の要件や受容条件で、実用的な方法を紹介します。
実用的な方法としては、以下の2つを組み合わせて利用します。
sendmail によるグリートポーズは、以下をご参照下さい。
http://www.bea.hi-ho.ne.jp/abetakao/ja/documents/sendmail-greetpause.html
次章以降で紹介します。
milter-greylist の設定ファイル greylist.conf は、設定内容を別ファイルの参照にできないので、
設定の変更の頻度や設定の種類によって、いくつかのファイルに分割しておき、それらを統合して
milter-greylist の設定ファイル greylist.conf を生成するようにすると、S25R の公開ホワイトリストの
自動取り込みが行いやすくなります。
milter-greylist で、S25R の判定により再送を促した後に再送を受信し、有効な再送と判定すると、
milter-greylist のオート・ホワイトリストに登録されますが、あらかじめ、S25R の公開ホワイトリストを
取り込んでおくことにより、S25R の基本ルールに該当する正当なホストからの初回受信時の
遅延を軽減することができます。
設定ファイルは、どのような分割でも自由ですが、意図したとおりの順番でファイルを統合できるように、
ファイル名の先頭を番号にしておきます。
ファイル名 | 想定変更頻度 | 設定内容 |
---|---|---|
00-settings.conf | 低 | 基本的な動作設定など |
10-whitelist.conf | 低 | 必須のホワイトリスト |
11-whitelist.conf | 中 | 手作業で保守するサイト・ローカルのホワイトリスト |
20-blacklist.conf | 中 | 手作業で保守するサイト・ローカルのブラックリスト |
61-helo.conf | 低 | 無効なHELOのルールなど |
62-envfrom.conf | 低 | SMTP の エンベロープFROM に関する設定 |
71-whitelist.conf | 高(定期的) | S25Rの公開ホワイトリストをmilter-greylistの様式に変換したホワイトリスト |
72-blacklist.conf | 廃止 | S25Rの公開ブラックリストをmilter-greylistの様式に変換したブラックリスト |
90-s25r.conf | 低 | S25Rの基本ルールなど |
99-default.conf | 低 | デフォルト・ルール |
分割した設定ファイルを milter-greylist の設定ファイル greylist.conf に統合するスクリプト
#!/bin/bash DATADIR=/var/lib/milter-greylist ・・・ 上記の分割した設定ファイルの保管パス(任意のパス) CONF=greylist.conf rm $DATADIR/$CONF for FILE in `ls $DATADIR/*.conf | sort` do if [ `basename $FILE` = $CONF ] ; then continue fi cat $FILE >> $DATADIR/$CONF done
milter-greylist の基本的な動作設定です。
#################################################################################################### ##### ##### 00-settings.conf ##### #################################################################################################### # Sendmailと通信するためのソケット・ファイル( sendmail.mc の INPUT_MAIL_FILTER の指定と一致させる) socket "/var/run/milter/milter-greylist.sock" ・・・ パスは適宜設定 # グレイリストおよびオート・ホワイトリストのテキスト・ダンプ・ファイルとダンプ頻度 dumpfreq 6h ・・・ 数時間~1日程度 dumpfile "/var/lib/milter-greylist/greylist.db" 644 ・・・ パスは適宜設定 # milter-greylistのPIDファイル pidfile "/var/run/milter/milter-greylist.pid" ・・・ パスは適宜設定 # milter-greylistの実行ユーザー user "milter" ・・・ 実行環境に合わせて下さい # クライアントにメールの受け取りを許可するまでの時間を通知しない quiet # ヘッダー情報に、X-Greylist を追加しない report none # 拡張正規表現を使う extendedregex # ドメインの指定は、ドメインの境界(ドット)で一致を判定する domainexact # 最初に接続されてから、有効な再送とはみなさない期間(一時拒否の応答を返す) greylist 45m ・・・ S25Rの基本ルールと公開ホワイトリストを適用するなら、数十分程度で調整する。 # 最初に接続されてから、有効な再送とみなす期間 timeout 5h ・・・ 長すぎると、再送ではないのメールを再送と誤認してしまうので、数時間程度で調整する。 # 有効な再送により許可された状態を保持する期間 autowhite 100d ・・・ 適宜設定 # 複数の異なるホストによる再送を受け付けるためのIPアドレス範囲(CIDRサブネット) subnetmatch /28 ・・・ /32 ~ /24 程度
ループバック・アドレスとローカル・ネットワークは、必須のホワイトリストです。
#################################################################################################### ##### ##### 10-whitelist.conf ##### #################################################################################################### # ループバック・アドレスとローカル・ネットワークは、一時拒否しない racl whitelist addr 127.0.0.0/8 racl whitelist addr 10.0.0.0/8 racl whitelist addr 169.254.0.0/16 racl whitelist addr 172.16.0.0/12 racl whitelist addr 192.168.0.0/16 racl whitelist addr ::1 racl whitelist addr fc00::/7 racl whitelist addr fe80::/10 racl whitelist addr 192.0.2.0/24 ・・・ メール・サーバー自身や自サイトのグローバル・アドレスを指定する。
サイト・ローカルのホワイトリストやブラックリストですが、中には長期(過去数年)にわたり有効なものもあります。
ご参考になさって下さい。
http://www.bea.hi-ho.ne.jp/abetakao/black-and-white/
不正なHELOに適用するルールです。
#################################################################################################### ##### ##### 61-helo.conf ##### #################################################################################################### # HELOにピリオドがない(FQDNでない) racl greylist helo /^[^.]*$/ msg "Refused connection temporarily. Be patient. ( Non FQDN HELO )" # HELOでこちらのサーバー名やIPアドレスを名乗る list "mail-server" addr { 127.0.0.1 192.0.2.1 } racl blacklist helo "foobar.example.jp" not list "mail-server" msg "Refused connection by site policy. ( Malformed HELO )" racl blacklist helo /^\[*192\.0\.2\.1\]*$/ not list "mail-server" msg "Refused connection by site policy. ( Malformed HELO )" racl blacklist helo "localhost" not list "mail-server" msg "Refused connection by site policy. ( Malformed HELO )" racl blacklist helo /^\[*127\.0\.0\.1\]*$/ not list "mail-server" msg "Refused connection by site policy. ( Malformed HELO )" # HELOがピリオドだけ racl blacklist helo "." msg "Refused connection by site policy. ( Invalid HELO )"
192.0.2.1 は、メール・サーバーのグローバル・アドレスを設定します。
foobar.example.jp は、メール・サーバーのホスト名を設定します。
エンベロープFROMは、空白で送られる場合があります。RFCでは、次のように述べられています。
Whenever an SMTP transaction is used to send a DSN, the MAIL FROM command MUST use a NULL return address, i.e., "MAIL FROM:<>".
One way to prevent loops in error reporting is to specify a null reverse-path in the MAIL command of a notification message.
When such a message is transmitted, the reverse-path MUST be set to null (see Section 4.5.5 for additional discussion).
A MAIL command with a null reverse-path appears as follows:
MAIL FROM:<>
エンベロープFROMが空白で無効な宛先アドレスに送ろうとするメールも多く見られ、
エンベロープFROMが空白の場合にグレイリストを適用するルールです。
このチェックによるグレイリスト通過後のオート・ホワイトリストの有効期間を、
基本的な設定の有効期間より大幅に短期間にするため、S25R のチェックの前に、
エンベロープFROMの空白のチェックを行います。
#################################################################################################### ##### ##### 62-envfrom.conf ##### #################################################################################################### # エンベロープFromが空白なら、一時拒否(グレイリスト) racl greylist from /^<>$/ autowhite 3d msg "Refused connection temporarily. Be patient. ( NULL return address )"
racl greylist from /^<>$/ autowhite 3d msg ". . . ." の 3d は、
基本的な設定 ( 00-settings.conf ) の
autowhite 数日~数十日 より、大幅に短期間にするか、数日程度が良いでしょう。
S25R の公開ホワイトリストは、postfix の様式です。
sendmail + milter-greylist に S25R の公開ホワイトリストを取り込む場合は、milter-greylist の様式に変換する必要があります。
S25R で公開されている postfix の様式のホワイトリストを、milter-greylist の様式に変換するスクリプトは、以下の URL より、ダウンロードできます。
http://www.bea.hi-ho.ne.jp/abetakao/ja/s25r/
公開ホワイトリストをダウンロードして milter-greylist の様式に変換するまでを自動化するスクリプト
上記URLからダウンロードしたスクリプトは、/usr/local/sbin/s25r-whiteconv.sh に保存してあると仮定しています。
#!/bin/bash DATADIR=/var/lib/milter-greylist ・・・ 分割した設定ファイルの保管パス NEW_WHITELIST=$DATADIR/white-list.txt OLD_WHITELIST=$DATADIR/white-list.old WGET_LOG=$DATADIR/wget.log MILTER_GREYLIST_S25R_WHITELIST=$DATADIR/71-whitelist.conf # 現在の公開ホワイトリストを退避する if [ -f $NEW_WHITELIST ] ; then if [ -s $NEW_WHITELIST ] ; then # 以前に取得した公開ホワイトリストを更新確認用に退避する cp -p $NEW_WHITELIST $OLD_WHITELIST fi # 以前に取得した公開ホワイトリストを削除する rm $NEW_WHITELIST fi # 公開ホワイトリストをwgetで取得する wget -P $DATADIR http://www.gabacho-net.jp/anti-spam/white-list.txt > $WGET_LOG 2>&1 if [ $? -ne 0 ] ; then # wgetの戻りコードがゼロ以外なら中止 exit 1 fi if [ ! -s $NEW_WHITELIST ] ; then # wgetで取得したファイルの大きさがゼロなら中止 exit 1 fi LINE1=`head -1 $NEW_WHITELIST` if [ "$LINE1" != '# *** PUBLISHED S25R WHITE LIST ***' ] ; then # 1行目が想定文字列でなければ中止 exit 1 fi LINE2=`sed -n '2,2p' $NEW_WHITELIST | cut -c 1-14` if [ "$LINE2" != '# Last update:' ] ; then # 2行目が想定文字列でなければ中止 exit 1 fi # 公開ホワイトリストが更新されているか調べ、更新されていなければここで終了する if [ -f $OLD_WHITELIST ] ; then diff $OLD_WHITELIST $NEW_WHITELIST > /dev/null 2>&1 if [ $? -eq 0 ] ; then # 公開ホワイトリストの更新確認用に退避した古いファイルを削除する rm $OLD_WHITELIST # 公開ホワイトリストが更新されていなければ終了 exit 0 fi # 公開ホワイトリストの更新確認用に退避した古いファイルを削除する rm $OLD_WHITELIST fi # 公開ホワイトリストを milter-greylist の様式に変換する /usr/local/sbin/s25r-whiteconv.sh $NEW_WHITELIST $MILTER_GREYLIST_S25R_WHITELIST if [ $? -ne 0 ] ; then # 変換スクリプトの戻りコードがゼロ以外なら中止 exit 1 fi
公開されているブラックリストは、2021年2月時点で4年近く更新されていないので、
milter-greylist の racl greylist domain 文に変換して取り込む処理は削除しました。
S25R によるチェックにおける逆引きのホスト名は、パラノイド検査の合格で逆引きのホスト名とし、
パラノイド検査の不合格は逆引きできないとすることで良い効果が得られます。
パラノイド検査のDNSルックアップ自体は、sendmail が行いますが、パラノイド検査の合否結果を考慮するか/しないかによって、
milter-greylist の設定キーワードが異なります。
milter-greylist の S25R の設定に関してインターネットで得られる情報のなかに、ルール2の正規表現の { } は、
期待通りに判定されないと書かれている場合があります。
実機でテストした限りでは、期待通りに判定されていましたので、Linuxのディストリビューションの
正規表現のライブラリに依存すると思われます。
下記の設定ファイルは、S25Rの原典にない追加ルール付きです。
S25R の原典の6つのルールだけをご希望の方は、『 # 追加ルール 』以降を全て削除してご活用下さい。
milter-greylist-s25r.conf
デフォルトのルールです。
#################################################################################################### ##### ##### 99-default.conf ##### #################################################################################################### # デフォルト許可 racl whitelist default
S25Rは、milter-regex および milter-greylist の何れでも実現できます。
S25Rの milter-regex の設定ファイルは、こちらです。
運用上の主な要件や特徴は、以下のとおりです。
milter-regex | milter-greylist | |
---|---|---|
再送の監視 | 手動、もしくは、外部スクリプトによる自動化 | 自動(milter-greylist自身) |
ホワイトリストの保守 | 手動、もしくは、外部スクリプトによる自動化 | 自動(milter-greylist自身によるオート・ホワイトリスト) |
S25Rの公開ホワイトリストの活用 | 定期的に取り込んだほうが良い 理由: S25R のルールに該当するホストでも、 受信した方が良いと思われる既知のホストについて、 一時拒否せずに受信できる。 |
定期的に取り込んだほうが良い 理由: S25R のルールに該当するホストでも、 受信した方が良いと思われる既知のホストについて、 一時拒否せずに受信できる。 S25Rのルールに該当するホストでも、 milter-greylistのオート・ホワイトリストによる 許可を待たずに、初回時の遅延を回避できる。 |
SMTP認証を通過したアクセスの アクセス制限の緩和 |
追加の許可ルール設定が必要 | デフォルト設定で、SMTP認証を通過したアクセスは許可 |
任意のパスに設定することができます。
また、それぞれのパスは、別々のパスに設定しても問題ありません。
milter-greylist のソケット・ファイル
「 2. 基本的な設定 」 00-settings.conf の socket と、
後述の sendmail.mc の INPUT_MAIL_FILTER で、このパスを指定します。
milter-greylist のグレイリストおよびオート・ホワイトリストのテキスト・ダンプ・ファイル
「 2. 基本的な設定 」 00-settings.conf の dumpfile で、このパスを指定します。
分割管理する設定ファイルのパス
「 2. milter-greylist の設定ファイルの分割管理と greylist.conf の生成 」、
「 8. S25R の公開ホワイトリストを milter-greylist の様式に変換して取り込む 」の
2つのサンプル・スクリプト中の変数 DATADIR で、このパスを指定します。
ディレクトリを作成します。
ディレクトリの所有者は、「 2. 基本的な設定 」 00-settings.conf の user で指定している milter-greylist の実行ユーザー milter に設定します。
mkdir /var/lib/milter-greylist chown milter:milter /var/lib/milter-greylist
sendmail.mc に milter-greylist の指定を追加します。
INPUT_MAIL_FILTER(`milter-greylist',`S=local:/var/run/milter/milter-greylist.sock, F=, T=S:1m;R:1m')dnl
sendmail.mc から sendmail.cf を生成します。 その際、sendmail.mc に「 include(`../m4/cf.m4') 」のようなカレント・ディレクトリを基点とした指定がある場合は、 カレント・ディレクトリを生成用のディレクトリに移動します。(下記の例では、/usr/share/sendmail/cf/cf )
# 現在の sendmail.cf のバックアップ・コピーを取得する cp -p /etc/mail/sendmail.cf /etc/mail/sendmail.cf-yyyymmdd-hhmm # 生成用のパスに移動する cd /usr/share/sendmail/cf/cf # sendmail.mc から sendmail.cf を生成する m4 /etc/mail/sendmail.mc | cat -s > /etc/mail/sendmail.cf
MILTER_GREYLIST=/usr/local/sbin/milter-greylist MILTER_GREYLIST_CONF=/var/lib/milter-greylist/milter-greylist.conf MILTER_GREYLIST_SOCK=/var/run/milter/milter-greylist.sock MILTER_GREYLIST_PID=/var/run/milter/milter-greylist.pid MILTER_GREYLIST_UID=milter MILTER_RUN=`dirname $MILTER_GREYLIST_SOCK` if [ ! -d $MILTER_RUN ] ; then mkdir -p $MILTER_RUN chown $MILTER_REGEX_UID $MILTER_RUN chmod o-rwx $MILTER_RUN fi echo -n > $MILTER_GREYLIST_PID chown $MILTER_GREYLIST_UID $MILTER_GREYLIST_PID $MILTER_GREYLIST -f $MILTER_GREYLIST_CONF
下記の連絡先に情報を送付すると、掲載基準に適合していれば、登録していただけます。
ギブ・アンド・テイクの精神で情報提供し、S25R の導入サイトで情報共有を図りましょう。
アクセス元を逆引きしたホスト名が S25R の6つのルールに該当しなかったり、アクセス元のIPアドレスを逆引きできない場合や、 S25R の6つのルールに該当する場合でも、再送信により milter-greylist のオート・ホワイトリストで、若干のスパム・メールは通過して着信してしまいます。
汎用的/一般的なルールを通過するドメインをブラックリスト/グレイリストで管理しようとすると多数になりがちですが、 milter-blockdomain は正規表現ではない平易な表現でドメインを指定でき、かつ、ひとつの指定で逆引きしたホスト名、HELO、エンベロープFROMを検査できます。
情報提供サービスのドメイン・ブラックリストをmilter-greylist用に変換して適用することができます。
http://www.fitserv.jp/blockdomain/
ブラックリストは、逆引きホスト名のドメインだけでなく、クラウド・サービスのホストから発信されるスパム・メールも、 HELOやエンベロープFromのドメインでブロックするものも含まれており、以下のように変換します。
example.com ↓ racl blacklist domain example.com racl blacklist helo /^(.+\.)?example\.com$/ racl blacklist from /@(.+\.)?example\.com>$/
ダウンロードしたドメインのブラックリストは、以下のコマンドで milter-greylist用に変換します。
#/bin/bash BLACKLIST_IN=blacklist.txt BLACKLIST_OUT=blacklist.out head $BLACKLIST_IN | grep '^#' >$BLACKLIST_OUT echo >>$BLACKLIST_OUT grep -v '^ *#' $BLACKLIST_IN | sed -n '/[^ ]/,$p' | sed 's/^\(..*\)$/racl blacklist domain \1/' >>$BLACKLIST_OUT grep -v '^ *#' $BLACKLIST_IN | sed -n '/[^ ]/,$p' | sed 's/\./\\\./g ; s%^\(..*\)$%racl blacklist helo /\^\(\.\+\\\.\)\?\1\$/%' >>$BLACKLIST_OUT grep -v '^ *#' $BLACKLIST_IN | sed -n '/[^ ]/,$p' | sed 's/\./\\\./g ; s%^\(..*\)$%racl blacklist from /\@\(\.\+\\\.\)\?\1>\$/%' >>$BLACKLIST_OUT tail $BLACKLIST_IN | grep '^#' >>$BLACKLIST_OUT
![]() |
![]() |
Copyright(C) 2013, Takao Abe |
2021/02/13 | 内容を整理 S25Rの公開ブラックリストの取り込みを削除 S25Rの逆引きホスト名はパラノイド検査合格のみの設定に整理 |
2018/02/04 |
サイト・ローカルのホワイトリストやブラックリストを分離。 http://www.bea.hi-ho.ne.jp/abetakao/black-and-white/ |
2017/01/15 |
追加: 付録 E: ブラックリストの情報提供サービスのブラックリストをmilter-greylist用に変換 http://www.fitserv.jp/blockdomain/ |
2016/06/11 |
追加: 付録 D: 平易な表現の(正規表現でない)多数のドメインを扱う milter-blockdomain http://www.bea.hi-ho.ne.jp/abetakao/milter-blockdomain/ |
2015/07/25 | 以下を追加。 付録 B: milter-greylist のための sendmail の設定 付録 C: S25R の公開ホワイトリストや公開ブラックリストへの登録依頼方法 |
2015/06/20 | S25Rの公開ブラックリストの取り込むファイルを追加。 ( 72-blacklist.conf ) |
2015/01/11 | domainexact の指定を追加。 ( 00-settings.conf ) ループバック・アドレスとローカル・ネットワークのホワイトリストは、分割設定ファイルの 00-settings.conf から 10-whitelist.conf に移動。 HELOが不正なアドレス指定の場合、アドレスを囲む [ ] の有無にかかわらずブラックリストに該当するように変更。( 61-helo.conf ) S25Rの公開ホワイトリストを milter-greylist の様式に変換して取り込むサンプル・スクリプトに、 wgetでダウンロードした公開ホワイトリストの1行目と2行目が想定文字列かどうかのチェックを追加。 逆引きホスト名の判定は、パラノイド検査のパスで判定することを推奨。 |
2014/05/04 | 逆引きホスト名に . (ドット)を返す DNS が見つかり、グレイリスト処理(一時拒否)を追加。 ( 90-s25r.conf ) |
2013/11/30 | 公開ホワイトリストをダウンロードして milter-greylist の様式に変換するスクリプトを追記。 HELOでこちらのサーバー名やIPアドレスを名乗るルールの自サーバーのIPアドレスをリスト形式の除外条件に変更。 ( 61-helo.conf ) |
2013/09/21 | 付録A S25Rの公開ホワイトリストの活用の理由を修正。 |
2013/09/08 | HELOでこちらのサーバー名やIPアドレスを名乗るルールの自サーバーの除外条件を変更。 ( 61-helo.conf ) |
2013/08/31 | Envelope From が空白だった場合にグレイリスト処理(一時拒否)を追加。 ( 62-envfrom.conf ) |
2013/07/13 | 公開 |