PostfixでTLSを有効化して通信を暗号化

PostfixでTLSを使用して通信の暗号化を有効化する方法です。

この他にもPostfix + Dovecotでメールサーバの構築手順を下記のページで説明しています。

  1. Postfix + SMTP-AUTH + Dovecotでメールサーバを構築
  2. DovecotをSSL通信で暗号化
  3. PostfixでTLSを有効化して通信を暗号化 ### 今回説明している手順です

SSL/TLS証明書ファイルを取得

今回の手順ではLet's Encryptで取得したSSL/TLS証明書を使用しています。

証明書の取得方法はこちらページで解説していますので、参考にしてみてください。

【Ubuntu】Let’s Encrypt+nginxでSSL/TLS(https接続)を設定する方法
検証環境 下記の環境でLet's EncryptでSSL/TLS証明書を発行して、nginxでhttps通信ができるまでの手順を解説していきます。 OS:Ubuntu Server 20.04 nginx:1.21...

上記の手順では、NginxでWebサーバを構築したあとにLet's Encryptで証明書を取得しています。

Postfixでメールサーバを構築するだけであればwebサーバは必要ありませんが、Let'sEncryptで証明書を取得する際に自分が管理しているドメインかの確認をHTTP-01チャレンジで行うために、webサーバを構築する必要があります。

DNSを使用したDNS-01チャレンジという確認方法もありますが、こちらは自動更新の方法などが少し面倒なので今回はHTTP-01チャレンジを紹介しています。

すでに証明書を取得済みの場合は、こちらの作業は必要ありません。

main.conf設定

PostfixでTLSでの暗号化を有効化させる設定を/etc/postfix/main.cfに追加します。

$ cd /etc/postfix
$ sudo cp -p main.cf main.cf_$(date +%Y%m%d-%H%M%S)
$ sudo vi main.cf

設定内容

下記のTLSに関する設定を最後尾に追加します。

smtpd_tls_cert_file(SSL/TLS証明書)とsmtpd_tls_key_file(秘密鍵)の部分で指定しているドメイン名の部分は、証明書を取得したドメイン名により異なりますので、適宜読み替えてください。

smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_loglevel = 1
smtpd_tls_cert_file = /etc/letsencrypt/live/ドメイン名/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/ドメイン名/privkey.pem
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

master.cf設定

submisson(587)ポートは基本的に自分しか使用しないので、TLSによる暗号化を必須とする設定を追加します。

$ sudo cp -p master.cf master.cf_$(date +%Y%m%d-%H%M%S)
$ sudo vi master.cf

設定内容

submissionに関する設定部分の「# -o smtpd_tls_security_level=encrypt」の行頭にある「#」を削除して設定を有効化させてください。

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=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

下記の設定はsubmissionポートでSMTP AUTHを行うための設定となります。

  • -o smtpd_sasl_auth_enable=yes
  • -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

下記のページで説明している手順内で設定を行っています。

Postfix + SMTP-AUTH + Dovecotでメールサーバを構築

設定反映

Postfixを再起動して設定を反映させます。

$ sudo systemctl restart postfix

証明証更新時の処理

Let's Encryptで取得したSSL/TLS証明書の有効期限は90日なので、定期的に証明書を更新する必要があります。

更新された証明書を読み込むために、証明書が更新された際にPostfixを再起動させる設定を行います。

Postfix再起動用スクリプト作成

「/etc/letsencrypt/renewal-hooks/deploy」実行させたいスクリプトを作成しておくと、証明書が更新された際にスクリプトが実行されます。

この機能を利用し、証明書の更新が行われた際にPostfixを再起動させるためのスクリプト作成します。

$ cd /etc/letsencrypt/renewal-hooks/deploy
$ sudo vi restart_postfix.sh

作成するスクリプトの内容です。

#!/bin/bash
systemctl restart postfix.service

スクリプトを実行できるように権限をつけます。

$ sudo chmod 755 restart_postfix.sh

動作確認

スクリプトを実際に実行して、問題なくPostfixが再起動することを確認します。

$ sudo ./restart_postfix.sh

Postfixが再起動したことを確認するには、/var/log/mail.logを確認するか、sudo systemctl status postfixで確認することができます。

/var/log/mail.logで確認

Postfixが再起動しているログが下記のように表示されます。

Nov  7 14:22:16 118-27-116-228 postfix/postfix-script[53966]: stopping the Postfix mail system
Nov  7 14:22:16 118-27-116-228 postfix/master[47771]: terminating on signal 15
Nov  7 14:22:16 118-27-116-228 postfix/postfix-script[54114]: starting the Postfix mail system
Nov  7 14:22:16 118-27-116-228 postfix/master[54116]: daemon started -- version 3.6.4, configuration /etc/postfix

systemctl status postfixで確認

Activeの赤字で示してある部分にPostfixが起動した時間と経過時間が表示されているので、こちらでも再起動した時間が判断できます。

$ sudo systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
     Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabl>
     Active: active (exited) since Mon 2022-11-07 14:22:16 JST; 1min 3s ago
       Docs: man:postfix(1)
    Process: 54119 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 54119 (code=exited, status=0/SUCCESS)
        CPU: 3ms

スクリプト単体での動作に問題がなければ、次にcertbotを使って強制的に証明書を更新させて、Postfixが再起動することを確認してください。

$ sudo certbot renew --force-renew

こちらもスクリプト単体での場合と同様に、Postfixが再起動していることを確認してください。

Let's Encryptでは、証明書の更新は1週間に5回までとなっていますのでテストし過ぎには注意してください。

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

今回の設定でPostfixをTLSに対応させたので、メールクライアントの設定も暗号化に対応するように設定を変更します。

設定例としてThunderbirdの設定方法を説明していきます。

Thunderbirdを起動して「編集」-「アカウント設定」と選択します。

編集したいアカウントを選択して、送信(SMTP)サーバーのSMTPサーバを編集をクリックします。

送信(SMTP)サーバー画面が表示されるので、接続の保護をSTARTTLS変更しOKをクリック。

コメント

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