postfixとspamの関係


postfixの設定に関するページでspam対策に関しても書いた。
しかしその後実験をくり返すうちに対策方針にも変化が生じてきた。
従来行っていた対策は※逆引き不可能なホストをはじく※HELO書式の不正なホストをはじく※RBLなどブラックリストの活用がメインだった。
逆引きに関しては賛否両論がある。
現在国内の多くのホストは逆引き設定がされているが、一部研究期間や大学などではこれが行われていないケースがある。
また諸外国のように、逆引き設定を行わないのが一般的であるとする所も多い。
私自身の考え方としては逆引き出来ないホストをリジェクトするのは大きな問題ではないと思う。
何故ならば、逆引き設定が一般的ではない諸国においてもメールサーバとして動作しているマシンくらいは逆引きが可能だからだ。
それ以外の回線上に任意のSMTPサーバをぶら下げて運用するのは運用側がリスクを担保する必要があると思う。
特に我が国などではOP25Bが一般的となっており、そもそも正規のメールサーバ以外からのメール送信は出来なくなりつつある。
HELOチェックもspam防止には有効だ。
ここに送信先(www.fnf.j
など)を入れてくる場合もあり、これらを元にspam判定することが出来る。
HELOにはFQDNを入れるのが正しいのだが、日本の企業ですら適当な設定をしているところ(大和ハウスなど)がある。
こうなるとspamerの方が(spam到着率を高めたいから)正しい設定をしてくるケースも少なくないので困る。
結局の所不正書式をチェックしたとしてもspamの完全抑止にはつながらないばかりか、下手をすると誤排除が起きる不具合もあるわけだ。
逆引きにしても同じように、正引きと逆引きが違うケースは珍しくない。
DDNSなどで自宅サーバを運用されている方は仕方ないことだろうし、設定間違えと思われるようなホスト名を通知してくる所もある。
そこでグレイリスティング方式を検討することにした。
怪しげ系ドメインや逆引き不可能なホストからのメールは4xx(再送)エラーを出して受信せずに放置し、その後再送があった場合には受信するという仕組みだ。
spamerは短時間に多くのメールを、しかも見知らぬ人のPCを勝手に使用して送りつけるケースもあり、こうした場合は再送など手間のかかる事はやっていられない。
一方正常なメールは正常な配送ルールに従って再送されてくるので受信することが出来る。
これを送信元IPやHELOに対して行えば、かなりの確率でspa
排除が出来て、しかも正常なメールの救済も可能になると思う。
見知らぬPCやサーバを踏み台にspamを送りつける連中は、一々HELOなど設定していられないとばかりにMyComputerなどで送ってきたりする。
これに関してはこちらのサイトが詳しいので参照されたい。
spam本文によるフィルタも確かに効果的なのだが、これにしてもspamerはフィルタに引っかからないような文面にして送ってくる。
一方でspamではないメールはspamフィルタに引っかかることなど考えずに本文を作る。
こうなると学習型フィルタといえども完璧ではなく、必要なメールがフィルタリングされてしまうことも充分考えられる。
上記サイトではcheck_dynamic_clientの正規表現リストに従ってある程度の判断をしているが、例えばau携帯電話からのメールはnx3oBP03-05.ezweb.ne.jpから送信されてくるので/^[^.]*[0-9][^a-z0-9]+[0-9][^.]*/ の判定に引っかかる。
なので、この正規表現は/^[^.|nx]*[0-9][^a-z0-9]+[0-9][^.]*/ に変更した。
同様にアプリゲットの場合はプロバイダの線から送信してくるので122x208x136x57.ap122.ftth.ucom.ne.jpであり、これはモロにspam判定される。
(グレイリストで助かるが)この辺りはメール送信者の意識の問題で、例えばHELOにしても、不正な記述のあるものはリターンさせてしまっても良いのではないかとの思いもある。
間違っているものを救済するための努力は無駄だ。
実際F&FのSMTPサーバにしても、一時期spfを"-all"で設定しており、これだと転送も許さないことになるのでリターンが増えた。
無料メールアドレスなどから携帯電話宛に転送している方などが居たからなのだが、そのエラーを見て"-all"を"~all"に変更した訳なのでメールサーバ管理者はその辺りを気にするのが普通だろう。
そのspfにしてもpassとfail以外は意味を見いだせないのが現状だ。
pass 信頼できるsoftfail 転送か?spamか?none 設定されていないのか?spamか?fail 転送か?spamか?これ単体ではうまく機能しない可能性の多いspfなのだが、グレイリスティングとこれを組み合わせることによって無用な遅延を回避する仕組みもある。
tumgreyspfはそのpostfix用のモジュールでインストールも簡単ではあるがreceivegreyより自由度は低い。
F&Fでは現在各ルールチェックは甘め(普通?)に設定し、あとはグレイリスティングに任せている。
ログをチェックして前述ezwebのような場合はその都度対策するかホワイトリストに登録する。
もちろん多少の遅延を許すならばホワイトリストは必要ない。
F&Fからの地震情報メールの送信ログを見ても受け側がグレイリスティングによる再配送を要求してくるところも存在するが、余りそのインターバルを長く取っていると即時性が失われてしまう。
main.cfには様々な設定項目がある。
この中でsmtpd_client_restrictions
mtpd_sender_restriction
は、実際にはRCPTの所でチェックされるのでsmtpd_recipient_restriction
の、中に書くのと同じになる。
(ようだ)設定の中のclientとは送信元smtpサーバのIPアドレスやドメイン、senderとは(RCPTの中の)From の値、recipientとは(RCPTの中の) To の値である。
この辺は通信に於ける上り/下りの表現と同じように、そう言うものだと思って慣れるしかない。


現在のmain.c
smtpd_recipient_limit = 100000
smtpd_client_connection_rate_limit = 10000
anvil_rate_time_unit = 1
default_process_limit = 500
queue_run_delay = 60
minimal_backoff_time = 100 smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = ye
#メールアドレス収集対策
disable_vrfy_command=yes
#ウイルスなどによるメールばらまきを防ぐために。

smtpd_reject_unlisted_sender = yes
#"-"から始まるアドレスを許可
allow_min_user = ye
mailbox_size_limit = 0
#拒否はするが再送させて、助けられるものは翌日にでも助ける。

non_fqdn_reject_code = 450
invalid_hostname_reject_code = 450 127.0.0.1 10027_time_limit = 3600
127.0.0.1 10028_time_limit = 3600 smtpd_restriction_classes =
   check_dynamic_client
   check_client_jp
   check_client_n
check_dynamic_client =
   check_client_access cidr /etc/postfix/check_client_country
   check_client_n
check_client_jp =    check_policy_service
   inet 10027
   sleep 15
   permi
check_client_na =
   check_policy_service
   inet 10028
   sleep 1250 #Connect CLIENT IP address
#SMTP接続開始時にチェックされる項目だが、
#デフォルトでsmtpd_delay_reject = yesに
#なっているので、実際にはsmtpd_recipient_restrictions
#の中に書くのと同様。

#単に人間が見やすいかどうか程度の違いしかない。

smtpd_client_restrictions =
   permit_mynetworks,
#spamhausのブラックリストに載っているIPは排除
   reject_rbl_client sbl-xbl.spamhaus.org,
#RBL.JPにリストされているIPは排除
   reject_rbl_client all.rbl.jp,
#SpamCopにリストされているIPは排除
   reject_rbl_client bl.spamcop.net,
   permi
#MAIL RCPT TO section
#RCPTセクションでチェックされる。

smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated
#簡単に書けば「おかしな中継はしない」
   reject_unauth_destination
#受信者が居ない場合は拒否
   reject_unlisted_recipient
#架空でもテキトーでも、このリストにある送信者(From )は許可
   check_sender_access hash /usr/local/etc/postfix/white_list
#架空でもテキトーでも、このリストにある送信者(SMTP)のドメインやIPは許可
   check_client_access hash /usr/local/etc/postfix/white_list
#おかしなドメインは拒否
   reject_unknown_sender_domain
#逆引きできないドメインは拒否
   reject_non_fqdn_sender
#spamer御用達のIPやドメインを拒否:hinet.netとかcnc-noc.netなどなど
   check_client_access hash /usr/local/etc/postfix/reject_sender
#グレイリスティングによる判断
   check_client_access regexp /etc/postfix/check_dynamic_client
#SPFチェック
   check_policy_service unix private/polic
#HELOのお話しを要求
smtpd_helo_required = yes
smtpd_helo_restrictions =
   permit_mynetworks,
#HELOブラックリストは拒否
#spamerは送信元を変えてもHELOはそのままのケースがある(click-i.neなど)
#ここにfnf.jpなどが入っていたら拒否
   check_helo_access regexp /usr/local/etc/postfix/reject_helo,
#おかしな名前を設定しているものは拒否
   reject_invalid_hostname,
#完全なFQDNでないものは拒否
   reject_non_fqdn_hostname
#名前の引けないホストネームは拒否→ISPはマトモだが企業などでは逆引きできないものも多々ある
#   reject_unknown_hostname
   permi
#これは現在使用していない
# MAIL FROM section (Not Header From )
#smtpd_sender_restrictions =
#送信元IPの拒否リスト→smtpd_recipient_restrictionsで有効にしている
# check_sender_access hash /usr/local/etc/postfix/reject_sender
#訳の分からないドメインを拒否
# reject_unknown_sender_domain,
#逆引きできない送信者からのメールを拒否
# reject_non_fqdn_sende