クラウドサービスの普及により自前でメールサーバを構築することは少なくなりましたが、自前で構築したメールサーバは他のシステムと連携しやすいなど自由度が高いのが魅力です。ただし、セキュリティの確保も自前でしっかり行わなければなりません。そこで今回は、SSL/TLSに対応したメールサーバを構築した時の手順をメモしておきました。
メールサーバの設定概要
メールサーバの設定概要は、以下の通りです。ドメイン名やIPアドレスはサンプルですので実際のものに読み替えてください。
今回サーバOSは、AlmaLinux を利用していますが、Rocky Linux や CentOS Stream など RHEL系のディストリビューションであれば同じ手順で設定できると思います。
メールアドレスのドメイン名 | example.com |
メールサーバのアドレス(FQDN) | mail.example.com |
メールサーバのIPアドレス | 192.0.2.1 |
サーバOS | AlmaLinux 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=465/tcp --permanent
firewall-cmd --add-port=993/tcp --permanent
firewall-cmd --add-port=995/tcp --permanent
firewall-cmd --reload
ポートオープンの設定確認
22/tcp 25/tcp 465/tcp 995/tcp 993/tcp
基本パッケージのインストール
開発ツールなど、基本的なパッケージをインストールしておきます。
dnf groupinstall development
インストール済みのパッケージを、最新版にアップデートします。
Postfix と Dovecot のインストール
(バージョンは、2023年9月15日時点のものです)
Postfix(3.5.9-19)
Dovecot(2.3.16-8)
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 をインストールします。
証明書の取得
Let's Encrypt クライアントの待ち受けポートを開けておきます。
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
Let's Encrypt のSSL/TLS証明書を取得します。
取得した証明書や秘密鍵は「/etc/letsencrypt/live/mail.example.com/」以下に保存されます。
-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」プラグインで証明書を取得してください。
-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
証明書の有効期限確認
notBefore=Sep 15 23:02:35 2023 GMT
notAfter=Dec 14 23:02:34 2023 GMT
Postfix の設定
元の設定ファイルをキープしておきます。
・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
ルックアップテーブルの作成
設定に誤りがないかチェック(なにも表示されなければOKです)
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
ログの出力先作成しておきます
Dovecotを起動
自動起動の設定
認証ソケットファイルが作成されているのを確認します
ls -F /var/spool/postfix/private/auth
---(下記表示があればOK)---
ログのローテーション設定
メールサーバの運用ではログを参照することが多くなりますので、運用しやすいようにログのローテーションの設定をしておくことをお勧めします。
下の設定では1日ごとにログファイルを分けて、ファイル名に日付が付くように設定しています。ログファイルの保存期間は60日としていますが、運用ルールに合わせて設定してください。
Postfixログの設定
出力先ディレクトリ作成
・出力先の変更
vi /etc/rsyslog.conf
mail.* -/var/log/maillog ↓ mail.* -/var/log/mail/maillog
syslog再起動
不要なログを削除
・ログローテーション設定
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です)---
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です)---
empty log files are rotated, old logs are removed
メールアカウントの作成
メールアカウントの作成は、普通に UNIXユーザを作成するだけでOKです。下記はメールアカウント「sample@example.com」を作成しています。シェルは必ず「/sbin/nologin」を指定しましょう。
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)
コメント
自宅や会社からは大丈夫なのに出先などで自鯖からメールが送れない、という事象が発生していて困っていましたが、SPAM対策の設定に入っているzen.spamhaus.orgがドコモのドメインまたはそれの所有IPアドレスをしょっちゅうSPAMのリストに入れているようです。
>匿名さん
情報ありがとうございます。
記事に追記させて頂きました。
[…] SSLメールサーバ構築メモ Let’s Encrypt+Postfix+Dovecot […]
大変参考にさせていただきました!
ありがとうございました!
>hibriiiiidgeさん
コメントありがとうございます。
この記事が参考になってよかったです。