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ヘッダへの漏洩を防ぐ 2022/04/06

以上の設定では、このサーバを経由してメール送信したとき、送信元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ポートで外向けのメールを送れなくする 2023/04/10

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