Postfix + Cyrus-SASLでSMTP-Auth

概要

PostfixSMTP AUTH(RFC2554)でのメール配送を受け付けるように設定する.本記事では,そのために必要な,SASL(RFC2222)の実装であるCyrus-SASLをインストールしたうえで,Postfixの設定変更を実施する.

環境

方針

  • CRAM-MD5認証を使う.
  • トランスポートレイヤの暗号化は行わない
    • TLSの設定は行わない.
    • 今回はSMTPを暗号化することが目的ではなく,セキュアに認証を行ったうえでSMTP relayを許可したい,というのが目的なので.

作業手順

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の説明があった.

  • カニズム
    • CRAM-MD5: see RFC2195
      • シンプルなチャレンジ・レスポンス認証を提供
      • セキュリティレイヤは実装なし.
    • TLS: see RFC2595
      • IMAP4, POP3TLSするのにSASL使おうぜ的な説明
# 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ステップが必要,ということがわかる.

  1. Cyrus SASLライブラリを用いてPostfixをビルドする
  2. main.cf設定を追加する
  3. 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) 設定変更

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ユーザ以外は参照できないようにしておく.