Postfix で spam よけ(spammer が使っている DNS から判断)

著者:佐藤裕介 (nuts@cclub.cc.tut.ac.jp)
バージョン:2006/07/04 23:50:00 +0900 (JST)
このドキュメントは、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。 クリエイティブ・コモンズ・ライセンス

概要

spam メールを受信しないようにする方法には、大きく分けて、 SpamAssassin 等メールの内容を見て弾く方法と、送信者のメールアドレスや送信元の IP ア ドレスをもとにして弾く方法とがあります(と思います)。

今回行うのは後者で、 spammer が使っている DNS [1] を基準にして メール受信を拒否します。次のような長所があります。

なお、この設定を行うには version 2.1 以降の Postfix が必要です [2]

[1]From: に指定してあるアドレスのドメイン部をキーにして、 NS レコー ドを引いた結果。例えば nuts@cclub.cc.tut.ac.jp だったら ns0.imc.tut.ac.jp を判定に使う。
[2]

Postfix 2.0 系列で設定を行うと、メールの受信が行われる度に次のよ うなメールが postmaster 宛てに送られます。

Transcript of session follows.

 Out: 220 receive.example.com ESMTP Postfix
 In:  EHLO send.example.com
 Out: 250-receive.example.com
 Out: 250-PIPELINING
 Out: 250-SIZE 640000000
 Out: 250-VRFY
 Out: 250-ETRN
 Out: 250 8BITMIME
 In:  MAIL From:<sender@send.example.com> SIZE=996
 Out: 250 Ok
 In:  RCPT To:<recipient@receive.example.com>
 Out: 451 Server configuration error
 In:  DATA
 Out: 554 Error: no valid recipients
 In:  RSET
 Out: 250 Ok
 In:  QUIT
 Out: 221 Bye

前提条件・必要な知識

このドキュメントは、 FreeBSD 4.10-STABLE 上で、 ports からインストール した Postfix を対象に行った作業をもとにしたものです。 OS やインストール 方法が異なる場合は、設定ファイルの場所とかが多少違うかもしれません。適 宜読み替えてください。

また、 SMTP におけるメール送受信の手続きについては理解しているものとし ます。具体的には、telnet で SMTP を喋ったことがあれば OK です。

導入する際の設定手順

設定手順は次の通りです。

  1. Postfix のバージョンが 2.1 以降であることを確かめます。

    $ ls /var/db/pkg | grep postfix
    postfix-2.2.5_1,1/
    
  2. 次のような内容のファイルを postfix の設定ファイル (main.cf) と同 じ場所に用意します。ここでは reject_ns とします。

    ns1.is-name.net     REJECT spammer NS
    ns1.kim-name.net    REJECT spammer NS
    ns1.dehfs.com       REJECT spammer NS
    ns2.dehfs.com       REJECT spammer NS
    ns1.dsfad.com       REJECT spammer NS
    ns2.dsfad.com       REJECT spammer NS
    ns1.zets-1.com      REJECT spammer NS
    ns2.zets-1.com      REJECT spammer NS
    ds1.hkdom.net       REJECT spammer NS
    ds2.hkdom.net       REJECT spammer NS
    ns1.mr-bater.com    REJECT spammer NS
    ns2.mr-bater.com    REJECT spammer NS
    

    これは、spammer が使っている DNS の名前と、そこからメールが送信され てきたときの動作を、 access(5) の形式で書いたものです。例えば最初の 行は、 From: に指定されているアドレスのドメインについて、その NS レ コードを引いて、結果が ns1.is-name.net だったら、そのメールを REJECT する(その際のメッセージは "spammer NS")、という意味です。

  3. Postfix は実際には 3. のようなテキストファイルではなく、それをデータ ベース化したファイルを参照して動作します。そのファイルを作成します。

    $ sudo postmap reject_ns
    

    これで、 reject_ns と同じディレクトリに reject_ns.db というファイル ができたはずです。

  4. ちゃんとデータベースに登録されたか調べます。 REJECT spammer NS (NS 名の後に書いてある内容)と表示されれば OK です。

    $ postmap -q ns1.is-name.net hash:reject_ns
    REJECT spammer NS
    
  5. 設定ファイル main.cfsmtpd_sender_restrictions [3]check_sender_ns_access を指定します。データベース化したファイル の名前は reject_ns.db ですが、指定するファイル名には .db を つけないでください(自動補完されるようです)。

    smtpd_sender_restrictions =
      ...
      check_sender_ns_access hash:/usr/local/etc/postfix/reject_ns
      ...
    
    [3]

    千熊屋ウラ日記 (http://chig.vis.ne.jp/d/200509.html#d29_2) では smtpd_sender_restrictions ではなく smtpd_recipient_restrictions に指定をしています。

    http://www.kobitosan.net/postfix/trans-2.2/jhtml/postconf.5.html によると、文法的には smtpd_recipient_restrictions に設定して も問題ないようです。また、動作上でも RCPT TO の時点で弾くか MAIL FROM の時点で弾くかの違いだけですので、問題はないはずで す( RCPT TO より MAIL FROM の方が先に行われるはず)。但 し、設定を人間が読み書きすることを考えると、こっちに設定した方が いいのではないかと思います。

  6. Postfix に設定ファイルを読みこませます。これで設定は完了のはずです。

    $ sudo /usr/local/sbin/postfix reload
    
  7. しばらく放っておいて、ちゃんと spam を弾いているかどうか調べます。 /var/log/maillog を見て、次のようなログがあれば OK です。

    Oct 28 00:03:00 hostname postfix/smtpd[49085]: NOQUEUE: reject: RC
    PT from unknown[123.45.67.89]: 554 <sender@send.example.com>: Send
    er address  rejected: spammer NS; from=<sender@send.example.com> t
    o=<recipient@receive.example.com> proto=SMTP helo=<sender@send.exa
    mple.com>
    

DNS サーバのリストを更新する際の手順

なお、 DNS サーバのリストについては、定期的なメンテナンスが必要です。こ の方法で弾けそうなメールが送られてきた場合な、次のような手順でリストの 更新を行います。

例えば、 info@uorh.com から spam が届いた際の手順は次のようになりま す。

  1. info@uorh.com からの spam が届きました。少なくとも、このドメイン からのメールは全て spam のようです。

  2. dig uorh.com ns して NS の名前を調べます。この場合 dig(1) の 結果は次のようになります。

    $ dig uorh.com ns
      ...
    ; <<>> DiG 8.3 <<>> uorh.com ns
      ...
    ;; ANSWER SECTION:
    uorh.com.               2D IN NS        ns1.dufqv.net.
    uorh.com.               2D IN NS        ns1.dufpv.net.
      ...
    

    使われている NS は ns1.dufqv.netns1.dufpv.net です。

  3. 他のドメインからも spam が届きました。この 2 つの NS を使っているド メインからのメールは全て spam だと判断したとします。

  4. NS の名前を reject_ns に追加します。

    ns1.is-name.net     REJECT spammer NS
       ...
    ns1.dufqv.net     REJECT spammer NS
    ns1.dufpv.net     REJECT spammer NS
    
  5. 4. のファイルをもとに、データベース化した方のファイルを更新します。

    $ sudo postmap /usr/local/etc/postfix/reject_ns
    
  6. ちゃんとデータベースが更新されたかどうか調べます。

    $ postmap -q ns1.dufqv.net hash:/usr/local/etc/postfix/reject_ns
    REJECT spammer NS
    
  7. 数日したら、 maillog にメールを reject したログが残っているかどうか 調べます。あれば OK です。

    $ sudo grep "@uorh.com" /var/log/maillog
    Oct 28 23:59:20 hostname postfix/smtpd[42845]: NOQUEUE: reject: RC
    PT from unknown[123.45.67.89]: 554 <info@uorh.com>: Sender address
    rejected: spammer NS; from=<info@uorh.com> to=<recipient@receive.e
    xample.com> proto=SMTP helo=<info@uorh.com>
    

helo でやる場合

ところで、上に書いたログを見ると、いろいろと spam よけに使えそうなパラ メータが含まれています。

このうち、 helo に指定されたメールアドレスを使っても、同様に spam よけ を行うことができるはずです(未確認)。

smtpd_sender_restrictions =
  ...
  check_sender_ns_access hash:/usr/local/etc/postfix/reject_ns
  ...

という指定の代わりに、

smtpd_helo_restrictions =
  ...
  check_helo_ns_access hash:/usr/local/etc/postfix/reject_ns
  ...

とすればいいと思います。

その他の情報

他にも、送信者の情報をもとにメールを弾く方法としては次のようなものがあ ります。

Greylisting
  • MTA がメールの受信時に応答コード 4xx を返すと、メールの受け取りが 一旦拒否されます。この受信拒否応答は「一時的な拒否(busy だとか)」 を示し、送信側は一定時間後にメールの再送信を行います(たぶん)。
  • spam の発生源になるようなホストは、同じ IP アドレスからのメール送 信を長時間続けるのを嫌います。ブラックリストに載ってしまうのを避け るためでしょう。

この 2 つの前提に基づく手法です。 postfix-jp ML への投稿 Greylisting が分かりやすいと思います。

Selective SMTP Rejection (S25R) 方式

エンドユーザのホストはよく spam 送信の踏み台に使われます。そこで、エ ンドユーザのホストからのメールは全て拒否してしまえ、という単純な方法 です。

メール受信の可否は、 FQDN の逆引きができるか、 FQDN が 6 つの正規表 現にマッチするかどうか、で判断します。

Rgrey
上記の Greylisting と S25R 方式を組み合わせた方法です。 Postfix 用の 実装と、 qmail (Greylisting 用のパッチを当てたもの)用のパッチが公 開されています。

また、さらに詳しい情報については、 MTA のアクセス制御 が詳しいです。

参考資料