[Nature's Linux Tech Portal]  
 
Google
WWW を検索 tech.n-linux.com を検索 Wiki検索
迷惑メール対策シリーズ
postgrey の導入


テクニカルライター Matthew/秋元 憲一
matthew.szulik(at)gmail.com
2006年11月22日
テクニカルノートコード:tcn00072


グレイリスティング †

 一般的な適切に設定されている MTA は宛先の MTA にメール受信を一時的に拒否されても一定時間経過後に再接続して配送しようとします。ところが、open proxy を経由して送信する方法や、メールを送信する機能を持つウィルスに感染した PC などから遠隔操作でメールを送信する方法では迷惑メールが再送されることがほとんど無く、一方的にメールを送りつけてくることが多いと推測されています*1。この性質を利用すれば、迷惑メールとそうでないメールを選別することができます。

 再送の性質の違いを利用した迷惑メールの対策の一つにメールを再送させる方法があります。一度も受け取ったことのない送り主からのメール受信を一時的に拒否し、再送があったときに初めてメールを受信する方法です。この方法では、送信されたメールの識別に、送信に使われたメールサーバの IP アドレス*2、送信者*3と受信者*4のメールアドレスなど*5が利用されます。再送を待っている間、メールの識別情報はグレイリストとよばれるリストに保持されます。つまり、再送を行わない MTA(メール転送エージェント)から送信されてきたメールであると疑い、灰色のリストに記録しておくのです。そして、設定時間内に再送されればそれ以後は通常通りに扱われるように識別情報がホワイトリストに登録され、同時にグレイリストから削除されます。設定時間内に再送がなければホワイトリストに登録されずにグレイリストから識別情報が削除され、最初の状態に戻ります*6。このように、グレイリストを使ってメールをより分ける方法はグレイリスティングと呼ばれています。


↑

効果と補足 †

 再送をしない迷惑メールの受信拒否には効果が認められる一方で、次の問題点があります。

  • 再送の判別に参照と更新処理が伴うのでその分スループットが落ちる。
  • メール配送が遅れることがある。
  • 送信元のメールサーバの再送処理が適切でない場合、永遠にメールが受け取れなくなることがある。
  • 無料メールサービスなどを利用した迷惑メールには効果がない。
  • 最近は再送する迷惑メール送信手段が利用されることがあるため、グレイリスティングをすり抜ける迷惑メールがある。

 グレイリスティングだけに頼らず、幾つかの迷惑メール対策を組み合わせるのが一般的ですが、この記事では Postgrey パッケージの取り扱いについての解説を行います。


↑

Postgrey †

 グレイリスティングを実現する手段や方法は幾つかありますが、Nature's Linux 公式パッケージが用意されているメールサーバの Postfix 向けに Postgrey が開発されています。Postfix の挙動を決めるポリシーサーバとして開発され、グレイリスティングが実装されています。

 Postgrey は スイス連邦工科大学チューリッヒ校*7電気工学科のIT サポートグループに籍を置く David Schweikert 氏によって開発され、現在もバグフィックスや改良などが行われており、バージョンを重ねています*8。ライセンスは GPL 2 で、これまでにリリースしたバージョンのソースが公開されています。

ソース URL:http://isg.ee.ethz.ch/tools/postgrey/pub/

 Postgrey はプログラミング言語 Perl で書かれ、実行時には CPAN*9 のライブラリやモジュールと Berkeley DB を必要とします。ライブラリやモジュールは Postgrey をサーバとして実行させるのに、Berkeley DB は はグレイリストとホワイトリストに利用されます。


↑

Nature's Linux postgrey パッケージ †

 11月6日、Nature's Linux 向け postgrey パッケージがリリースされました。MTA に Postfix を利用しているサーバにインストールし、簡単な設定を行えば、グレイリスティングが可能となります。

新規パッケージ情報 URL:http://www.iptelecom.jp/newpkg/view.php?number=9


↑

グレイリスティングを行う Postfix の構築 †

 既に Postfix が VFS にインストールされているとして作業を進めます。Postfix のインストール方法はPostfix を利用した SMTP サーバ構築を参考にして下さい。


↑

インストール †

 apt-get コマンドでインストールを行います。root ユーザで実行して下さい。CPAN ライブラリやモジュールなどの依存パッケージも自動的にインストールされます。

[VFS-root@keiji ~]# apt-get update && apt-get install postgrey

インストールに成功すると次のメッセージが表示されます。Postfix の設定ファイル main.cf に次のような設定を参考に行います。

================================================================================
 NOTE : Sample description for postfix's main.cf

  smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination che\
ck_policy_service inet:127.0.0.1:10023

================================================================================
図1:postgrey パッケージインストール直後のメッセージ

 インストールが成功すると自動的に次の設定が行われます。

  • postgrey グループ(グループID 92)が追加される。
  • postgrey ユーザ(ユーザID 92)が追加される。
  • /opt/etc/postgrey ディレクトリが追加される。設定ファイルはここに置かれる。
    • このディレクトリには postgrey_whitelist_clients が置かれる。このファイルには予めメール受信してもよい MTA の FQDN と IP アドレスが記述されている。
    • このディレクトリには postgrey_whitelist_recipients が置かれる。このファイルには予めメールを受信してもよい受信者のメールアドレスが記述されている。
  • /etc/sysconfig/postgrey が追加される。
    • 起動スクリプトを変更することなしに、このファイルの変数に値を設定することで、postgrey の起動時にオプションを与えることが可能。
  • /var/lib/postgrey ディレクトリが追加される。
    • このディレクトリにグレイリストやホワイトリストに利用されるデータベースファイルが置かれる。
  • /var/run/postgrey ディレクトリが追加される。
    • このディレクトリには postgrey 実行中に プロセス ID が書かれたファイル postgrey.pid が置かれます。停止中は存在しない。
  • /etc/rc.d/init.d/postgrey 起動スクリプトが追加される。
  • 初回のインストールであれば、chkconfig --add postgrey が実行されるが、全てのランレベルで off にされる。


↑

設定 †

 インストール時に殆どの設定は行われますが、幾つか設定作業が残っています。初めに postgrey の設定を行います。起動スクリプトやデータベースなどの配置はインストール時に殆ど終えているので、大抵の場合は postgrey サービスを起動するだけです。また、OS 再起動時に自動的に起動されるようにも設定しておきましょう。

サービス起動:

# service postgrey start

起動ランレベル設定:

# chkconfig postgrey on

 続いて、postfix の設定を行います。postgrey インストール成功時に出力されたメッセージのとおりに、/opt/etc/postfix2/main.cf に次の一行を追加してください。これは「Postfix SMTP サーバが RCPT TO コマンドの場面で適用するアクセス制限(引用元)」、つまり受信時にどういったメールを受け取るかのポリシーを指定するものです。この設定の最後の二節、"check_policy_service inet:127.0.0.1:10023" が postgrey へ問い合わせることを指定しています*10。

smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination \ check_policy_service inet:127.0.0.1:10023

 上記の設定は、指定された順番に適用され、その方針にマッチした瞬間にメールが受信されます。この設定を文章にすると、デフォルト設定のままであれば、同一ネットワーク内からのメールはなんでも受信し、外からのメールはこのホストに設定されたドメインや FQDN にマッチしない場合は受け取らず、その他はグレイリスティングにかけるということ表しています。

表1: smtpd_recipient_restrictions で指定されている制限(main.cfがデフォルトの場合)
制限解説
permit_mynetworksクライアント(メールを送ってきた MTA )が $mynetwork に設定されているネットワークアドレスにマッチする場合に受信を許可
reject_unauth_destination(デフォルトの設定で)メールの宛先が $myhostname や $mydomain にマッチしない場合は受信しない
check_policy_service inet:127.0.0.1:10023指定されたポリシーサーバに問いあわせる。この場合自ホストのポート 10023 番に問い合わせる。

 設定が終了したら、postfix に設定を再読み込みさせます。これで設定完了です。

# postfix reload


↑

設定を変更するには †

 設定値を変更するには /etc/sysconfig/postgrey ファイルを変更します。次にファイル中の変数とその説明を表にまとめました。このうち、PORT、MAX_AGE、DELAY_SEC の設定値は挙動確認に利用しますので覚えておいてください。

表2:/etc/sysconfig/postgrey の変数の意味
変数設定対象デフォルト値
WHITELIST_CLIENTS予め受信を許可しておく MTA の FQDN や IP アドレスが書かれたファイルへのフルパス/opt/etc/postgrey/postgrey_whitelist_clients
WHITELIST_RECIPIENTS予め受信を許可しておく受信先のメールアドレスが書かれたファイルへのフルパス/opt/etc/postgrey/postgrey_whitelist_recipients
USE_UNIXUnix Socketを利用する場合は yes しない場合は no 。no
PORTポート番号10023
DBPATHデータベースファイルを置くディレクトリのフルパス/var/lib/postgrey
USER実行ユーザpostgrey
GROUP実行グループpostgrey
PIDFILEプロセスID ファイル/var/run/postgrey/postgrey.pid
MAX_AGE許可メールアドレスのデータベース保存期間を日単位で指定35 (日)
DELAY_SECグレイリスティングによる受信拒否時間300 (秒)
OPTIONSこの表に記載されていないオプションを指定するのに利用
NICELEVELnice 値
SIGNALプロセスを停止させるのに送るシグナル指定されていないがデフォルトは KILL (-9)


↑

挙動確認 †

 挙動を確認するには Postfix が出力しているログ /var/log/mail と /var/lib/postgrey にあるデータベースをみます。次のログの例は、仮想 OS を用いてメールサーバを複数台用意し、ネットワーク内の閉じた空間の中でメールの配送を行わせるようにした環境で試したものです。PC などの MUA からメールを mta-b.spam-shuukei.com の MTA (Postfix)を利用して mta-a.spam-bokumetsu.jp の受信者( matthew さん)にメールを送信しています。仮想 OS を利用しましたが、右の図のようなネットワーク環境を想定しています。

図2:ログ取得に利用した仮想メールサーバとネットワーク環境


↑

/var/log/maillog †

 tail コマンドや view コマンドでログファイルの内容を確認することがきます。tail コマンドに-fオプションを与えて実行すると、絶えずそのファイルの最新の内容を表示し続けます。止めるときにはctrl+\で抜けてください。

# tail [ -f ] /var/log/maillog

 postgrey を導入する前の mta-a.spam-bokumetsu.jp のログをみてみましょう。meiwaku@spam-baramaki.com が送り主のメールが mta-b.spam-chuukei.com を経由して配送されていますが、直ぐに mailbox に格納されています(行が長いので折り返しています。折り返し記号は\です。)

Sep 19 17:09:30 mta-b postfix/smtpd[2213]: 5F567150B87: client=mta-b.spam-chuuke\
i.com[192.168.0.201]
Sep 19 17:09:30 mta-b postfix/cleanup[2217]: 5F567150B87: message-id=<450FA09F.6\
030406@spam-baramaki.com>
Sep 19 17:09:30 mta-b postfix/qmgr[2201]: 5F567150B87: from=<meiwaku@spam-barama\
ki.com>, size=940, nrcpt=1 (queue active)
Sep 19 17:09:30 mta-b postfix/smtpd[2213]: disconnect from mta-b.spam-chuukei.co\
m[192.168.0.201]
Sep 19 17:09:30 mta-b postfix/local[2220]: 5F567150B87: to=<matthew@mta-b.spam-b\
okumetsu.jp>, relay=local, delay=0, status=sent (delivered to mailbox)
Sep 19 17:09:30 mta-b postfix/qmgr[2201]: 5F567150B87: removed
図3:postgrey を導入する前の迷惑メールを中継されたMTAのログ:

 postgrey を導入したときのログをみてみましょう。Postfix を起動した後に、postgrey を起動し、Postfix の設定ファイル main.cf を編集し、設定を読み込ませてから、同じようにメールを送ってみます。最初の送信では受信していません。再送されてこない迷惑メールであれば、この時点で受信拒否に成功しています(図5)。この実験環境では Postfix に中継させるようにしているので、1164 秒後にメールが再送されて、受信が完了しています。迷惑メール以外または再送される迷惑メールは受信ができます(図6)。

Sep 22 14:26:49 mta-b postfix/postfix-script: starting the Postfix mail system
Sep 22 14:26:49 mta-b postfix/master[5555]: daemon started -- version 2.2.10, co\
nfiguration /opt/etc/postfix2
Sep 22 14:26:57 mta-b postgrey[5569]: Process Backgrounded
Sep 22 14:26:57 mta-b postgrey[5569]: 2006/09/22-14:26:57 postgrey (type Net::Se\
rver::Multiplex) starting! pid(5569)
Sep 22 14:26:57 mta-b postgrey[5569]: Binding to TCP port 10023 on host localhos\
t
Sep 22 14:26:57 mta-b postgrey[5569]: Setting gid to "92 92"
Sep 22 14:26:57 mta-b postgrey[5569]: Setting uid to "92"
Sep 22 14:27:05 mta-b postfix/postfix-script: refreshing the Postfix mail system
Sep 22 14:27:05 mta-b postfix/master[5555]: reload configuration /opt/etc/postfi\
x2
図4:Postfix 起動 から postfix reload までのログ
Sep 20 05:35:56 mta-b postfix/smtpd[3120]: connect from mta-a.spam-chuukei.com[1\
92.168.0.201]
Sep 20 05:35:56 mta-b postfix/smtpd[3120]: NOQUEUE: reject: RCPT from mta-a.spam\
-chuukei.com[192.168.0.201]: 450 <matthew@mta-b.spam-bokumetsu.jp>: Recipient ad\
dress rejected: Greylisted, see http://isg.ee.ethz.ch/tools/postgrey/help/mta-b.\
spam-bokumetsu.jp.html; from=<meiwaku@spam-baramaki.com> to=<matthew@mta-b.spam-\
bokumetsu.jp> proto=ESMTP helo=<mta-a.spam-chuukei.com>
Sep 20 05:35:56 mta-b postfix/smtpd[3120]: disconnect from mta-a.spam-chuukei.co\
m[192.168.0.201]
図5:迷惑メールの場合、これで再送がなければ受信拒否に成功
Sep 20 05:55:20 mta-b postfix/smtpd[3128]: connect from mta-a.spam-chuukei.com[19\
2.168.0.201]
Sep 20 05:55:20 mta-b postgrey[3103]: delayed 1164 seconds: client=mta-a.spam-chu\
ukei.com, from=meiwaku@spam-baramaki.com, to=matthew@mta-b.spam-bokumetsu.jp
Sep 20 05:55:20 mta-b postfix/smtpd[3128]: C4138150DFB: client=mta-a.spam-chuukei\
.com[192.168.0.201]
Sep 20 05:55:20 mta-b postfix/cleanup[3132]: C4138150DFB: message-id=<45105509.60\
80002@spam-baramaki.com>
Sep 20 05:55:20 mta-b postfix/qmgr[2969]: C4138150DFB: from=<meiwaku@spam-baramak\
i.com>, size=1081, nrcpt=1 (queue active)
Sep 20 05:55:20 mta-b postfix/smtpd[3128]: disconnect from mta-a.spam-chuukei.com\
[192.168.0.201]
Sep 20 05:55:20 mta-b postfix/local[3133]: C4138150DFB: to=<matthew@mta-b.spam-bo\
kumetsu.jp>, relay=local, delay=0, status=sent (delivered to mailbox)
Sep 20 05:55:20 mta-b postfix/qmgr[2969]: C4138150DFB: removed
図6:迷惑メール以外は再送されると仮定し、実際に再送されたら受信する


↑

db_dump でデータベースをみる &dagger;

 /var/log/postgrey にあるデータベースにグレイリストが蓄積されます。postgrey に初めて認識されたメールは postgrey.db にグレイリスティングされます。受信拒否時間が経過してからメールが再送されてくると postgrey_clients.db に登録され、これ以後は同じメールサーバからを利用した同じ送り主からのメールを直ぐに受け付けます。一度受信可能となっても MAX _AGE で指定した日数以内にメールが送られてこない場合は、postgrey.db と postgrey_clients.db からデータが削除されます。

 データベースの確認方法は Nature's Linux インストール時からインストールされている libdb42-util パッケージの db_dump を利用します。パスが通ってないのでコマンドまでのフルパスを与え、オプション-pを指定して実行します。

 初めにグレイリスティングに利用される postgrey.db をみてみます。

[VFS-root@keiji ~]# /usr/bin/db42/db_dump -p postgrey.db
VERSION=3
format=print
type=btree
db_pagesize=4096
HEADER=END
 192.168.0.0/meiwaku@spam-baramaki.com/matthew@mta-b.spam-bokumetsu.jp
 1158896737,1158898482,201
DATA=END
図7:グレイリスト

 HEADER=END から DATA=END の間にあるのがグレイリスティングされたメールの情報です。二行に渡って次の形式で表現されます。1行目がキーです。二行目に時間が記録され、その表現形式はシステムの内部時計形式です*11。再送がない場合は2行目に同じ時間が二つ並びます。このような二行に渡るレコードが postgrey が処理を行う度に追加されます*12。

1行目:CLIENT_IP/SENDER/RECIPENT (レコードのキー)
2行目:最初の受信時刻,最新の受信時刻,CLIENT_IPの下位8ビット分のアドレス ~

 続いて postgrey_clients.db をみてみます。同様に二行に渡り、再送があればレコードが追加されます。

[VFS-root@keiji ~]# /usr/bin/db42/db_dump -p postgrey_clients.db
VERSION=3
format=print
type=btree
db_pagesize=4096
HEADER=END
 192.168.0.201
 1,1158898482
DATA=END
図8:追加されたホワイトリスト(予め登録しておけるホワイトリストもある)

"HEADER=END" から "DATA=END" に囲まれたところが登録されたレコードで、1行目が CLIENT_IP を利用したレコードのキー、2行目がカウンタと初めてホワイトリスト登録された時刻です。

1行目:CLIENT_IP (レコードのキー)
2行目:カウンタ、再送して受信可能とした時刻


↑

参考 &dagger;

  • Postgrey - Postfix Greylisting Policy Server
  • SPAM 撃退モジュール postgrey を Postfix で使用する!
  • Postgrey 日本語ポータル
  • Postfix設定パラメータ


↑

テクニカルライター紹介 &dagger;

robo1-3-10.gif



テクニカルライター Matthew/秋元 憲一
matthew.szulik(at)gmail.com



 OSS関連なお仕事のお手伝いをさせていただいております。 元々は制御理論関係でMATLABやMapleでグレブナ基底やなどを基本に、 例えば多項式を要素に持つ伝達関数行列などの既約判定などを計算する制御系CAD開発などを行っておりました。今はその頃の記憶もすっかり消えて、OSSという大海を浮き輪をつけながら泳いでおります。

 元々ロボットに興味がありましたので、関連のOSSに参加したいと思っております。 また、オートノミックなサーバや、仮想化技術に興味がありますので、 機会があればそういったものに参加したいと思っております。最近は TOMOYO Linux など、セキュリティ関連の OSS に大変興味があり微力ながら活動をしております。

 実家で小さな釣り船を所持しております。カレイや秋鮭が釣れますので、北海道で釣りがしたい方は連絡ください。また、この季節はエゾバフンウニが美味しいので、大好きな方に有料でお分けしております。よろしくお願いします。


↑

この文章について &dagger;

本文書に関する著作権の保有について

Nature's Linux関連の記事は、著作権者であるジグソー株式会社がすべての権利を保有しています。

Copyright (C) 2003-2009 JIG-SAW, Inc. All rights reserved.

本書に記載されている会社名、製品名は、各社の登録商標または商標です。

記載の内容は予告無く変更される可能性があります。

また、この文書は、 クリエイティブ・コモンズ・ライセンス の下でライセンスされています。



*1 最近は再送してくる迷惑メールがあります。
*2 RFC 用語でいうと CLIENT_IP
*3 RFC 用語でいうと SENDER
*4 RFC 用語でいうと RECIPIENT
*5 実装によってはメッセージ ID も利用されます
*6 実装方針や設定によってはホワイトリストにあるメールアドレスのメールが設定期間内にこないと削除することもあるでしょう。
*7 あのアインシュタインの出身校です
*8 2006年9月22日時点で、バージョンは1.27
*9 Comprehensive Perl Archive Network
*10 長い行があるので掲載の都合上折り返し記号\を使って折り返しています。
*11 グリニッジ標準時(GMT)1970年1月1日0時0分0秒からの経過秒数
*12 表示させるとキーをアルファベット順にソートして表示します
 
 
 
 
 |  会社概要  |  企業ポリシー  |  お問い合わせ  |
Copyright (C) 2003-2009 JIG-SAW, Inc. All rights reserved.