タイトルの通りなのですが、色々設定していたらPostfixの設定で沼ってしまったという話と事例の共有です。
まず、ことはPostfixでメールサーバーを作ろうという企画をしたことに始まります。
元々、お名前ドットコムのメール転送サービスを利用していたのですが、これが月額で料金が発生するのと、サーバーを借りているのを有効活用しようということに。そしてメールサーバーについてよく理解していない状態でセットアップした結果、沼ってしまったということです。
全くの無知というわけではなく、どういう構成や機能で成り立っているのかというのは知っていたのですが、PostfixやDovecotのようなソフトの設定的な部分がよく分かっていなかったというのが原因です。今も完全には理解できていませんが…
結論を書くと、設定ファイルに問題がありました。また、自分が遭遇したパターンでは二つのパターンがあり、色々行って切り分けた結果、設定のミスが沼った原因でした。
それでは紹介していきます。
目次
発生する症状
始めに、以下の
postfix/smtpd: fatal: no SASL authentication mechanisms
というエラーですが、どのような挙動をするのでしょうか。
大前提としてこのサーバーはPostfix + Dovecotの構成のサーバーとなっており、DovecotのSASL認証を用いてSMTPの認証を行っています。また、送信にはサブミッションポートを用いており(SATARTTLS)、IMAPサーバーのみ稼働している構成になります。
このエラーは沼っている間に二つのパターンに遭遇したのですが、どちらとも同じ挙動に遭遇します。それはメールサーバーに送信しても切断されましたと出るか、ずっと送信中になってしまいます。それか認証の段階で引っかかるかです。少し厄介な点で言うと、クライアントによっては、この送信ができない状態でもさも問題ないかのように設定が完了するメーラーがあるため、問題なくセットアップできたと思っても送信ができない状態の可能性がある点です。
「二つのパターンに遭遇した」と書きましたが、一つわかりやすいパターンでは、上記のエラーコードの前に以下のログが出ている場合です。
warning: SASL: Connect to /var/spool/postfix/private/auth failed: No such file or directory
fatalの表記ではありませんが、中々fatalな内容な気がしますね。そして、もう一つのパターンがこのようなwarningすら表示がなく突然fatalとなるパターンです。
ちなみに、それ以外にミスがないかを確認するために、
sudo postfix check
を使って構文エラーがないかや、表記ミスのような設定ミスがないかは確認しています。
原因①
warning: SASL: Connect to /var/spool/postfix/private/auth failed: No such file or directory
のエラーが出ている場合を考えます。この場合は、ひとまずpostfixの設定ファイルを見てみます。
sudo nano /etc/postfix/main.cf
そのなかで、
smtpd_sasl_path = private/auth
の部分を確認してください。私の環境ではフルパスで指定すると正しく動かなかったということがありました。そもそも、ログに示すファイルがない可能性もあったので、
sudo ls -l /var/spool/postfix/private/auth
で確認したところファイルそのものは存在しており、権限も問題ないように見えます。ログを正直に信じるとするならば、「Access denied」の表現なので、そもそもファイルを見つけられていないようです。調べてみると、chrootの環境のためそういった挙動になっているようです。なので、例で示される
smtpd_sasl_path = private/auth
という書き方なら殆どの場合で問題が出ないと思います。なので、設定を変えている場合は、それに合わせて確認すると良いと思います。設定を変更してwarningが出なくなっていれば正しく設定できていると思ってよいでしょう。
原因②
これを正しく設定してある状態で「no SASL authentication mechanisms」二つ目の環境が一番厄介でした。ですが、これも設定の問題で、小さなミスでこうなります。設定ファイルを見てみます。
sudo nano /etc/postfix/main.cf
そのなかの以下の設定を探します。
smtpd_sasl_security_options = noanonymous
こうなっているのが正解です。ですが、これが設定されていなかったり、以下の様になっていると問題が発生します。
smtpd_sasl_security_options = noanonymous,noplaintext
この「smtpd_sasl_security_options」はデフォルトでこれと同じ設定になっています。
これの何がまずいのかというと、STARTTLSで用いていることがこのエラーの原因になります。なぜかというと、STARTTLSはnoplaintextに引っかかるからですね。
この理由はSTARTTLSを簡単に理解しておけばわかる理由となっています。STATTLSでは、まず初めに、暗号化していない通信で相手へEHLOコマンドを送る形になります。その後サポートしている形式を見て暗号通信に切り替えるというのがSTARTTLSの大まかな流れです。
ここで、noplaintextについてですが、これはsasl認証を行う際の通信に平文は許可しないことを表すものですが、これがあるとSTARTTLSで最初のTCPプロトコルのハンドシェイクあたりは通るかもしれませんが、間違いなくEHLOは平文で送る必要があり、この部分が引っかかってしまうため認証ができない状態になります。
というわけで、この部分の設定を間違えるだけで、今回のエラーが発生してしまいます。
これに気づいたサイトがあるので参考までに載せておきます。
-参考-
https://bugs.launchpad.net/ubuntu/+source/postfix/+bug/1940603
ネットで見つけた他の原因
cyrus-saslの環境に限るようですが、一部パッケージが不足している同様のエラーが出るようです。
yum install cyrus-sasl-plain
yum install cyrus-sasl-md5
これらのパッケージを調べてみるとわかりますが、CentOSがこの系統のパッケージを持っていますが、Ubuntu系はcyrus-saslのパッケージが無く、sasl-bin2というパッケージに押し込まれているようです。
今回の私の環境ではdovecotを使って認証していたのでcyrus-saslを使っていないので詳細は不明ですが、沼ったときには確認してみる価値があると思います。
まとめ
Postfixの設定で沼った話でした。結局のところ設定を誤っていたというだけの話なのですが、自分自身がかなり困ったので共有させていただきました。
正直postfix checkやログでもう少し詳細な情報が出ればここまで悩むことは無かったとは思いますが、ログ出力はセキュリティの都合もあると思うので実際は難しいのでしょう。
ひとまず、自分が躓いた部分の紹介はこれくらいとして、同じエラーだったけどここで沼った!なんて方がいたらコメントでいただけると誰かが見たときに助かるかもしれませんね。
以上となります。お読みいただきありがとうございました。