mysql対応、openssl対応のDovecotのコンパイル@Sun Studio 12@Solaris10 U6 spac
MTAであるpostfixがsmtp認証を実現するための外部機能として、以前まではCyrus SASLを選択するしかなかったのだが、バージョン2.3からDovecot SASLなるものに対応していることを最近知った。
ということで、その時初めて知ったDovecotについて調べてみると、どうやら単なる認証機能を提供するSASLではなく、pop3とimapを提供するMDAであるらしい。
ユーザーデーターベースとして、UNIXシステムの実ユーザーに対する認証からpam、LDAP、Mysqlなどに対応し、それらの複数を同時に実装できるのが何よりも良い感じである。
メジャーで事実上標準的なMDAであるQpopperとかCourier-IMAPより歴史的には浅いけど、Postfixと連携させて使うことを前提に、しかも実ユーザーでなく、仮想ユーザーでの運用も追加して考えれば良い選択であろう。
これでメールサーバーのMTAの部分とMDAの部分が実ユーザーだけでなくMysql上のDBにある仮想ユーザーも加えて運用させることができた。
以下でSolaris10 U6 spac版にgccを使わずSun Studio 12のコンパイラで実装した手順を書いてみる。
コンパイラオプションで最適化コードとヘッダ、ライブラリ検索パスとランパスを指定、
コンフィグオプションは以下の通り、
mysqlサポート、opensslサポートを追加、それぞれ/usr/local/mysql/ /usr/sfw/にインストールされているものとする。
export CPPFLAGS=”-I/usr/sfw/include/openssl -I/usr/local/mysql/include/mysql”
export LDFLAGS=”-L/usr/local/mysql/lib/mysql -L/usr/sfw/lib -R/usr/local/mysql/lib/mysql -R/usr/sfw/lib”
./configure –prefix=/usr/local/dovecot –with-mysql –with-ssl=openssl –disable-ipv6 && dmake
普段、土偶はSUNのC++の最適化オプションは「-native -mt -fast」を利用しているが、コンパイラオプションに「-fast」をつけると、コンパイルは通るものの、出来たバイナリはpop接続すると
Nov x xx:32:55 host dovecot: [ID 107833 mail.crit] Panic: file istream.c: line 84: assertion failed: (stream->eof)
Nov xx xx:32:55 host dovecot: [ID 398108 mail.error] Raw backtrace: 0x26894 -> 0x29a94 -> 0x3111c -> 0x2f2f0 -> 0x27a24 -> 0x27b24
-> 0x22c64 -> 0x22ebc -> 0x1f02c -> 0x15a88
って感じのエラーを吐いて落ちてしまう。
SUNのドキュメントには「IEEE 標準の浮動小数点演算を使用しているプログラムには、-fast を指定しないでください。計算結果が違ったり、プログラムが途中で終了する、あるいは予期しない SIGFPE シグナルが発生する可能性があります。」って書いてあるのでそれだろうか?
RSA暗号の強度は因数分解の難しさがである上に、複合化するにはガウスの時計計算機とフェルマーの小定理を使うので計算結果が狂うということだろうか?とにかく-fastオプションでなく、-native -mtオプションだけだとちゃんと動作した。
で、confファイルはこんな感じのものが認証に関わる部分、
dovecot.conf
#ユーザーデータベースとパスワードデータベースに外部DBを、指定した外部ファイルで指定、
#postfixのスプールディレクトリにユーザーとグループを指定してSASLソケットを提供
auth default {
mechanisms = plain login
userdb sql {
args = /usr/local/dovecot/etc/dovecot-mysql.conf
}
passdb sql {
args = /usr/local/dovecot/etc/dovecot-mysql.conf
}
passdb pam {
}
passdb passwd {
}
userdb passwd {
}
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
dovecot-mysql.conf
でDBのやらそのクエリを指定する。
connect = host=ホスト名 dbname=DB名 user=ユーザーt password=パスワード
#パスワードのハッシュ方式を指定 MD5-CRYPTとかPLAINとかが使える。
default_pass_scheme =CRYPT
#ユーザーDBの参照クエリ
# %uでユーザー名を指定され、
# カラム名homeにMaildirのあるディレクトリ、(一般的にはホームディレクトリやね)
# uidにuid gidにgidが得られるようなクエリを指定する。
user_query = SELECT mailrootdir AS home ,uid ,gid FROM table WHERE username=”%u” and mailuse=’1′
#パスワードDBの参照クエリ
# %uでユーザー名を指定され、
#カラム名usetとしてユーザー名が、
#カラム名passwordとして指定した方式でハッシュ化済のパスワードが得られるようなクエリを指定する。
password_query = SELECT username AS user ,password FROM table WHERE username=’%u’ and mailuse=’1′