ほんのちょっとだけマシに使う POP before SMTP

通常の POP before SMTP(以下 PbS)は送信セッションとは無関係なところで認証をおこなうため、SMTP AUTH では起きない問題がいくつか存在する。

最後の例は、今さらそんなの使うな、と一喝して切り捨ててもいいと思うが、前二者は問題である。常時接続があたりまえになった昨今では、数分おきに自動でメールチェックするのもふつうの行為である。しかし、PbS に対応しているサーバでは、これは常時 SMTP 中継可能になるということである。NAT 環境でそれをやっているユーザがひとりでもいると、同じネットワークにいるすべての人からいつでも不正中継を受けてしまうことになる。

ということで、もう少し制限を厳しくすることを考える。POP でログインしたときに得られる情報は IP アドレスだけではない。当然、ログインユーザ名も得られる。そしてそのユーザ名はメールアドレスと深い関係のある情報である。PbS というのは、内部ネットワークにいるユーザに提供しているサーバを、しかたなしに外部からも使えるようにする仕組みである。アドレス詐称メールを送信できる必要はない。事前に許可されたメールアドレスのみ送信可能なようにしておいて何の不都合もないはずだ。

この考えにもとづき、通常の PbS のように接続元 IP アドレスのチェックだけでなく、送信元メールアドレスも合わせてチェックするような PbS を実験的に実装してみた。あらかじめ POP ログイン名とメールアドレスの対応を登録しておき、IP アドレスが一致しても送信元メールアドレスが登録されたものと異なっていれば中継を拒否する。これにより、少なくとも第三者が自分の名前でメールを送ることはできなくなる。POP ログイン名に紐づけられたアドレスを詐称すれば利用できてしまうことには変わりないので、上に述べた問題はほとんど解決していないが、IP アドレスだけに頼るよりははるかにマシである。そして利便性はほとんど失われることはない。

この実装では MTA に Postfix 2.1、POP3d に qmail-pop3d、ログイン情報の格納に SQLite、これらをつなぐインターフェースに PHP を利用する。具体的な設定方法は同梱のドキュメントを参照のこと。

あくまでも実験的な実装なので、パフォーマンスや拡張性にはあまり気を使っていないし、汎用的な作りにはなっていない。小さなサイトではこのままでもいいかもしれないが、ある程度実用に使うのであれば、改良ないしはゼロからの再実装をした方がいいだろう。

なお、POP before SMTP の利用を推奨するつもりはまったくない。可能ならば SMTP AUTH を使うべきである。これを書いてる当の本人もまったく使っていない。


もどる
<y@maya.st>