メールサーバ設定の備忘録

PostfixやDovecotの設定について様々なサイトを参考にしながら昔組み上げたけど、今やサイトも閉鎖されていたり、内容の更新などもあったりしたため、備忘録代わりに設定とその意味を一覧で残しておきます。
環境はopenSUSE Leap 16.0です。
リポジトリは https://cdn.opensuse.org/repositories/server:/mail/ を使用しています。

Postfix

main.cf

compatibility_levelは3.6の内容です。

myhostnameは主たるドメインを入れます。mydestinationには受け取るメールのFQDNを入れておきます。ドメインが一つの場合はmydestination = $myhostnameとしておけばよいです。

relayhostはメールを送信する際に経由するホストを指定します。最近はOP25Bなどがあり、自宅サーバからメールを送るには何処かを経由する必要があります。 MyDNSを使用している人はrelayhost = [auth.gate-on.net]:587を指定するとよいです。

home_mailboxはDovecotと連携する場合はhome_mailbox = Maildir/とするとよいです。

ClamAV Milterを使ってウイルス検査する場合は以下のようにソケットを指定します。

smtpd_milters = unix:/var/run/clamav/clamav-milter.sock
non_smtpd_milters = unix:/var/run/clamav/clamav-milter.sock

メールを送る際にはユーザ認証をしないとSPAMメールの踏み台にされてしまいます。Dovecotを運用する場合はDovecotの認証を介すことでOSのログイン名とログインパスワードを使用できます。

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous

スパムメールの受信を防ぐにはSpamhausやpyspfを設定するとよいでしょう。
その際にpolicy_time_limitを設定しておかないとspamhausが応答しない場合にメールが受け取れないという問題が発生してしまいます。

smtpd_sender_restrictions = reject_unknown_sender_domain, reject_rhsbl_sender zen.spamhaus.org, reject_rhsbl_sender bl.spamcop.net
smtpd_client_restrictions = reject_unknown_sender_domain, reject_rhsbl_sender zen.spamhaus.org, reject_rhsbl_sender bl.spamcop.net
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service unix:private/policy
policy_time_limit = 3600

TLSの設定は以下のようにSMTPとSMTPDで変えるとよいでしょう。
SMTPの方は、Thunderbirdなどメールクライアントから接続する際に使用します。最近のメールクライアントはほとんどTLSv1.3に対応しているので、TLSv1.3だけで良いでしょう。
一方で、SMTPDの方は外部のメールサーバからの接続が必ずしもTLSv1.3に対応していないためTLSv1.2まで対応します。このあたりの設定はhttps://ssl-config.mozilla.org/のIntermediateを参考にします。

smtp_tls_security_level = encrypt
smtp_tls_cert_file = /path/to/public.crt
smtp_tls_key_file = /path/to/private.key
smtp_tls_protocols = >=TLSv1.3
smtp_tls_session_cache_database = lmdb:${queue_directory}/smtp_scache

smtpd_tls_security_level = encrypt
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /path/to/public.crt
smtpd_tls_key_file = /path/to/private.key
smtpd_tls_ask_ccert = no
smtpd_tls_received_header = no
smtpd_tls_mandatory_protocols = >=TLSv1.2
smtpd_tls_protocols = >=TLSv1.2
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_session_cache_database = lmdb:${queue_directory}/smtpd_scache
tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
tls_preempt_cipherlist = no

残りはデフォルトの設定で問題ないでしょう。
lmdb:/etc/postfix/hogeなど記述しているファイルを操作した場合はpostmap /etc/postfix/hogeでDBを更新しましょう。

master.cf

以下のようにsubmissionポートを解放しておく

submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
#  -o content_filter=smtp:[127.0.0.1]:10024
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no

またpostlogの下あたりにpolicyd-spfを追加します。policyd-spfの設定は後述します。

policy    unix  -       n       n       -       0       spawn
         user=nobody argv=/usr/bin/policyd-spf

policyd-spf

python313-pyspf(か後継バージョン)をインストールします。
/usr/bin/policyd-spfは自動で作成されないのでln -s /usr/bin/policyd-spf-3.13 /usr/bin/policyd-spfでシンボリックリンクを張ります。

/etc/python-policyd-spf/policyd-spf.confは以下のようにすれば迷惑メールが激減するはずです。

debugLevel = 1
TestOnly = 1

HELO_reject = Softfail
Mail_From_reject = SPF_Not_Pass

PermError_reject = True
TempError_Defer = True

skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0/104,::1

Dovecot

同じくMailリポジトリでdovecotを入れます。

dovecot.conf

基本的に操作する必要はありませんが、protocols = imaplisten = *, ::は設定しておきます。IPv6環境がない場合は", ::"を削除します。

conf.d/10-auth.conf

まずはdisable_plaintext_auth = noを設定します。これがないと平文でパスワードがやり取りされる可能性があります。
conf.d/auth-*.conf.extはPAMを使用するなら基本的に操作する必要はありません。

conf.d/10-master.conf

IMAPSを有効化したい場合は以下のようにします。

service imap-login {
  inet_listener imap {
    #port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

POP3を使用しない場合はservice pop3-loginはコメントアウトします。

また、Postfixの認証を受け付けるために以下のように設定するか、デフォルトで存在するコメントアウトを外します。

service auth {
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}

conf.d/10-ssl.conf

Dovecotもメールクライアントからしか繋がないためTLSv1.3のみに設定します。

# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = required

# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
ssl_cert = </path/to/public.crt
ssl_key = </path/to/private.key

ssl_dh = </etc/dovecot/dh.pem

# SSL protocols to use
ssl_min_protocol = TLSv1.3

# Prefer the server's order of ciphers over client's.
ssl_prefer_server_ciphers = yes