2008/06/01(日)Postfix/Dovecot Debian/Ubuntu で SMTP Auth の設定
Postfix(MTA) + Dovecot(POP/IMAP)の設定メモ。SMTP Auth + APOP で構成しました。
設定の概要
PostfixにはSMTP Authを外部に任せる機能があり(SASL)、DovecotにはそのPostfixのSMTP Authを代行する機能があります。これを行うとPOPとSMTPパスワードをDovecotで一元管理することができます。
- メール固有のパスワードファイルを使用する。
- Maildir形式で保存する。
Dovecotの設定
Dovecotの認証は専用のパスワードファイルで行うように設定。
# conf.d/10-auth.conf mechanisms = apop cram-md5 # 最後の方 #!include auth-system.conf.ext #!include auth-sql.conf.ext #!include auth-ldap.conf.ext !include auth-passwdfile.conf.ext #!include auth-checkpassword.conf.ext #!include auth-static.conf.ext
# conf.d/10-mail.conf mail_location = maildir:~/Maildir
# auth-passwdfile.conf.ext userdb { # driver = passwd-file # args = username_format=%u /etc/dovecot/users driver = passwd
SMTP-AUTHのための設定。
# 10-master.conf # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 }
パスワードの設定
デフォルトでは/etc/dovecot/usersがパスワードファイルになります。
userx:{PLAIN}plain-pass
PLAINだけ書いておけば他のすべての形式で認証できます。
- 受信に使うユーザIDは実ユーザIDと同一でなければなりません。
- passwd-file 変更時の再起動は不要です。
Postfix側の設定
main.cf を設定します。
smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_authenticated_header = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination home_mailbox = Mailbox
submissionポートを開けるため、master.cfの次の行のコメントを外します。
submission inet n - y - - smtpd
注意
Postfixは設定ファイルにミスがあると、一見きちんと動いているように見えてメールが受信出来ないというおそろしい状況になるので気を付けた方がよいです。
- 行の始めが空白やTABのときは、前の行の続きと解釈されます。
- コメントの # は行頭でしか効かないそうです。
ローカルIPアドレスのReceivedヘッダへの漏洩を防ぐ
以上の設定では、このサーバを経由してメール送信したとき、送信元PCのローカルIPがダダ漏れてしまいますので、これを消去するための設定を行います。
/etc/postfix/master.cf
submission inet n - y - - smtpd # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_tls_auth_only=yes # -o smtpd_reject_unlisted_recipient=no -o smtpd_client_restrictions=permit_sasl_authenticated,reject # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions # -o smtpd_recipient_restrictions= # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject # -o milter_macro_daemon_name=ORIGINATING -o cleanup_service_name=scleanup scleanup unix n - y - 0 cleanup -o header_checks=regexp:/etc/postfix/header_checks_submission
/etc/postfix/header_checks_submission
/^Received:.*/ IGNORE
原理としては、メール送信にときに使用するsubmission(587)ポート経由で送信時に、main.cfの内容をmaster.cfのsubmission部分の設定で上書きします。その際、header_checksによって、Receivedヘッダを消去する設定を加えています。
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
これはSMTP Authを成功したクライアントの接続のみを許可する設定です。この設定を行わないと、外部から587ポートにSPAM等を送りつけられたときにReceivedヘッダが欠落するという致命的欠陥を抱えることになります。
設定変更後は再起動を行ってください。
SMTPポートで外向けのメールを送れなくする
iptablesでSMTPポートの接続回数を強く制限しているにも関わらず、「ID/PASSが両方4文字」のテスト用アカウントを攻略されてまいました……。
ですので、25番ポートからは外向け(第3者向け)のメールを送れなくしました。587番ポートからは(ID/PASSが合致すれば)送れるようにしますが、接続元を iptables で制限することで対策、もちろんテスト用のPASSも複雑なものに変更しました。
smtp inet n - y - - smtpd -o smtpd_recipient_restrictions=permit_mynetworks,reject_unknown_sender_domain,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination scleanup unix n - y - 0 cleanup -o header_checks=regexp:/etc/postfix/header_checks submission inet n - y - - smtpd -o cleanup_service_name=scleanup -o smtpd_client_restrictions=permit_sasl_authenticated,reject