【Ubuntu Server 22.04】PostfixでTLSを有効化して通信を暗号化

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

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

メールサーバ構築手順

  1. 【Ubuntu Server 22.04】Postfix + SMTP-AUTH + Dovecotでメ>ールサーバを構築
  2. 【Ubuntu Server 22.04】DovecotをSSL通信で暗号化
  3. 【Ubuntu Server 22.04】PostfixでTLSを有効化して通信を暗号化
  4. 【Ubuntu Server 22.04】PostfixにDKIMの設定を追加
  5. 【迷惑メール対策】ざっくり説明SPFの設定方法(送信側)
  6. 【迷惑メール対策】ざっくり説明DMARCの設定方法(送信側)
  7. 【Ubuntu Server 22.04】PostfixにSPFチェック機能を追加(policyd-spf)
  8. 【Ubuntu Server 22.04】PostfixとOpenDMARCでDMARC認証を行う方法

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.4 certbot(証明...

上記の手順では、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をクリック。

コメント

  1. 三井 より:

    当サイトを参考にメールサーバを構築しました。
    outlook2013での送受信はメーラー側の詳細設定で可能になったのですが、outlook2019では、アカウントの作成が成功しません。
    ログを見ると以下のログでコケてそうです。
    dovecot: imap-login: Disconnected: Connection closed: SSL_accept() failed: error:0A00010B:SSL routines::wrong version number (no auth attempts in 0 secs): user=, rip=xxx.xxx.215.19, lip=xxx.xx.29.94, TLS handshaking: SSL_accept() failed: error:0A00010B:SSL routines::wrong version number, session=
    対処方法をご存じならご教示頂けますと幸甚です。

  2. tamohiko より:

    三井さん

    お返事遅くなりすいません。

    エラーの内容を調べてみたところ、内容的にはクライアント側とサーバ側のTLSバージョンが違うので発生したエラーみたいです。

    初期設定ではdovecotはTLSv1.2を使用する設定となっています。

    dovecotで設定されているTLSのバージョンは下記のコマンドで確認することが出来ます。
    $ doveconf | grep ssl_min_protocol
    ssl_min_protocol = TLSv1.2

    outlook2019で使用しているTLSのバージョンが1.2に設定されているか確認してみて下さい。

    ログでは「SSL routines::wrong version number」と表示されているので、もしかしたらoutlook側でTLSを使用していないか、TLSv1.0やTLSv1.1を使用して接続する設定になっているのかもしれません。

    • 三井 より:

      ssl_min_protocol = TLSv1.2ではなく、TLSv1で実行していました。ssl_min_protocolの設定を変えても残念ながら解決しませんでした。クライアント側の設定で、IMAPではなくPOP3なら動作する事が判ったでクライアント側の設定で逃げることとしました。
      回答ありがとうございました。

      • tamohiko より:

        三井さん

        POP3であれば接続出来たとのことで、ご連絡ありがとうございます。

        お役に立てず、すいませんでした。

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