Dovecot: Permission denied

Cent OS 6.2のDovecot 2.0.9でPOP3サーバを構築中のこと。最後の段階になってDovecotがメールボックスを読み取れないという問題に遭遇しました。/var/log/maillog には次のようなエラーが出ています。


Error: chdir(/var/vmail/kuroda@example.com//) failed:
Permission denied (euid=10000(vmail) egid=10000(vmail) missing +w perm:
/var/vmail/kuroda@example.com//, euid is not dir owner)

最初はパーミッションの問題かなと考えましたが、どうも違うようです。/var/vmailvmail ユーザーがオーナーで、パーミッションは 770 になっています。これでいいはずです。

しばらく悩みましたが、「あ、SELinuxか」と気づきました。

かつては、SELinuxを無効にしてサーバを運用していましたが、最近は多少慣れてきたので、面倒ですが有効にして頑張っています。

案の定、setenforce 0 コマンドでSELinuxをPermissiveモードにすると先ほどのエラーは消えます。

では、SELinuxポリシーを作ってやりましょう。以下、rootで作業をしました。


$ cd /root/
$ mkdir -p selinux
$ cd selinux
$ grep dovecot /var/log/audit/audit.log | audit2allow -M dovecot-local
$ semodule -i dovecot-local
$ service dovecot restart

普通はこれでうまく行くのですが、今回はEnforceモードに戻したらまたエラーが出たので、もう1回


$ grep dovecot /var/log/audit/audit.log | audit2allow -M dovecot-local
$ semodule -i dovecot-local
$ service dovecot restart

を実行する必要がありました。まあ、すごく簡単と言うほどでもないけど、慣れれば短時間で終わる作業です。

dovecot-localSELinuxポリシー(モジュール)の名前です。既存のポリシーと名前がかぶるとダメなので、あらかじめ semodule -l | grep dovecot-local コマンドで確認する必要があります。

ちなみに、audit2allow コマンドはデフォルトではインストールされていません。policycoreutils-python パッケージに含まれています。