OSデフォルトのBerkeley DBはBerkeley DB 1.85を利用しているが、この状態でsaslpasswd2を使ってSASL用パスワードデータベースを作成すると、maillogに
warning: SASL authentication failure: no user in dbというエラーが出る。
SMTP Auth は Project Cyrus の Cyrus-SASL を使用する。
→ Cyrus-SASL ダウンロード
バージョンは1と2があるが、必ず2を使用すること。
ダウンロードしたら展開してビルドしてインストールを行う。
make後にsaslpasswd2がlibdb-4.2などをリンクしていることを確認しておく。
% ./configure --with-openssl=/usr/local/sslもしlibtoolでエラーやWARNINGが出た場合はOSのlibtoolを使ってみる。
--with-dblib=berkeley
--with-bdb-libdir=/usr/local/lib/db42
--with-bdb-incdir=/usr/local/include/db42
--enable-login --disable-otp --disable-anon --disable-gssapi
% make
% ln -s ldd ./utils/.libs/saslpasswd2
./utils/.libs/saslpasswd2:
libsasl2.so.2 => /usr/local/lib/libsasl2.so.2 (0x2808f000)
libdb-4.2.so.2 => /usr/local/lib/libdb-4.2.so.2 (0x280a6000)
libc.so.7 => /lib/libc.so.7 (0x2817a000)
# make install
# cd /usr/lib/
# ln -s /usr/local/lib/sasl2
% make clean
% rm libtool
% ln -s /usr/local/bin/libtool
% make
(省略)
ここで一旦saslpasswd2でパスワードファイルを作成してみる。
saslpasswd2の書式は
saslpasswd2 -u [MAIL_DOMAIN] [MAIL_USERPART]となっている。
# saslpasswd2 -u example.com test
Password: *****
Again (for verification): *****
saslpasswd2が成功したら/etc/sasldb2が出来ているはずなので、 postfixから利用するために所有権の変更を行っておく。
# chown postfix:postfix /etc/sasldb2
※UID/GIDはpostfixで利用しているものに合わせる
saslauthd が使用するディレクトリの作成。
# mkdir -p /var/state/saslauthd/
# chown root:wheel /var/state/saslauthd/
# chmod 755 /var/state/saslauthd/
configureで使用するいくつかのオプションについて説明を。
- --with-dblib=berkeley
--with-bdb-libdir=/usr/local/lib/db42
--with-bdb-incdir=/usr/local/include/db42- OS標準の古いBDBではなくBDB42を使用する。
- --with-openssl=/usr/local/ssl
- OpenSSL 込みでビルドする。
もしSSLライブラリが/usr/local/lib/以外にインストールされているなら、SSLライブラリの1つ上のディレクトリを指定する。
Makefile では[指定されたディレクトリ]/lib/を参照している。- --enable-login
- Outlook Expressサポート用。
ここでは Postfix は既に導入済みとする。
Postfix のソースを削除していたらもう一度展開。
ソースがあるならそのディレクトリに入る。
今回は/usr/src/software/に展開した。
% cd /usr/src/software/postfix-2.3.9/
ここで Postfix を作り直すわけだが、もし
% make tidy新規に Postfix をインストールする場合は以下のようにビルド・インストールする。
% make makefiles \
CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl" \
AUXLIBS="-L/usr/local/lib -lsasl2"
% make
# make upgrade
% make makefiles \
CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl" \
AUXLIBS="-L/usr/local/lib -lsasl2"
% make
# make install
SASL用設定ファイルは存在しないので新規作成する。
ファイル名は
/usr/local/lib/sasl2/{SASL を使用するアプリケーション名}.confになるので、今回は /usr/local/lib/sasl2/smtpd.conf となる。
pwcheck_method: saslauthd
設定が完了したらsaslauthdを起動する。
今回はOSのパスワード情報を利用するのでgetpwentとする。
# /usr/local/sbin/saslauthd -a getpwent
なお、OSで利用できる認証メカニズムを確認するには以下のコマンドを使う。
# saslauthd -v
OSのID/パスワードを利用する場合はsaslauthdを使い、getpwentオプションでPLAIN/LOGIN認証を使用する。
PLAIN/LOGIN認証はOSのIDとパスワードを利用するのでアカウント情報を一元管理できるが、パスワードを平文で送信することになるので別途postfixをSSL化すると良い。
CRAM-MD5などのチャレンジ&レスポンス認証を利用する場合はpwcheck_methodの行はそのままで良いが、saslpasswd2にパスワードを登録する必要がある。
saslauthd は postfix が使用するので、postfix の起動起動スクリプトに一緒に記述しておくと良いだろう。
FreeBSD では /usr/local/etc/rc.d/postfix.sh になる。
postfix は master.cf と main.cf を変更。
main.cf は次の行を追加する。
smtpd_sasl_auth_enable = yessmtpd_sasl_authenticated_header = yes にすると、Received ヘッダに認証されたユーザー名が表示される。
smtpd_sasl_authenticated_header = yes
Received: from localhost (localhost [127.0.0.1])表示するか否かは自由なのでお好みで。
(Authenticated sender: griffon)
by mail.griffonworks.net (Postfix) with ESMTP id ABA191CCB9
for; Thu, 10 May 2007 13:18:15 +0900 (JST)
master.cf は次の部分を変更する。
submission の
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,rejectから "permit_mynetworks" を削除して
-o smtpd_recipient_restrictions=permit_sasl_authenticated,rejectとし、認証を通過したクライアントのみ通信可能にするように設定しておく。
設定が完了したら postfix を再起動する。
念のため stop → start のほうが良いかもしれない。
# postfix stop
# postfix start
まずは TCP-25 で正常にメールが配送できるかを確認。
# postfix startもしここで SMTP バナーが出ない場合 (Escape character is '^]'. で止まる) は Postfix stop してからログを確認。
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.griffonworks.net ESMTP Postfix
May 10 12:46:59 leviathan postfix/postfix-script: starting the Postfix mail systemこのエラーは、make 時に CCARGS に -DUSE_CYRUS_SASL フラグを忘れていたために発生した。
May 10 12:46:59 leviathan postfix/master[65523]: daemon started -- version 2.3.9, configuration /etc/postfix
May 10 12:47:02 leviathan postfix/smtpd[65550]: warning: unsupported SASL server implementation: cyrus
May 10 12:47:02 leviathan postfix/smtpd[65550]: fatal: SASL per-process initialization failed
May 10 12:47:03 leviathan postfix/master[65523]: warning: process /usr/local/postfix/bin/smtpd pid 65550 exit status 1
May 10 12:47:03 leviathan postfix/master[65523]: warning: /usr/local/postfix/bin/smtpd: bad command startup -- throttling
May 10 12:47:15 leviathan postfix/smtpd[65565]: warning: unsupported SASL server implementation: cyrus
May 10 12:47:15 leviathan postfix/smtpd[65565]: fatal: SASL per-process initialization failed
May 10 12:47:16 leviathan postfix/master[65523]: warning: process /usr/local/postfix/bin/smtpd pid 65565 exit status 1
May 10 12:47:16 leviathan postfix/master[65523]: warning: /usr/local/postfix/bin/smtpd: bad command startup -- throttling
May 10 12:47:43 leviathan postfix/postfix-script: stopping the Postfix mail system
May 10 12:47:43 leviathan postfix/master[65523]: terminating on signal 15
TCP-25 でのメール配送が正常に行えることを確認できたら、今度は SMTP Auth を使ってメール送信を行う。
まずは SMTP Auth で利用するパスワード文字列を用意する。
ヌル文字 (\0) を使わなければならないので少しだけ perl を使う。
また、BASE64 エンコードを行わなければならないので、nkf も使う。
今回は変換文字列の表示にちょっとした perl スクリプトを書く。
以下のようなスクリプトを適当なファイルに記述する。
今回は pwd.pl とした。
print "USERNAME\0USERNAME\0PASSWORD";\0 (円マークに数字のゼロ) はヌル文字を表す。
スクリプトが書けたらそれを BASE64 エンコードする。
% perl up.pl | nkf -MBちなみにこれは BASE64 エンコードしただけなので、以下のようにするとユーザー名とパスワードに変換される。
dXNlcm5hbWUAdXNlcm5hbWUAcGFzc3dvcm
% echo "dXNlcm5hbWUAdXNlcm5hbWUAcGFzc3dvcm" | nkf -mB | perl -pe 's/\0/\n/g'BASE64 エンコード文字列が出来たら SMTP Auth が正常に利用可能かをチェック。
username
username
passwo
% telnet localhost 587バナーが出たら EHLO コマンドを送信する。
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 leviathan.griffonworks.or.jp ESMTP Postfix
EHLO localhostすると、以下のように返ってくるので "250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5" となっているかを確認。
250-leviathan.griffonworks.or.jp確認できたら AUTH コマンドでユーザー認証を行う。
250-PIPELINING
250-SIZE 20480000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
AUTH PLAIN dXNlcm5hbWUAdXNlcm5hbWUAcGFzc3dvcmユーザー名とパスワードが有っていれば "235 Authentication successful" となるが、間違っていれば "535 Error: authentication failed" となる。
認証が成功すればログには特に何も出ないが、失敗した場合はmaillogにエラーが出力される。
warning: SASL authentication problem: unable to open Berkeley db /etc/sasldb2: No such file or directory
warning: SASL authentication failure: no secret in database
warning: SASL authentication failure: cannot connect to saslauthd server: No such file or directory
warning: SASL authentication problem: unable to open Berkeley db /etc/sasldb2: Permission denied
warning: SASL authentication failure: Password verification failed
warning: localhost[127.0.0.1]: SASL PLAIN authentication failed: authentication failure
Dec 21 16:15:01 leviathan postfix/smtpd[83152]: B95DA1146A:
client=localhost[127.0.0.1], sasl_method=PLAIN, sasl_username=test@example.com
各メーラーによって設定が違うので、ここでは目に付いたメーラーの説明を行う。
; MSA(Submission)用ポートを指定する。
("smtp-port" . "587")
; SMTP-Authを使用する場合はSMTP-Authに必要なアカウントを記述。
; USERIDを記述する。
; 認証メカニズムがPLAIN/LOGINの場合はUNIXアカウントを、
; それ以外のチャレンジ&レスポンス認証の場合はsaslpasswd2で登録した
; UID+ドメイン名をメールアドレス型式で記述する。
("smtp-user" . "test@example.com")
; ("smtp-user" . "unixuserid")
; 使用する認証メカニズムを記述する。
("smtp-auth-list" . ("PLAIN" "LOGIN" "CRAM-MD5"))
実際にメールを送信しようとすると、mewの最下段に
SMTP PLAIN password (USERNAME@localhost):と出るので、ここでSMTP-Authのパスワード(今回はUNIXアカウントのパスワード)を入力する。
SMTP PLAIN password is wrong! This mail has been queued to +queueと出て送信できないが、成功すると
Sending in background...doneと出てバックグラウンドで送信を行う。