Postfix SMTP AUTHの設定

saslインストール
postfixがsasl対応していない場合、sasl対応したpostfixを再インストールする。
最近ははじめからPostfixにsasl対応されたものが配布されているので省略。


SMTP認証ユーザ設定

# saslpasswd -c -u `postconf -h myhostname` ユーザ名
Password:************* 
Again (for verification):************* 

送信サーバの認証に必要なアカウント全てに行う。
ここで設定したユーザ名、パスワードが、
メーラーの送信サーバの認証アカウントで使えるようになる。


送信認証登録したユーザの確認

# sasldblistusers
user: user1 realm: ***** mech: PLAIN
user: user1 realm: ***** mech: DIGEST-MD5
user: user1 realm: ***** mech: CRAM-MD5


sasldbのアクセス権をpostfixにも与える

# chgrp postfix /etc/sasldb
# chmod 640 /etc/sasldb


/etc/postfix/main.cfを編集

# SMTP AUTHの利用を設定
smtpd_sasl_auth_enable = yes
# SASL で認証する local domain(これがsasldblistusersコマンドのrealmと一致しないと認証NG)
smtpd_sasl_local_domain = $myhostname
# リレーを許可するものを設定する。
# 「permit_sasl_authenticated」SMTP-AUTHを通過したものを許可。必ず加える。
# 「permit_mynetworks」は「mynetworks」で設定されたネットワークからの接続を許可する。
# 「reject」はそれ以外は拒否
#smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks,check_relay_domains,reject
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#smtpd_sasl_security_options = noanonymous,noplaintext
smtpd_sasl_security_options = noanonymous
# AUTHコマンドを認識できないメールソフトに対応させる
broken_sasl_auth_clients = yes
# メールサイズの上限を設定(50MB)
message_size_limit = 50000000


Postfix再起動

# /usr/sbin/postfix reload


SaslAuthd起動、自動起動設定

service saslauthd start
chkconfig saslauthd on


以上で設定完了。
メーラでSMTP認証設定をしないと送信できなくなる。


TELNETで実際に確認
EHLOコマンドのあとに、
「250-AUTH=DIGEST-MD5 NTLM PLAIN LOGIN GSSAPI CRAM-MD5
の行が表示されれば、MTAがSMTP認証を行うようになっていることを示している。

[xxx@xxx ~]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
Escape character is '^]'.
220 ****.net ESMTP Postfix
ehlo ****.net
250-****.net
250-PIPELINING
250-SIZE 50000000
250-VRFY
250-ETRN
250-AUTH DIGEST-MD5 NTLM PLAIN LOGIN GSSAPI CRAM-MD5
250-AUTH=DIGEST-MD5 NTLM PLAIN LOGIN GSSAPI CRAM-MD5
250 8BITMIME
AUTH PLAIN dXNlcjEAdXNlcjEAbXlwYXNzd29yZA==
235 Authentication successful


「AUTH PLAIN 認証番号」コマンドにより認証をうけられる。
認証番号は、PLAINの場合は
「ユーザ名\0ユーザ名\0パスワード」をBASE64エンコードしたものを指定する。

$ echo '<? echo  base64_encode("user1\0user1\0mypassword");' | php -q
dXNlcjEAdXNlcjEAbXlwYXNzd29yZA==