外部のネットワークからのメールクライアントの接続を許可する場合、SMTP-AUTH による認証メカニズムの導入は必須であると言ってもよいだろう。昔は POP before SMTP なる技術が採用されたりもしたが、SMTP-AUTH が標準化され普及した今ではその意義もなくなっている。
メールクライアント (MUA: mail user agent) からの接続と、メールを配送するサーバ (MTA: mail transfer agent) からの接続を同一のホストで受ける場合、接続を受け付けるポートは別にしたほうが都合が良い。なぜなら、MUA からの接続と MTA からの接続を区別し、メールサーバの挙動を切り替えたい状況が多いからだ。
例えば、MUA からの接続に対しては SMTP-AUTH による認証を必須とする代わりに受け付けるメールの制限は少なくし、MTA からの接続に対しては認証を行わず受け付けるメールは自ドメイン宛のものに限定する、などといった類である。
同一ポートで、同様の切り替えを行うことは可能ではあるが、ポートを別にしたほうが設定や方針が分かりやすい。そのほうがミスを減らせるのではないか。
以下では、Postfix 2.7.1 を使用して、submission port (587) に、MUA からの接続を受け付ける SMTP サーバを用意し、SMTP-AUTH (SASL) による認証を必須とする設定を行う。
まず、main.cf に追加する smtpd に関する設定。smtpd_recipient_restrictions は中継を許可または拒否する設定であり、デフォルトでは “permit_mynetworks, reject_unauth_destination” となっている。ここでは、2番目に permit_sasl_authenticated を追加しており、SASL 認証を通して送られてきたメールの中継を許可している。ルールは先頭から順に該当したものが適用されるので、permit_mynetwork に該当するもの(接続元が自ネットワークのもの)は全て許可、SASL 認証を通過したものは全て許可、それ以外は中継を許可されたドメイン宛のメールだけが許可される、ということになる。
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
SASL 認証を行わない場合は、permit_sasl_authenticated に該当することはないので、結局のところデフォルトと同じ動作となる。
次に、master.cf の submission のところ(デフォルトでコメントアウトされている)を以下のようにする。先頭が空白の行は前の行から継続する行である。submission ポートに起動する smtpd は2~3行目に記述されているオプションが適用され、SASL 認証が有効、かつ、必須となっている。
submission inet n - n - - smtpd -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject
これで、submission ポートに接続した MUA に対しては SASL 認証が必須となる。したがって、main.cf に設定した permit_sasl_authenticated が適用され、MUA からのメールは受信者アドレスの制限を受けない。
MUA に対する SASL 認証を行うためのパスワードの設定は Cyrus のツールを使う。
$ sudo saslpasswd2 -c -u `/usr/pkg/sbin/postconf -h myhostname` (ユーザ名) Password: (パスワードを入力) Again (for verification): (もう一度パスワードを入力)
/usr/pkg/etc/sasldb.db が新規に作成、または更新される。smtpd は root として実行されないので sasldb.db の読み取り許可を確認して、smtpd が読み出せるようにしておく必要がある。
NetBSD では user=postfix, group=postfix で実行されるので、sasldb.db のグループを mail にしてグループ読み取り許可を付加し、グループ mail にユーザ postfix を追加しておくのが良いのではないかと思う。
/usr/pkg/lib/sasl2/smtpd.conf を設定するとかいう話があるが、CRAM-MD5 で認証する場合は不要である(デフォルトで O.K.)。同様に saslauthd も不要。
なお、Windows で Avast! を使っていると、Thunderbird からメールを送るときにエラーになる。TLS を使わない設定にしていても、Avast! が勝手に TLS を使おうとするようだ。Avast! の設定で、送信メールの検査を無効にすれば TLS を使っていなくても接続できる。送信メールの検査と、TLS を使わないのとを両立させることができるかどうかは不明。