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からビルドしてみる。
このとき開発パッケージが色々必要になります。
yum -y install pam-devel mysql-devel cyrus-sasl-devel openssl-devel rpmbuild -ba SPECS/pam_mysql.spec rpm -ivh rpm -ivh RPMS/i686/pam_mysql-0.7-0.12.rc1.el6.i686.rpm http://e-garakuta.net/techinfo/doku.php/linux/vsftpd_mysql
saslを設定します。
/etc/sasl2/smtpd.conf
pwcheck_method: saslauthd mech_list: plain login log_level: 3
参考
testsaslauthdという便利なツールもあるらしいけど、これはPAM+saslでは使えない模様。
/etc/pam.d/smtp
auth required pam_mysql.so user=postfix passwd=postpass host=127.0.0.1 db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=3 account sufficient pam_mysql.so user=postfix passwd=postpass host=127.0.0.1 db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=3
この2行以外は不要です。トラブルの元になるので消すなりコメントするなりしておきましょう。ちなみに最後のcrypt=3はMD5である事を意味するらしいです。このMD5というのは「809940e2a39e521ad49c15eb21800d25 」というような書式で、「{md5}Q0OWMxNWViMjE4MDBkMjU=」という書式ではありません。
pamの設定はsaslを再起動した時に読み込まれますので、編集したらsaslauthdを再起動させます。
うまく動作しないとき、問題の切り分けのためにMySQLのクエリーログを出力してみるといい事があります。
my.confに追加
log=/var/log/mysql/mysql_query.log
ただしこの操作はMySQLのクエリーがすべて出力されるのでセキュリティー上あんまりやりたくないです。終わったら必ず元に戻しましょう。
このほか、pam.d/smtpの2行の一番最後にdebugとやると/var/log/secureにログが沢山吐き出されます。
ちゃんとMySQLに接続してるかどうかなどチェックするにはちょうどいいです。
また、MySQLのパスワードは次のような形式になっています。
mysql> SELECT password FROM mailbox WHERE username = 'XXXX@localhost' AND active = '1'; +----------------------------------+ | password | +----------------------------------+ | 809940e2a39e521ad49c15eb21800d25 | +----------------------------------+
これはpostfixadminで
$CONF['encrypt'] = 'md5';
を設定するとこの書式で生成されます。
また、この書式をdovecotから読み取るには
driver = mysql connect = host=localhost dbname=postfix user=postfix password=postpass default_pass_scheme = MD5 user_query = SELECT concat('/home/virtualmail/', maildir) as home, 10000 as uid, 10000 as gid FROM mailbox WHERE username = '%u' AND active = '1' password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
という具合で書いてやればよいです。