debian postfix + dovecot + sasl(PAM)

postfix + dovecot をインストールしている前提。
http://d.hatena.ne.jp/kt_hiro/20120317/1331972844

PAM(Pluggable Authentication Modules)を使って、OSユーザでSMTP認証を行う方法。
OSユーザとは別で認証を行う方法もある。

sasl

・インストール

# apt-get install sasl2-bin libsasl2-modules libsasl2-2 libsasl2-dev

postfixとの連携設定
# adduser postfix sasl
postfixグループに sasl ユーザを追加

・設定変更

# vi /etc/default/saslauthd
START=yes
MECHANISMS="pam"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd" の設定は postfixchroot環境で動いている場合に必要。
/etc/postfix/master.cf のsmtp行のchrootの位置が - であれば chroot環境で動作している。

# vi /etc/postfix/master.cf
==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
==========================================================================
smtp      inet  n       -       -       -       -       smtpd

chroot環境で動いている場合はOPTIONSパラメータで指定したディレクトリを作成する。

# mkdir -p /var/spool/postfix/var/run/saslauthd

・起動

# /etc/init.d/saslauthd restart

・動作確認

# testsaslauthd -u "username" -p "password"

postfix

・設定追加

# vi /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = 
	permit_mynetworks,
	permit_sasl_authenticated,
	reject_unauth_destination
smtpd_sasl_security_options = noanonymous

・認証方法の設定

# vi /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login

・sasl認証を有効にする
※main.cf で有効にしていれば不要かも

# vim /etc/postfix/master.cf
-o smtpd_sasl_auth_enable=yes

・動作確認

# telnet  192.168.0.108 25
	Trying 192.168.0.108...
	Connected to 192.168.0.108.
	Escape character is '^]'.
	220 mail.hirohiro.net ESMTP Postfix (@@DISTRO@@)
EHLO localhost
	250-mail.hirohiro.net
	250-PIPELINING
	250-SIZE 10485760
	250-VRFY
	250-ETRN
	250-AUTH LOGIN PLAIN
	250-ENHANCEDSTATUSCODES
	250-8BITMIME
	250 DSN
AUTH LOGIN
	334 VXNlcm5hbWU6
aGlybw==
	334 UGFzc3dvcmQ6
bnlhbmtv
	235 2.7.0 Authentication successful

※ユーザ名とパスワードはBASE64エンコードしたものを入力する必要がある
下記で取得可能

# perl -MMIME::Base64 -e 'print encode_base64("username");`'
# perl -MMIME::Base64 -e 'print encode_base64("password");'

※応答もBASE64エンコードされている
334 VXNlcm5hbWU6 → 334 Username:
334 UGFzc3dvcmQ6 → 334 Password: