Network Users' Group ``wheel'' / Dai ISHIJIMA's Page / ソフトウェアのページ
Postfixを使った迷惑メール対策 / Postfixの設定
インストール | 設定ファイル | 迷惑メール対策 | 参考文献

初版: 2007-12-20
最終更新日: 2009--03-03



Postfixにおける迷惑メール対策のための設定


●はじめに

 本ページでは、当サイトで開発し利用している Postfixを使った「『手抜き』迷惑メール対策」の 設定例などを紹介します。 なお、説明の都合上、実際の説明と異なる部分もあります。 また、みなさんの環境に導入される際には、 その環境に合うように、適当に読みかえてください。


●インストール

 Postfixのインストールは、 Linuxや*BSDなどのUN*X系OSを使っている人にはさほど難しくはないでしょう。

 バイナリパッケージでインストールするなら、 FreeBSD 6.2Rの場合は、たとえば次のようにします。


	# pkg_add -v ftp://ftp3.jp.freebsd.org/pub/FreeBSD/ports/i386/packages-6.2-release/All/postfix-2.3.3,1.tbz

 もちろん、ソースを拾ってきて、 自分でコンパイル&&インストールというのもいいでしょう。 最近のソフトウェアのインストールはさほど難しくありません。 Postfixの場合は、 ソースを展開したサブディレクトリにある「INSTALL」という ドキュメントにしたがって、作業してください。 なお、バイナリパッケージでインストールするのは、非常に簡単ですが、 自分でコンパイルしてみるのも非常によい勉強になります。 その際には、インストール用以外のドキュメント以外にも 目をとおすのがよいと思います。


●設定ファイル

 Postfixにおいて、 サーバの動作を管理するために編集する必要のあるファイルは、 主に「main.cf」と「master.cf」の二つです。 また、これらのファイルに設定した内容に応じて、 いくつかのファイルを作成したり修正する必要もあるでしょう。

 これらの設定ファイルの置き場所は、 インストールの方法や、OSなどの環境によって変わります。 たとえば、「/etc/postfix」だったり、 「/usr/local/etc/postfix」だったりします。 あるいは、他の場所かもしれません。

 なお、社内ネットワークなど、防火壁で適当に保護され、 かつ環境が適当に整っているネットワークで、 単なる末端のメールサーバとしてPostfixを動作させるだけなら、 あまり設定ファイルをいじる必要はないかもしれません。 これは他のメールサーバ(MTA)でも同じでしょうね。

 設定ファイルに書いた内容は、 「postconf」コマンドで参照することができます。 たとえば、次のようにします。


	% /usr/local/sbin/postconf

(なお、以下の説明では、コマンド類は「/usr/local/sbin/」の下に、 設定ファイルは「/etc/postfix/」の下にあると仮定しています。)

 また、このコマンドに「-d」コマンドをつけると、 実際の設定値ではなく、(コンパイル時の)デフォルト値が表示されます。


	% /usr/local/sbin/postconf > /tmp/postconf.actual
	% /usr/local/sbin/postconf -d /tmp/postconf.default
	% diff /tmp/postconf.default /tmp/postconf.actual

とすると、どこをどう修正したのかを確認することもできます。 もちろん、設定ファイルにコメントなどをわかりやすく書いておく、 というのもよい方法です。 ですが、いろいろ触って「はて、どう変更したっけか」という場合には、 上に書いた例が役に立つかもしれません。 なお、「postconf」コマンドの詳細は「postconf(1)」マニュアルページを 参照してください。

 Postfixの設定ファイルである「main.cf」の書式は、 「postconf(5)」マニュアルページに詳しく書かれています (もちろん英文ですが…)。 かいつまんで説明すると、「設定項目 = 設定値」のような、 比較的わかりやすい書式です。「#」以下はコメントで、 空行は無視されるという、他のUN*X系ソフトウェアと似た書式です。 次に、迷惑メール対策に関連する項目をピックアップして紹介していきましょう。


●迷惑メールについての設定

 迷惑メール対策に関連する設定については、 参考文献(「ハト本」こと「Postfix実用ガイド」のpp.159-190.)に 詳しく出ています…では、ミもフタもありませんね(^^;

 では、まじめに(汗)説明していきましょう。

 Postfixでは、

のそれぞれの段階で、 迷惑メールの受信を拒否するなどの処理が可能となっています。 ここからは、順にこれらの設定例を示していきます。


●SMTP接続時に関する設定

 SMTPクライアントが接続してきたときの挙動は、 「smtpd_client_restrictions」で設定します。 たとえば、次のように。
	smtpd_client_restrictions =
		permit_mynetworks
	#	reject_unknown_client
		check_client_access regexp:/etc/postfix/greet_pause

この例では、「permit_mynetworks」と 「check_client_access regexp:/etc/postfix/greet_pause」 を「smtpd_client_restrictions」に設定しています。 なお、「#」で始まる行はコメントなので無視されます。 また、空白文字で始まっている行は、前の行と継続していると解釈されるので、 この例は
	smtpd_client_restrictions = permit_mynetworks check_client_access regexp:/etc/postfix/greet_pause

と等価になります。 上のように改行して書いても、
	% /usr/local/sbin/postconf

で表示させると、下の書式で表示されるはずです。 ただし、main.cfに書くときは、 適当に改行を入れたほうが見やすいですし、 コメントアウトするのも楽でしょうね。

各設定について

permit_mynetworks
そのマシンが所属するネットワークからの接続を許可します。 たとえば、そのマシンのIPアドレスが、192.168.8.9/24なら、 192.168.8.200や192.168.8.1からの接続を許可します (より正確には、「$mynetworks」に設定したネットワーク)。
reject_unknown_client
IPアドレスからホスト名を逆引きできないSMTPクライアントからの 接続を拒絶します。 迷惑メール対策としては大きな効果がありますが、 世間には、 逆引き設定がまともでないホストが多数あるのが現実なので、 わたしはコメントアウトすることが多いです。

check_client_access regexp:/etc/postfix/greet_pause
正規表現テーブル「/etc/postfix/greet_pause」を検索して、 接続の可否などを決定します。

/etc/postfix/greet_pauseの中身
たとえば、
	/^unknown$/	sleep 60
	

と記述しておくと、IPアドレスを逆引きできない SMTPクライアント(ホスト)に対して、 SMTPのTCPセッションが確立したあとの 「220 ホスト名」 のグリーティングバナーを送るまでに 遅延(いわゆる「greet pause」、この場合60秒)をかけることができます。 迷惑メールを送ってくるSMTPクライアントは逆引きできないことが多く、 また、遅延をかけてやると、メールの送信をあきらめることが多いので、 この方法はわりと効きます。 もちろん、これの効かない迷惑メール送信ホストも存在します。

なお、「unknown」の前後の「^」と「$」は必要です。 もし、これらの行頭および行末を示す正規表現のメタ文字を忘れると、 「somewhere.unknown.my.domain」といった、 逆引きしたホスト名に「unknown」が含まれるホストに対しても 遅延がかかってしまいます。

また、


	/./		sleep 1
	

と書くと、すべてのホストに対して1秒の遅延がかかります。

日頃からgrepやsedを使っているような、 正規表現に慣れている人であれば、 このファイルを作るのはさほど難しくはないでしょう。 みなさんのホスト(と、迷惑メールを送ってきそうなホスト) の状況に応じて、上手に設定してみてください。

実際に、わたしが職場などで使っている 「/etc/postfix/greet_pause」の中身は、 あまりにも生々しいので、ここで紹介するのは控えておきます(笑)。


●HELO受信時に関する設定

 SMTPクライアントから「HELO」を受信したときの挙動は、 「smtpd_helo_restrictions」で設定します。 たとえば、次のように。
	smtpd_helo_restrictions =
		permit_mynetworks
		reject_invalid_hostname
	#	reject_unknown_helo_hostname
		check_helo_access hash:/etc/postfix/helo_access

また、「HELO」の挨拶すらしてくれない、 お行儀の悪いホストを相手にしたくないときは、
	smtpd_helo_required = yes

を設定しておきます。

各設定について

permit_mynetworks
これは先に説明したとおり、 SMTPクライアントが自ネットワークなら許可するという指示です。

reject_invalid_hostname
HELOとともに送られてきたホスト名の書式が有効でない場合に拒否します。

reject_unknown_helo_hostname
ホスト名からIPアドレスやMXレコードをDNSで引けない場合に拒否します。 迷惑メール対策としては効果がありそうですが、 現実問題として、逆引き同様にきちんと設定していないホストも多いので、 これを有効にすると、受け取らないといけないメールを 拒否してしまうことになるかもしれません。

check_helo_access hash:/etc/postfix/helo_access
ハッシュ形式のテーブル「/etc/postfix/helo_access」を検索して、 接続の可否などを決定します。

/etc/postfix/helo_accessの中身
たとえば、自ホスト名が「myname.my.domain」で、 IPアドレスが「192.168.8.9」のとき、
	my.domain		REJECT
	myname.my.domain	REJECT
	192.168.8.9		REJECT
	

と記述しておくと、 自ホストを詐称してくる迷惑メール送信ホストを排除することができます。 なお、ハッシュ形式テーブルは、元テキストファイルを編集したら
	# /usrlocal/sbin/postmap hash:helo_access
	

のようにして「.db」ファイルを作る必要があります。 詳しくは「postmap(1)」マニュアルページを参照してください。


●送信者情報受信時に関する設定

 SMTPクライアントから「MAIL From」を受信したときの挙動は、 「smtpd_sender_restrictions」で設定します。 では、これまで同様に設定例を以下に。
	smtpd_sender_restrictions =
		check_sender_access regexp:/etc/postfix/sender_access
		reject_unknown_sender_domain

各設定について

check_sender_access regexp:/etc/postfix/sender_access
正規表現テーブル「sender_access」にしたがって、 受信の可否などを決定します。 おおざっぱには、 正規表現によるホワイトリスト・ブラックリストの指定、 というところでしょうか。

/etc/postfix/sender_accessの中身
たとえば、以下のように設定しておきます。
	/^postmaster@.*$/	OK
	/^test@test.com$/	REJECT
	/[%!@].*[%!@]/		550 Sender-specified routing rejected
	

受け取るべき送信者メールアドレスには「OK」を、 受け取りたくない送信者メールアドレスには「REJECT」を設定します。 また、「数字 文字列」とすると、 応答コードとしてその数字を送ることができます。


●宛先情報受信時に関する設定

 SMTPクライアントから「RCPT To」を受け取ったときの挙動は、 「smtpd_recipient_restrictions」で設定します。 では、これまで同様に設定例を以下に。
	smtpd_recipient_restrictions =
		permit_mynetworks
		reject_unauth_destination
		check_recipient_access hash:/etc/postfix/recipient_access
		check_policy_service unix:private/policy
		check_client_access regexp:/etc/postfix/client_access

各設定について

reject_unauth_destination
これは第三者中継(オープンリレー)を防止するために必要です。 また、順番も重要で、 「permit_mynetworks」の次あたりに書くといいでしょう。 これらを書いておくと、 のメールは配送しますが、 のメールの配送を拒否します。

check_recipient_access
宛先用のブラックリスト・ホワイトリストです。 不要なら指定しなくてもかまいません。

check_policy_service unix:private/policy
greylistingの呼び出しです。 これを使うには後述の「master.cf」の設定、 greylisting用外部プログラムの設定が必要になります。 使わないなら指定する必要はありません。

check_client_access regexp:/etc/postfix/client_access
「client_access」テーブルを検索して、 SMTPクライアント(のホスト名やIPアドレス)によって、 遅延をかけるのに使っています。 これも、使わないなら指定する必要はありません。

わざわざ遅延をかけるタイミングを二回に別ける必要があるのかな、 と思われる方もいるかもしれませんが、

を別けたほうが、 Postfixに負荷がかからないかなと思ったのでこのようにしています。 さっさとあきらめる迷惑メール送信ホストは、 SMTP接続時(smtpd_client_restrictions)の greet pauseであきらめると予想して、greet_pauseは短め、 ちょっとねばりそうなところは、 client_accessで長めの遅延をかけています。 こうすれば、無駄にPostfix(サーバ)の リソース(TCPコネクションなど)を浪費する危険性が 少なくなるかもしれません。


…続く


●参考文献

  1. Kyle D. Dent 著, 菅野 良二 訳; Postfix実用ガイド, (2004/08, オライリー・ジャパン), ISBN4-87311-195-1.
  2. Richard Blum 著, 株式会社 コスモ・プラネット 訳; Postfixメールサーバの構築, (2002/03, ASCII), ISBN4-7561-4051-3.

お問い合わせ・連絡先などはこちらをご覧ください
適用時間限定型greylisting ― Copyright (C) 2007 by Dai ISHIJIMA