概要
3000人程度の利用者に対するメールシステムを、かれこれ12年間、オンプレミスで運用してきたのですけれど、ついに G Suite に移転することになりました。その間に得たノウハウを、このままロストテクノロジーにするのも惜しいので、過去の作業ログの中から、ある程度汎用性がありそうなトピックを取り出して、公開しようと思います。
利用者が10人〜30人くらいまでのメールサーバであればともかく、利用者が1000人を超えるメールサーバを運用している場合、受信アドレスの正当性検査は大変重要です。一言で言えば、できる限りメールを受け取らないように努力しなければなりません 。
メールシステムの運用開始当時、まだ上記の認識が不十分だった筆者は、退職者・卒業生アカウントに対する bounce mail により、管理しているメールシステムが spam 送信元であると誤判定されるというトラブルに遭遇しました。
- spam 送信者が
From: victim-notexist@yahoo.co.uk
と非実在の送信者を騙って、退職者・卒業生アカウントに大量の spam を送ってくる。 - 当方のメールサーバは
victim-nonexist@yahoo.co.uk
に対して、メールボックスが存在しないという bounce mail を大量に送信する。 - yahoo.co.uk のメールサーバから見ると、当方のメールサーバは「非実在のメールボックスに mass mailing を行っている」「つまり、spam 送信者である」と誤判定される。
-
alice@yahoo.co.uk
にメールを転送している、現役の利用者 alice のメールが転送を拒否される.
特に、当時はまだ LDAP に慣れていなかったので、プライマリメールサーバでは LDAP を参照して、受信アドレスの正当性検査を正しく行なっていたのですが、セカンダリメールサーバでは LDAP を参照することなく、ドメインだけを検査してメールを受け取ってしまっていたのです。
対策方法
bounce mail を発生させないためには、メールを受け取らないことが肝心です。つまり、SMTP セッションで RCPT TO
により受信者アドレスが指定された時点で、受信者アドレスの正当性を検査し、正当ではない受信者アドレスの場合は受取を拒否します。そのためには、local_recipient_maps パラメータを正しく設定し、かつ、smtpd_reject_unlisted_recipient パラメータをデフォルトのまま yes に設定しておけば良いです。
しかし、筆者が管理しているシステムでは、学内の他のシステムの都合もあり、単純に受け取らないという設定ができませんでした。そのため、退職者・卒業生アカウントに対するメールは、転送のみを行い、転送できない場合は破棄するように設定して対応しました。また、LDAP の登録内容がそのまま使えない場合は、任意のスクリプトを使って読み替える設定が応用できます。
利用者が増えてくると、正当な受信者アドレスのリストの管理が難しくなってくるため、どうしても bounce mail を発生させてしまうことがあります。bounce mail をまったく送信しないという設定も可能ですが、そのように設定すると正規利用者がメールアドレス誤りに気付けなくなり、それはそれで問題です。折衷案として、筆者は bounce_queue_lifetime パラメータを 0 に設定して運用しています。
bounce_queue_lifetime = 0
このパラメータを設定すると、postfix は、bounce mail の送信を1回だけ試行して、失敗した場合はそのまま破棄します。bounce_queue_lifetime のデフォルト値は 5d (5日間)なので、失敗した場合は5日間 bounce mail の再送を試みます。そのデフォルト設定に比べて、bounce_queue_lifetime パラメータを 0 に設定しておくと、bounce mail を送信しようとする SMTP セッションは 1/100 以下になりますから、その分だけ spam 送信者と誤判定される危険性が減ります。