SSLメールサーバ構築メモ Postfix + Dovecot【2024年版】

Linux
Linux
スポンサーリンク

クラウドサービスの普及により自前でメールサーバを構築することは少なくなりましたが、自前で構築したメールサーバは他のシステムと連携しやすいなど自由度が高いのが魅力です。ただし、セキュリティの確保も自前でしっかり行わなければなりません。そこで今回は、SSL/TLSに対応したメールサーバを構築した時の手順をメモしておきました。

メールサーバの設定概要

メールサーバの設定概要は、以下の通りです。ドメイン名やIPアドレスはサンプルですので実際のものに読み替えてください。

今回サーバOSは、AlmaLinux を利用していますが、Rocky Linux や CentOS Stream など RHEL系のディストリビューションであれば同じ手順で設定できると思います。

メールアドレスのドメイン名example.com
メールサーバのアドレス(FQDN)mail.example.com
メールサーバのIPアドレス192.0.2.1
サーバOSAlmaLinux 9.2
メール送信サーバPostfix(SMTP-Auth over SSL)
メール受信サーバDovecot(IMAPS、POP3S)

DNSサーバの設定

メールサーバを設定する前に、以下のMXレコード、SPFレコード、メールサーバのAレコードをDNSサーバに登録しておきます。

example.com.      IN MX 10 mail.example.com.
example.com.      IN TXT "v=spf1 ip4:192.0.2.1 ~all"
mail.example.com. IN A 192.0.2.1

上のSPFレコードは一般的な設定例です。組織などのポリシーに合わせて適切なSPFレコードを設定してください。

参考資料:SPF(Sender Policy Framework) : 迷惑メール対策委員会

rootユーザの利用について

これ以降は、メールサーバとなるサーバにSSHログインして設定を行います。
この記事では rootユーザで設定を行うことを前提にしていますので、以下コマンドで rootユーザになってから実施してください。

sudo -s

※通常の運用時は sudo <コマンド> を利用することをオススメします。

メールサーバが使用するポートのオープン

メールの送受信に使う以下のポートを開けておきます。

・SMPT(25)
・SMTPS(465)
・IMAPS(993)
・POP3S(995)

firewall-cmd --add-port=25/tcp --permanent
firewall-cmd --add-port=465/tcp --permanent
firewall-cmd --add-port=993/tcp --permanent
firewall-cmd --add-port=995/tcp --permanent
firewall-cmd --reload

ポートオープンの設定確認

firewall-cmd --list-ports
22/tcp 25/tcp 465/tcp 995/tcp 993/tcp

基本パッケージのインストール

開発ツールなど、基本的なパッケージをインストールしておきます。

dnf groupinstall base
dnf groupinstall development

インストール済みのパッケージを、最新版にアップデートします。

dnf update

Postfix と Dovecot のインストール

(バージョンは、2023年9月15日時点のものです)

Postfix(3.5.9-19)

dnf install postfix

Dovecot(2.3.16-8)

dnf install dovecot

Let's Encrypt のSSL/TLS証明書の取得

関連記事:Let's Encrypt サーバー証明書の取得と自動更新設定メモ

Let's Encrypt クライアントのインストール

EPELリポジトリを登録します。

dnf config-manager --set-enabled crb
dnf install epel-release
dnf update

Let's Encrypt のクライアント certbot をインストールします。

dnf install certbot

証明書の取得

Let's Encrypt クライアントの待ち受けポートを開けておきます。

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload

Let's Encrypt のSSL/TLS証明書を取得します。
取得した証明書や秘密鍵は「/etc/letsencrypt/live/mail.example.com/」以下に保存されます。

certbot certonly --standalone \
-d mail.example.com \
-m sample@example.com \
--agree-tos -n

【オプションの説明】
certonly
 証明書の取得のみを行います。

--standalone
 プラグインの指定です。standalone プラグインは Let's Encrypt クライアントに内蔵されているWEBサーバを使って、証明書の取得を行います。

-d
 証明書を取得するドメイン名を指定します。

-m
 ご自分のメールアドレスを指定します。なにかトラブルがあった場合などに Let's Encrypt との連絡用に使用されます。

--agree-tos
 Let's Encrypt の利用規約に同意します。事前に利用規約「https://letsencrypt.org/repository/」を確認しておきましょう。

-n
 --non-interactive の省略オプションです。対話メッセージの表示や入力を求められないようにできます。

WEBサーバが同居している場合

メールサーバで Apache httpd などのWEBサーバが起動している場合、standaloneプラグインで使うポートとかぶるため証明書を取得することができません。

standaloneプラグインで起動するWEBサーバの待ち受けポートを変更できればいいのですが、現在のところ出来ないようなので、メールサーバにWEBサーバが同居している場合は、mail.example.com のバーチャルホストを設定して「webroot」プラグインで証明書を取得してください。

certbot certonly --webroot \
-w /var/www/example \
-d mail.example.com \
-m sample@example.com \
--agree-tos -n

オプションの指定は「-w /var/www/example」で、ドキュメントルートを指定する以外は、standaloneプラグインと同じです。

証明書の自動更新設定

cronにて、毎月1日の朝5時に証明書を自動更新し Postfix と Dovecot をリロードします。更新日時はお好みで設定してください。更新時は、certbot に「renew --force-renewal」オプションを付けて実行します。
vi /etc/crontab

00 05 01 * * root /bin/certbot renew --force-renewal && /bin/systemctl reload postfix && /bin/systemctl reload dovecot

証明書の有効期限確認

openssl x509 -in /etc/letsencrypt/live/mail.example.com/fullchain.pem -noout -dates
notBefore=Sep 15 23:02:35 2023 GMT
notAfter=Dec 14 23:02:34 2023 GMT

Postfix の設定

元の設定ファイルをキープしておきます。

cp -ip /etc/postfix/main.cf /etc/postfix/main.cf.org

・Postfixの設定ファイルを編集(かなり沢山あります。頑張ってください!)
vi /etc/postfix/main.cf

# このメールサーバのホスト名(FQDN)を指定
#myhostname = host.domain.tld
 ↓
myhostname = mail.example.com

# このメールサーバのドメイン名を指定
#mydomain = domain.tld
 ↓
mydomain = example.com

# メールアドレスを「ユーザ名@ドメイン名」の形式にする
#myorigin = $mydomain
 ↓
myorigin = $mydomain

# 全てのホストからメールを受信する
inet_interfaces = localhost
 ↓
inet_interfaces = all

# mydomain = で指定したドメイン宛のメールを受信する
mydestination = $myhostname, localhost.$mydomain, localhost
 ↓
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 存在しないメールアドレス(ユーザ)宛のメールの受信を拒否する
#local_recipient_maps = proxy:unix:passwd.byname $alias_maps
 ↓
local_recipient_maps = proxy:unix:passwd.byname $alias_maps

# 中継を許可する宛先ドメインを指定
#relay_domains = $mydestination
 ↓
relay_domains = $mydestination

# 転送サーバを使わない
#relayhost = [an.ip.add.ress]
 ↓
relayhost =

# メールの格納フォーマットの指定
#home_mailbox = Maildir/
 ↓
home_mailbox = Maildir/

# 不要な情報を公開しない
#smtpd_banner = $myhostname ESMTP $mail_name
 ↓
smtpd_banner = $myhostname ESMTP

# サーバ証明書を指定
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
 ↓
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem

# サーバ秘密鍵を指定
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
 ↓
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem


---(以下の設定があることを確認)---------------------------
smtpd_tls_security_level = may

smtp_tls_security_level = may


---(下記を最終行に追加)---------------------------
# VRFYコマンドの使用を禁止する
disable_vrfy_command = yes

# MailBoxの最大サイズの指定(単位はバイトです)
# メールボックスがMaildir形式のためこの設定は無視されますが「message_size_limit」との兼ね合いのため設定しておきます
mailbox_size_limit = 204800000

# 受信メールサイズの制限「mailbox_size_limit」より少ない値を設定してください(単位はバイトです)
message_size_limit = 25600000

# 接続元の制限(スパムメール対策)
smtpd_client_restrictions =
    check_client_access hash:/etc/postfix/access
    reject_rbl_client zen.spamhaus.org
    reject_non_fqdn_sender
    reject_unknown_sender_domain

# エンベロープアドレス(MAIL FROM)による制限(スパムメール対策)
smtpd_sender_restrictions =
	reject_rhsbl_sender zen.spamhaus.org
	reject_unknown_sender_domain

########## SMTP-Auth関連 ##########
# SASL認証を有効化
smtpd_sasl_auth_enable = yes

# Dovecot SASL ライブラリを指定
smtpd_sasl_type = dovecot

# Dovecot SASL ライブラリの認証ソケットファイル /var/spool/postfix/ からの相対パスで記述
smtpd_sasl_path = private/auth

# 古いバージョンの AUTH コマンド (RFC 2554) を実装した SMTP クライアントとの相互運用性を有効にする
broken_sasl_auth_clients = yes

# 認証を通過したものはリレーを許可する(permit_sasl_authenticated)
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

########## TLS/SSL関連 ##########
# TLSログレベルの設定
# 0:出力しない 1:TLSハンドシェイクと証明書情報 2:TLSネゴシエーションの全て
smtpd_tls_loglevel = 1

# 暗号に関する情報を "Received:" メッセージヘッダに含める
smtpd_tls_received_header = yes

# 接続キャッシュファイルの指定
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

# キャッシュの保持時間の指定
smtpd_tls_session_cache_timeout = 3600s

・smtps(SMTP-Auth over SSL)を有効化(青字の行のコメントを外してください)
vi /etc/postfix/master.cf

#smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
 ↓
smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

ルックアップテーブルの作成

postmap /etc/postfix/access

設定に誤りがないかチェック(なにも表示されなければOKです)

postfix check

Postfixの起動

systemctl start postfix

自動起動の設定

systemctl enable postfix

Dovecot の設定

・受信プロトコルの設定
vi /etc/dovecot/dovecot.conf

#protocols = imap pop3 lmtp submission
 ↓
protocols = imap pop3

・暗号化される imaps と pop3s を有効にして、平文で通信する imap と pop3 は「port = 0」を設定して無効にします。
vi /etc/dovecot/conf.d/10-master.conf

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

service pop3-login {
  inet_listener pop3 {
    #port = 110
	 ↓
    port = 0
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
	 ↓
    port = 995
    ssl = yes
  }
}

・Dovecot SASL ライブラリの認証ソケットファイルを指定(109行目あたりです)
vi /etc/dovecot/conf.d/10-master.conf

service auth {
 (略)
  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}
 ↓
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix        
  }
}

・認証方式の設定 ※平文パスワードを許可していますが、SSL/TLSで暗号化されますので問題ありません。
vi /etc/dovecot/conf.d/10-auth.conf

#disable_plaintext_auth = yes
 ↓
disable_plaintext_auth = no

auth_mechanisms = plain
 ↓
auth_mechanisms = plain login

・SSL/TLSの有効化とサーバ証明書と秘密鍵を指定
vi /etc/dovecot/conf.d/10-ssl.conf

ssl = required
 ↓
ssl = yes

ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem
 ↓
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

・メールボックスの場所を指定
vi /etc/dovecot/conf.d/10-mail.conf

#mail_location = 
 ↓
mail_location = maildir:~/Maildir

・ログの出力先を変更
vi /etc/dovecot/conf.d/10-logging.conf

#log_path = syslog
 ↓
log_path = /var/log/dovecot/dovecot.log

ログの出力先作成しておきます

mkdir /var/log/dovecot

Dovecotを起動

systemctl start dovecot

自動起動の設定

systemctl enable dovecot

認証ソケットファイルが作成されているのを確認します
ls -F /var/spool/postfix/private/auth
---(下記表示があればOK)---

/var/spool/postfix/private/auth =

ログのローテーション設定

メールサーバの運用ではログを参照することが多くなりますので、運用しやすいようにログのローテーションの設定をしておくことをお勧めします。

下の設定では1日ごとにログファイルを分けて、ファイル名に日付が付くように設定しています。ログファイルの保存期間は60日としていますが、運用ルールに合わせて設定してください。

Postfixログの設定

出力先ディレクトリ作成

mkdir /var/log/mail

・出力先の変更
vi /etc/rsyslog.conf

mail.*                                                  -/var/log/maillog
                       ↓
mail.*                                                  -/var/log/mail/maillog

syslog再起動

systemctl restart rsyslog

不要なログを削除

rm -f /var/log/maillog*

・ログローテーション設定
vi /etc/logrotate.d/rsyslog
---(下記を削除)---

/var/log/maillog

vi /etc/logrotate.d/maillog
---(下記を追加)---

/var/log/mail/maillog {
    daily
    missingok
    dateext
    rotate 60
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

・確認します
logrotate -dv /etc/logrotate.d/maillog
---(下記のような表示があればOKです)---

rotating pattern: /var/log/mail/maillog after 1 days (60 rotations)
empty log files are rotated, old logs are removed

Dovecotログの設定

vi /etc/logrotate.d/dovecot
---(下記を追加)---

/var/log/dovecot/dovecot.log {
    daily
    missingok
    dateext
    rotate 60
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /var/run/dovecot/master.pid 2>/dev/null` 2> /dev/null || true
    endscript
}

・確認します
logrotate -dv /etc/logrotate.d/dovecot
---(下記のような表示があればOKです)---

rotating pattern: /var/log/dovecot/dovecot.log after 1 days (60 rotations)
empty log files are rotated, old logs are removed

メールアカウントの作成

メールアカウントの作成は、普通に UNIXユーザを作成するだけでOKです。下記はメールアカウント「sample@example.com」を作成しています。シェルは必ず「/sbin/nologin」を指定しましょう。

useradd -s /sbin/nologin sample
passwd sample
ユーザー sample のパスワードを変更。
新しいパスワード: <←パスワードを入力>
新しいパスワードを再入力してください: <←パスワードを入力>
passwd: 全ての認証トークンが正しく更新できました。

メールクライアント(Thunderbird)の設定手順

メールクライアント Thunderbird の設定手順です。

「既存のメールアドレスのセットアップ」の画面を開きます。
Thunderbird > アカウント設定 > アカウント操作 > アカウントの追加

適当な名前、メールアドレス、パスワードを入力して「手動設定」をクリックします。(「t.apar.jp」ドメインでの設定例になります)

以下のように設定して、「再テスト」をクリックします。(ユーザー名はメールアドレスではないことに注意してください)

以下のメッセージが表示されたら「完了」をクリックしてください。

以上で、Thunderbird の設定完了です。メールが送受信できることを確認してください。
送受信がうまくいかない場合は、メールサーバのポートが空いていることを確認してみましょう。また、設定箇所がかなり多いため、設定漏れや間違いなどもあるかと思います。Postfix、Dovecotのログも確認してみてください。

メールサーバ間暗号化通信の確認

GmailなどSSL/TLSに対応しているメールサービスとメールを送受信してみると、メールサーバ間でSSL/TLS暗号化通信が行われていることが確認できると思います。

Gamilへ送信したメールのヘッダ

Received: from mail.t.apar.jp ([x.x.x.x])
        by mx.google.com with ESMTPS id h19-20020a17090aa89300b002684bc84493si5383253pjq.131.2023.09.02.16.17.07
        for <sample@gmail.com>
        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
        Sat, 02 Sep 2023 16:17:07 -0700 (PDT)

Gmailから受信したメールのヘッダ

Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52])
	(using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)
	 key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256)
	(No client certificate requested)

第三者中継(オープンリレー)チェック

メールサーバが誰にでも送信に使われてしまうと、迷惑メールやフィッシングメールの温床になります。メール送信サーバ(Postfix)の設定が終わったら必ず第三者中継チェックを行いましょう。

これは「オープンリレー(Open Relay)」チェックとも呼ばれ、以下のツールなどでチェックすることができます。

AppRiver SpamLab - Open Relay Test

Open Relay Test の使い方

メールサーバのアドレス(FQDN)を入力してボタンをクリックすれば、チェックが開始します。

1〜2分で結果が表示されますので、すべてのテスト結果が「Relay NOT Accepted」になっていることを確認してください。

おわりに

設定お疲れさまでした! 

Postfix と Dovecot の基本的な設定は以上ですが、DKIM認証(送信ドメイン認証)及びDMARCの設定、SFP認証を受信側で検証する設定もあわせて行うことをオススメいたします。設定方法は以下の記事をご参照ください。

関連記事:
Postfix DKIM設定(OpenDKIM)
DMARC 導入時の注意点と設定方法
Postfix SPF検証設定(pypolicyd-spf)

コメント

  1. 匿名 より:

    自宅や会社からは大丈夫なのに出先などで自鯖からメールが送れない、という事象が発生していて困っていましたが、SPAM対策の設定に入っているzen.spamhaus.orgがドコモのドメインまたはそれの所有IPアドレスをしょっちゅうSPAMのリストに入れているようです。

  2. メールにもLet’s encryptをつかってみた より:

    […] SSLメールサーバ構築メモ Let’s Encrypt+Postfix+Dovecot […]

  3. hibriiiiidge より:

    大変参考にさせていただきました!
    ありがとうございました!

タイトルとURLをコピーしました