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からビルドしてみる。
このとき開発パッケージが色々必要になります。

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

参考

Postfix Smtp Auth using pam_mysql On Fedora 12


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'

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

コメントを残す