Postfix + Cyrus-SASLでSMTP-Auth
概要
PostfixをSMTP AUTH(RFC2554)でのメール配送を受け付けるように設定する.本記事では,そのために必要な,SASL(RFC2222)の実装であるCyrus-SASLをインストールしたうえで,Postfixの設定変更を実施する.
環境
- FreeBSD 5-STABLE
- Postfix 2.4.0
- Cyrus SASL
- 公式サイト: http://asg.web.cmu.edu/sasl/
方針
- CRAM-MD5認証を使う.
- Thunderbirdで対応しているので.
- トランスポートレイヤの暗号化は行わない
作業手順
Cyrus-SASL
(1) 導入
# sudo portinstall security/cyrus-sasl2/ : # portinstall security/cyrus-sasl2-saslauthd :
(2) ドキュメントの確認
# pkg_info -L /var/db/pkg/cyrus-sasl-2.1.22/
ドキュメントは /usr/local/share/doc/cyrus-sasl2 以下に入っている.manもある.
READMEの内容を要約すると "see RFC2222".INSTALLもたいしたことは書かれていない.
RFC2222を見ると,TCPのようなコネクション指向のプロトコルに対し認証の機能を提供するレイヤの実装であることがわかる.また,認証を実施するモジュール(メカニズム)は選択可能であり,どのメカニズムを使うか,といったネゴシエーションを行う機能もSASLで提供するようである.採用するメカニズムによっては,通信パケットの暗号化を行うことも可能なようである.
メカニズムの例として,Kerberos v4, GSSAPI, S/Keyの説明があった.
- メカニズム
# man saslauthd
認証メカニズムには以下が選択可能;
- getpwent (/etc/passwd認証)
- kerberos4, kerberos5
- pam (デフォルト)
- sasldb
- ldap
インストール時にはpamが有効になっている(-a pam).
LDAPは,そのうち試したい./usr/local/share/doc/cyrus-sasl2/saslauthd/LDAP_SASLAUTHDにLDAPを使う時用のドキュメントがある.
(3) /etc/rc.conf設定追加
以下を追加:
saslauthd_enable="YES"
(4) saslauthd起動
# /usr/local/etc/rc.d/saslauthd.sh start Starting saslauthd. # ps xa|grep sasl 69312 ?? Ss 0:00.00 /usr/local/sbin/saslauthd -a pam 69313 ?? S 0:00.00 /usr/local/sbin/saslauthd -a pam 69314 ?? S 0:00.00 /usr/local/sbin/saslauthd -a pam 69315 ?? S 0:00.00 /usr/local/sbin/saslauthd -a pam 69316 ?? S 0:00.00 /usr/local/sbin/saslauthd -a pam
Postfix
(1) ドキュメントの確認
# lv /usr/local/share/doc/postfix/SASL_README
Postfix + Cyrus SASLでSMTP AUTHを行うためには,以下3ステップが必要,ということがわかる.
- Cyrus SASLライブラリを用いてPostfixをビルドする
- main.cf設定を追加する
- Cyrus SASLライブラリ用の設定ファイルを書く
(2) 前準備 (Postfix再ビルドのために,portupgradeの準備)
Ports的には,WITH_SASL2付きでmakeすれば,SASL付きでビルドしてくれるようだ.(ports/mail/postfix/Makefileより)
/usr/local/etc/pkgtools.confを編集し,以下を追加する.
MAKE_ARGS = { : 'mail/postfix' => 'WITH_SASL2=yes', # 追加 }
(3) Postfixをビルドし直し,再インストール
弊サイトにはすでにPostfixがインストール済みであるため,portupgradeに-f (force)オプションをつけて再ビルドを行う.
# portupgrade -f mail/postfix : #
Cyrus SASLのサポートが有効になったか確認
# postconf -a cyrus dovecot
(4) 設定変更
- /usr/local/etc/postfix/main.cf
smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023 smtpd_sasl_path = smtpd
smtpd_recipient_restrictionsにはpermit_sasl_authenticatedを追加している.他の行(check_policy_service)はpostgreyのための設定.
- /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: auxprop auxprop_plugin: sasldb mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5
PLAINとLOGINは,動作テストが終わったら外す.
(5) Postfix再起動
# /usr/local/etc/rc.d/postfix.sh restart postfix/postfix-script: stopping the Postfix mail system postfix/postfix-script: starting the Postfix mail system
(6) SMTP AUTHテスト用ユーザ追加
テスト用のSMTP AUTH用アカウントを掘る.
# saslpasswd2 -c -u `postconf -h myhostname` exampleuser (パスワード入力)
パスワードは "password" とした.テスト用なので.
ユーザが追加されたかどうかは,sasldblistuser2で確認できる.
# sasldblistusers2 exampleuser@****.****.****: userPassword
(7) SMTP AUTHの動作確認
# telnet localhost 25 Trying ::1... Trying 127.0.0.1... Connected to localhost.my.domain. Escape character is '^]'. 220 ****.****.**** ESMTP Postfix EHLO localhost 250-****.****.**** 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH PLAIN ZXhhbXBsZXVzZXIAZXhhbXBsZXVzZXIAcGFzc3dvcmQ= 235 2.0.0 Authentication successful QUIT 221 2.0.0 Bye
ぶじ認証ができた.
AUTH PLAINの後の文字列はBASE64エンコーディング.以下のコマンドで生成できる.
# perl -MMIME::Base64 -e 'print encode_base64("exampleuser\0exampleuser\0password");'
動作確認ができたので,PLAIN認証は無効にしておく.弊サイトにはOutlookユーザは存在しないため,ついでにLOGIN認証も無効にする.
- /usr/local/lib/sasl2/smtpd.conf編集
pwcheck_method: auxprop auxprop_plugin: sasldb mech_list: CRAM-MD5 DIGEST-MD5
(※PLAIN と LOGINを削除)
# /usr/local/etc/rc.d/postfix.sh reload Reloading postfix config files.
smtpd.confの変更を反映するためには,Postfixをreloadするだけでよい.saslauthdをrestartする必要はない.
テストユーザも削除しておく.
# saslpasswd2 -d exampleuser # sasldblistusers2
(8) SMTP AUTH用ユーザの一括追加
SMTP AUTH用ユーザを一括登録するために,以下のようなスクリプトをこしらえる.弊サイトでは/root/sasl_passwdディレクトリを掘り,このディレクトリ以下に作成した.
- sasl_adduser.pl
#!/usr/bin/perl while(<>) { chomp; my($user, $passwd) = split /:/; open(FD, "| saslpasswd2 -c -p -u `postconf -h myhostname` $user") or die "open failed"; print FD $passwd; close(FD); }
- sasl_delalluser.pl
#!/usr/bin/perl open(FD, "sasldblistusers2 |") or die "open failed"; while (<FD>) { ($acct, $user, $realm) = ($_ =~ /^((.+)@(.+)): /); print "Deleting user $acct\n"; system("saslpasswd2 -d -u $realm $user"); } close(FD);
add: ./sasl_adduser.pl < passwd.txt list: sasldblistusers2 clean: ./sasl_delalluser.pl
- passwd.txt
username1:passwd1 username2:passwd2 : (ユーザの数だけ)
passwd.txtを適宜書き換え,make clean && make とすることで,SASLが使うDBの更新を行うことができる.
また,言うまでもないがこれらのファイルおよびディレクトリは全てchmod 600またはchmod 700して,rootユーザ以外は参照できないようにしておく.