milter-greylist

  1. はじめに
  2. milter-greylist の設定ファイルの分割管理と greylist.conf の生成
  3. 基本的な設定
  4. 必須の許可リスト
  5. サイト・ローカルの許可リスト
  6. SMTP の HELO をチェックする設定
  7. SMTP の エンベロープFROM に関する設定
  8. S25R の公開ホワイトリストを milter-greylist の様式に変換して取り込む
  9. S25R のルールをチェックする設定
  10. デフォルト設定

1. はじめに

要件の「なるべく、ネンテナンス・フリー。なるべく、無人運用」を考慮した
sendmail の GreetPause、milter-regex、milter-greylist を組み合わにおける milter-greylist の役割分担として、
milter-greylist は、逆引きできないホストとS25R方式のルールで再送要求(一時受信拒否)と再送受信による自動許可を設定します。


2. milter-greylist の設定ファイルの分割管理と greylist.conf の生成

milter-greylist の設定ファイル greylist.conf は、設定内容を別ファイルの参照にできないので、
設定の変更の頻度や設定の種類によって、いくつかのファイルに分割しておき、それらを統合して
milter-greylist の設定ファイル greylist.conf を生成するようにすると、S25R の公開ホワイトリストの
自動取り込みが行いやすくなります。

milter-greylist で、S25R の判定により再送を促した後に再送を受信し、有効な再送と判定すると、
milter-greylist のオート・ホワイトリストに登録されますが、あらかじめ、S25R の公開ホワイトリストを
取り込んでおくことにより、S25R の基本ルールに該当する正当なホストからの初回受信時の
遅延を軽減することができます。

設定ファイルは、どのような分割でも自由ですが、意図したとおりの順番でファイルを統合できるように、
ファイル名の先頭を番号にしておきます。

ファイル名想定変更頻度設定内容
00-settings.conf基本的な動作設定など
10-passlist.conf必須の許可リスト
11-passlist.confサイト・ローカルの許可リスト
61-helo.conf無効なHELOのルールなど
62-envfrom.confSMTP の エンベロープFROM に関する設定
71-whitelist.conf高(定期的、自動化)S25Rの公開ホワイトリストをmilter-greylistの様式に変換したホワイトリスト
90-s25r.confS25Rの基本ルールなど
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

3. 基本的な設定

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 程度

4. 必須の許可リスト

ループバック・アドレスとローカル・ネットワークは、必須の許可リストです。

####################################################################################################
#####
#####     10-passlist.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     ・・・ メール・サーバー自身や自サイトのグローバル・アドレスを指定する。
racl whitelist addr 2001:db8::/64    ・・・ メール・サーバー自身や自サイトのグローバル・アドレスを指定する。

5. サイト・ローカルの許可リスト

サイト・ローカルの許可リストです。

####################################################################################################
#####
#####     11-passlist.conf
#####
####################################################################################################

# 2013/02/18  HELOにピリオドがなくても受信を許可(再試行間隔が4時間位で長い)
racl whitelist not helo /\./ domain e-tax.nta.go.jp

6. SMTPのHELOをチェックする設定

不正な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 は、メール・サーバーのホスト名を設定します。


7. SMTP の エンベロープFROM に関する設定

エンベロープFROMは、空白で送られる場合があります。RFCでは、次のように述べられています。

RFC 3464   Section 2. Format of a Delivery Status Notification (抜粋)

Whenever an SMTP transaction is used to send a DSN, the MAIL FROM command MUST use a NULL return address, i.e., "MAIL FROM:<>".

RFC 5321   Section 3.6.3. Message Submission Servers as Relays (抜粋)

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 数日~数十日 より、大幅に短期間にするか、数日程度が良いでしょう。


8. S25R の公開ホワイトリストを milter-greylist の様式に変換して取り込む

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

9. S25R のルールをチェックする設定

逆引きできないホストとS25R方式のルールです。

milter-greylist-s25r.conf

10. デフォルト設定

デフォルトのルールです。

####################################################################################################
#####
#####     99-default.conf
#####
####################################################################################################

# デフォルト許可

racl whitelist default

付録 A: milter-greylist のための sendmail の設定
  1. milter-greylist で利用するパスを決める。

    任意のパスに設定することができます。
    また、それぞれのパスは、別々のパスに設定しても問題ありません。

    /var/run/milter/milter-greylist.sock

    milter-greylist のソケット・ファイル
    「 2. 基本的な設定 」 00-settings.conf の socket と、
    後述の sendmail.mc の INPUT_MAIL_FILTER で、このパスを指定します。

    /var/lib/milter-greylist/greylist.db

    milter-greylist のグレイリストおよびオート・ホワイトリストのテキスト・ダンプ・ファイル
    「 2. 基本的な設定 」 00-settings.conf の dumpfile で、このパスを指定します。

    /var/lib/milter-greylist

    分割管理する設定ファイルのパス
    「 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
    
  2. sendmail の設定

    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
    
  3. milter-greylist の起動
    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
    

アクセス・カウント:

改訂履歴
2022/05/29 複数の方法(GreetPause, milter-regex, milter-greylist)を組み合わせて利用し、
milter-greylist の役割分担で逆引きできないホストとS25R方式など送信元からの再送による自動許可に特化した設定を公開。