milter-regex

  1. はじめに
  2. milter-regex の設定ファイルの分割管理と milter-regex.conf の生成
  3. milter-regex の動作に関する設定
  4. 必須の許可リスト
  5. サイト・ローカルの拒否ルール
  6. 無効なHELOなどの拒否ルール

1. はじめに

要件の「なるべく、ネンテナンス・フリー。なるべく、無人運用」を考慮した
sendmail の GreetPause、milter-regex、milter-greylist を組み合わにおける milter-regex の役割分担として、
milter-regex は、スパム・メールに特徴的なルールで効果の持続が期待できるものを設定します。

ここで紹介するルールは、GeoIPを条件としたものが含まれるため、milter-regex のバージョン 3.0 以降を利用します。
https://github.com/milter-regex


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

milter-regex の設定ファイル milter-regex.conf は、設定内容を別ファイルの参照にできないので、
設定の変更の頻度や設定の種類によって、いくつかのファイルに分割しておき、それらを統合して
milter-regex の設定ファイル milter-regex.conf を生成するようにすると管理しやすくなります。

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

ファイル名想定変更頻度設定内容
00-settings.confmilter-regex の動作に関する設定
10-passlist.conf必須の許可リスト
20-blocklist.confサイト・ローカルの拒否ルール
21-blockhelo.conf無効なHELOなどの拒否ルール

分割した設定ファイルを milter-regex の設定ファイル milter-regex.conf に統合するスクリプト

#!/bin/bash

DATADIR=/var/lib/milter-regex     ・・・ 上記の分割した設定ファイルの保管パス(任意のパス)
CONF=milter-regex.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-regex の動作に関する設定

milter-regex で GeoIP を利用するための動作に関する設定です。

####################################################################################################
#####
#####     00-settings.conf
#####
####################################################################################################

# ipv4file, ipv6file
#
# Before use keyword 'country', both these keywords must be specified.
#
# Get RIR allocation data
#
# (1) Download IP address allocation lists from the RIR ( Regianl Internet Registry )
#     ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
#     ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
#     ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
#     ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
#     ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest
#
# (2) Convert IP address allocation lists from ASCII format to binary format
#     cat delegated-*-latest | grep '|..|ipv[46]|' | sort -t '|' -k 3,4 | /usr/local/sbin/milter-regex-ip-prep ipv4.dat ipv6.dat
#
# Maximum path length is 1023 characters.
#
ipv4file "/var/lib/milter-regex/ipv4.dat"
ipv6file "/var/lib/milter-regex/ipv6.dat"

# geoipCashMax
#
# Default  100K ( Minimum size )
# Unit     None: Byte | k/K: KByte | m/M: MByte
#
geoipCashMax  1M

# geoipCashKeep
#
# Default  7D
# Unit     None: Second | h/H: Hour | d/D: Day
#
geoipCashKeep 7D

# geoipDebugLog
#
# For development purpose, this keyword can force syslog level LOG_DEBUG to LOG_INFO.
# Only enable syslog output in GEOIP source code, not whole milter-regex.
#
# Default  DEBUG
# Values   DEBUG | INFO
#
#geoipDebugLog DEBUG

4. 必須の許可リスト

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

####################################################################################################
#####
#####     10-passlist.conf
#####
####################################################################################################

# ループバック・アドレスとローカル・ネットワークの無条件送信許可

accept

connect // /^127\./

connect // /^10\./
connect // /^169\.254\./
connect // /^172\.(1[6-9]|2[0-9]|3[0-1])\./e
connect // /^192\.168\./

connect // /^::1$/

connect // /^f[cd]/i
connect // /^fe80:/i

connect // /^192\.0\.2\.$/     ・・・ メール・サーバー自身や自サイトのグローバル・アドレスを指定する。
connect // /^2001:db8:$/i      ・・・ メール・サーバー自身や自サイトのグローバル・アドレスを指定する。

5. サイト・ローカルの拒否ルール

受信拒否のルールです。
スパム・メールに特徴的なルールが見つかった時、メインテナンスして下さい。

20-blocklist.conf(更新


6. 無効なHELOなどの拒否ルール

不正なHELOや受信拒否するHELOです。 受信拒否、中継拒否のリストは、必要に応じてそれぞれのサイトでメインテナンスして下さい。

####################################################################################################
#####
#####     21-blockhelo.conf
#####
####################################################################################################

# HELOでこちらのサーバー名やIPアドレスを名乗る

reject "Refused connection by site policy. ( Malformed HELO )"

helo /^foobar\.example\.jp$/i and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n
helo /^192\.0\.2\.1$/         and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n
helo /^localhost$/i           and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n
helo /^127\.0\.0\.1$/         and connect // /^127\.0\.0\.1$/n and connect // /^192\.0\.2\.1$/n and connect // /^::1$/n

# HELOがピリオドだけ

reject "Refused connection by site policy. ( Invalid HELO )"

helo /^\.$/

# HELOの拒否

reject "Refused connection by site policy."

helo /^User$/i
helo /^ylmf-pc$/
helo /^info-api\.ru$/
helo /^dc3-dc1$/
helo /^masscan$/
helo /^gerg$/
helo /^admin$/i
helo /^scanner\.sslsonar\.org$/

# HELOのTLDが存在しない

reject "Refused connection by site policy. ( Nonexistence TLD )"

helo /\.domain$/
helo /\.localdomain$/
helo /\.local$/

# HELOの第2レベルが example

helo /^(.+\.)?example\.[^.]+$/ei

192.0.2.1 は、メール・サーバーのグローバル・アドレスを設定します。

foobar.example.jp は、メール・サーバーのホスト名を設定します。


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

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

    /var/run/milter/milter-regex.sock

    milter-regex のソケット・ファイル
    後述の sendmail.mc の INPUT_MAIL_FILTER で、このパスを指定します。

    /var/lib/milter-regex

    分割管理する設定ファイルのパス
    「 2. milter-regex の設定ファイルの分割管理と milter-regex.conf の生成 」、
    「 7. S25R の公開ホワイトリストを milter-regex の様式に変換して取り込む の
    2つのサンプル・スクリプト中の変数 DATADIR で、このパスを指定します。

    ディレクトリを作成します。
    ディレクトリの所有者は、実行ユーザー milter に設定します。

    mkdir /var/lib/milter-regex
    
    chown milter:milter /var/lib/milter-regex
    
  2. sendmail の設定

    sendmail.mc に milter-regex の指定を追加します。

    INPUT_MAIL_FILTER(`milter-regex',`S=local:/var/run/milter/milter-regex.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-regex の起動
    MILTER_REGEX=/usr/local/sbin/milter-regex
    MILTER_REGEX_CONF=/var/lib/milter-regex/milter-regex.conf
    MILTER_REGEX_SOCK=/var/run/milter/milter-regex.sock
    MILTER_REGEX_PID=/var/run/milter/milter-regex.pid
    MILTER_REGEX_UID=milter
    MILTER_REGEX_GID=milter
    
    MILTER_RUN=`dirname $MILTER_REGEX_SOCK`
    
    if [ ! -d $MILTER_RUN ] ; then
        mkdir -p $MILTER_RUN
        chown $MILTER_REGEX_UID $MILTER_RUN
        chmod o-rwx $MILTER_RUN
    fi
    
    $MILTER_REGEX -c $MILTER_REGEX_CONF -u $MILTER_REGEX_UID -U $MILTER_REGEX_UID -G $MILTER_REGEX_GID -p $MILTER_REGEX_SOCK -r $MILTER_REGEX_PID
    

アクセス・カウント:

改訂履歴
2022/05/29 複数の方法(GreetPause, milter-regex, milter-greylist)を組み合わせて利用し、
milter-regex の役割分担でスパム・メールに特徴的なルールで効果の持続が期待できるものに特化した設定を公開。