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」を検索して、
接続の可否などを決定します。
Postfixでは、
「なんとか_access テーブル形式:ファイル名」という書式で、
「テーブル形式」で示されるテーブルを検索して、
「なんとか」に対する動作を設定することができます。
テーブル形式には、ここで示した「regexp(正規表現)」だけでなく、
「hash(ハッシュテーブル)」なども使えます。
詳しくは「postmap(1)」マニュアルページを参照してください。
-
/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コネクションなど)を浪費する危険性が
少なくなるかもしれません。
…続く
●参考文献
-
Kyle D. Dent 著,
菅野 良二 訳;
Postfix実用ガイド,
(2004/08, オライリー・ジャパン),
ISBN4-87311-195-1.
-
Richard Blum 著, 株式会社 コスモ・プラネット 訳;
Postfixメールサーバの構築,
(2002/03, ASCII),
ISBN4-7561-4051-3.
お問い合わせ・連絡先などはこちらをご覧ください
適用時間限定型greylisting ―
Copyright (C) 2007 by Dai ISHIJIMA