Postfix + MySQLで認証設定のメモ

saslはMySQLに直接接続して認証を行うことはできるものの、暗号化パスワードには対応していない。特別plainなパスワードでも問題はないものの、やはり気が引ける。これを実現するにはpamのMySQLプラグインを利用して仲立ちさせるしかなさそうだ。つまり

Postfix→sasl→pam→MySQLという面倒な手順が必要な模様。

この場合非公式なパッケージが必要になるので注意したい。

ちなみにパスワードを暗号化して保存するとプロトコルの特性上DIGEST-MD5やCRIUS-MD5やCRAM-MD5は使えません。これはユーザー名とパスワード、認証毎に生成されるランダムな文字列を使ってハッシュを生成するため、サーバー側に生のパスワードを残しておかないと行けない為です。逆に言うとこれらの認証方式を採用している場合、必然的に生パスワードがサーバー内部に保存されていることになります。まぁ、そこまで神経質になる事は無いと思いますが。

参考
http://blog.doylenet.net/?p=236
http://pkgs.org/centos-6-rhel-6/centalt-i386/pam_mysql-0.7-0.12.rc1.el6.i686.rpm/download/

ひとまずpamのMySQLプラグインをインストール。
バイナリでもいいんですが、なんとなくSRPMからビルドしてみる。
このとき開発パッケージが色々必要になります。

saslを設定します。

/etc/sasl2/smtpd.conf

参考
http://www.kutukupret.com/2009/12/10/postfix-smtp-auth-using-pam_mysql-on-fedora-12/
testsaslauthdという便利なツールもあるらしいけど、これはPAM+saslでは使えない模様。

/etc/pam.d/smtp

この2行以外は不要です。トラブルの元になるので消すなりコメントするなりしておきましょう。ちなみに最後のcrypt=3はMD5である事を意味するらしいです。このMD5というのは「809940e2a39e521ad49c15eb21800d25 」というような書式で、「{md5}Q0OWMxNWViMjE4MDBkMjU=」という書式ではありません。

pamの設定はsaslを再起動した時に読み込まれますので、編集したらsaslauthdを再起動させます。

うまく動作しないとき、問題の切り分けのためにMySQLのクエリーログを出力してみるといい事があります。

my.confに追加

ただしこの操作はMySQLのクエリーがすべて出力されるのでセキュリティー上あんまりやりたくないです。終わったら必ず元に戻しましょう。

このほか、pam.d/smtpの2行の一番最後にdebugとやると/var/log/secureにログが沢山吐き出されます。
ちゃんとMySQLに接続してるかどうかなどチェックするにはちょうどいいです。

また、MySQLのパスワードは次のような形式になっています。

これはpostfixadminで

を設定するとこの書式で生成されます。

また、この書式をdovecotから読み取るには

という具合で書いてやればよいです。