Postfix で passwd エラー
Postfix で別のパッケージをアップデートすると急にメールが受信できなるエラーが発生した事がある。そしてその原因が、あまりにも意外な事だったので、今回は特別に記事にしてみようと思う。
※ この問題は Fedora 26 や CentOS 7 でも発生する様です。
原因の調査
状況は、メールがユーザー(バーチャルユーザー)に配信されず、ペンディング(一時的に棚上げ)状態になっている事。
※ メールのバーチャルユーザーとは、サーバーマシンにログインアカウントを持っていない(つまり「/home」にスペースを有していない)ユーザーの事。
そこで、メール配信の状態を以下のコマンドで確認した。
sudo journalctl -u postfix -f |
この状態でメールを流してみる。
するとログメッセージに以下の警告メッセージを発見した。
warning: error looking up passwd info for postmaster: Connection reset by peer |
この警告を起点としてメールがペンディングされている様だった。
ただしコレはパスワードの入力ミスなどではなく、それまで正常に動作していたクライアント(Thunderbird)を利用して行ったテストである。
つまりは、サーバー側でのパスワード認証に問題が発生している事が、原因と思われる。
しかし「/etc/postfix/main.cf」などには問題は発見出来なかった。 当然である。 それまで正常に動作していたのだから。
そこで注目したのが「passwd」の文字。「password」ではなく「passwd」。 コレはもしかして「/etc/passwd」を指しているのではないだろうか?
更にログを細かく観察すると「local_recipient_maps (メールの受信可能者リスト)」を見る前にエラーを起こしている。
一体、何が起こっているのだろう。
原因の判明
原因はバーチャルユーザーであるにもかかわらず、「/etc/passwd」で間違いないらしい。
原因は判った。 でも理由が理解出来ない。
そこで根性を入れて英語もページを見まくると次のページを発見した。
postfix error looking up passwd info (catch-all)
要するに NSS(Network Service Switch)ライブラリのセイらしい。
つまり今回の原因は、Postfix に組み込まれた NSS ライブラリがバーチャルユーザーにもかかわらず、「passwd」を見に行こうとして失敗したって事らしい。
バーチャルユーザーなら見つからないのは当然であるし、そもそも「passwd」を見に行こうとする理由や必要性が無い。
しかし「passwd」を見に行かない事を強制する設定方法が見つからなかった。
そこで「/etc/nsswitch.conf」を修正する方法で解決する事に決めた。
「/etc/nsswitch.conf」の項目で「passwd:」の項目に「systemd」や「sss」が含まれている場合は「files」のみに変更する必要がある。
修正前 | 修正後 |
passwd: sss files systemd passwd: files systemd passwd: sss files | passwd: files |
勿論、「sssd-client
」パッケージをインストールしてある場合は、注意が必要である。
特に利用してないのであれば「sssd-client
」パッケージを削除する必要はないが、Postfix との共存を考えているなら別の解決方法を模索する必要がある。