【AlmaLinux9】DovecotをSSL/TLSで通信暗号化する方法

AlmaLinux9にインストールされたDovecotとクライアント間の通信を、SSL/TLSで暗号化する方法です。

下記の手順で作成したPostfix + Dovecot環境のDovecotとメールクライアント間の通信を暗号化しています。

【AlmaLinux9】Postfix + SMTP-AUTH + Dovecotでメールサーバを構築する方法

SSL/TLS証明書はLet's Encryptで取得しています。

証明書の取得手順はこちらのページで解説しています。

【AlmaLinux9】Let’s EncryptでSSL/TLS証明書を取得する方法(Nginx + certbot)

作業工程

作業は下記の流れで行っていきます。

  1. ファイアウォール設定
    • imaps(993)pop3s(995)通信許可設定
  2. Dovecot設定
    • /etc/dovecot/conf.d/10-ssl.conf
    • /etc/dovecot/conf.d/10-master.conf
    • 設定反映
  3. 動作確認
    • imapsとpop3sでの接続確認
    • pop3とimapで接続ができないことを確認
  4. ファイアウォール設定
    • pop3(110)imap(143)ポート通信許可の設定削除
  5. SSL/TSL証明書更新時にDovecotを再起動させる処理
    • Dovecot再起動スクリプト作成

ファイアウォール設定

imaps(993)とpop3s(995)ポートの通信を許可する設定を行います。

$ su -
# firewall-cmd --permanent --add-port=993/tcp
# firewall-cmd --permanent --add-port=995/tcp
# firewall-cmd --reload

設定した993/tcpと995/tcpポートが登録されていることを確認します。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client http https
  ports: 10022/tcp 25/tcp 587/tcp 110/tcp 143/tcp 993/tcp 995/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Dovecot設定

SSL/TLSで暗号化通信を行うための設定を下記の設定ファイルに行っていきます。

  • /etc/dovecot/conf.d/10-ssl.conf
  • /etc/dovecot/conf.d/10-master.conf

10-ssl.conf

「/etc/dovecot/conf.d/10-ssl.conf」に暗号化通信の設定を行っていきます。

# cd /etc/dovecot/conf.d
# cp -p 10-ssl.conf 10-ssl.conf_$(date +%Y%m%d-%H%M%S)
# vi 10-ssl.conf 

設定内容

下記項目の設定を行います。

  • ssl 暗号化通信のみとする
  • ssl_cert SSL/TLS証明書の指定
  • ssl_key 秘密鍵の指定
ssl = required

ssl_cert = </etc/letsencrypt/live/ドメイン名/fullchain.pem
ssl_key = </etc/letsencrypt/live/ドメイン名/privkey.pem

10-master.conf

「/etc/dovecot/conf.d/10-master.conf」にimap、pop3の無効化とimapsとpop3sを有効化する設定を行っていきます。

# cp -p 10-master.conf 10-master.conf_$(date +%Y%m%d-%H%M%S)
# vi 10-master.conf 

設定内容

下記項目の設定を行います。

  • inet_listener imapのポート番号を0に設定し無効化
  • inet_listener imaps port = 993とssl = yes についている#を削除
  • inet_listener pop3のポート番号を0に設定し無効化
  • inet_listener pop3s port = 995とssl = yes についている#を削除

赤文字部分が編集対象となる箇所です。

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


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

「port = 143」と「port = 110」の設定については、後で設定を戻したい場合に備えて頭に「#」をつけてコメントにしています。

設定反映

Dovecotの再起動を行い設定を反映させます。

# systemctl restart dovecot

動作確認

メールクライアントからpop3とimapで接続ができないことを確認します。

メールクライアントの設定を変更して、imapsとpop3sでの接続できることを確認してください。

ファイアウォール設定

使用しなくなるpop3(110)ポートとimap(143)ポートの通信を許可する設定を削除します。

# firewall-cmd --permanent --remove-port=110/tcp
# firewall-cmd --permanent --remove-port=143/tcp
# firewall-cmd --reload

110/tcpと143/tcpの設定が無くなっていることを確認してください。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client http https
  ports: 10022/tcp 25/tcp 587/tcp 993/tcp 995/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

SSL/TSL証明書更新時にDovecotを再起動させる処理

DovecotはSSL/TLS証明書が更新された際に新しい証明書を読込みさせる必要があります。

Let's EcryptでSSL/TLS証明書を取得すると、「/etc/letsencrypt/renewal-hooks/post」にスクリプトを格納しておくことで証明書が更新されたあとにスクリプトを実行してくれるという機能があります。

この機能を利用して、証明書の更新が終わった後にDovecotを再起動させて新しい証明書をDovecotに読み込ませることにします。

まずはDovecotを再起動させるスクリプトを作成します。

# cd /etc/letsencrypt/renewal-hooks/post
# vi restart_dovecot.sh

スクリプトの内容は、systemctlを使ってdovecotを再起動させるというとてもシンプルなものになっています。

#!/bin/bash
systemctl restart dovecot.service

スクリプトのパーミッションを変更して、実行できるようにします。

# chmod 755 restart_dovecot.sh

動作確認

作成したスクリプトを実行して、Dovecotが再起動されることを確認してください。

# ./restart_dovecot.sh

/var/log/maillogを確認して、Dovecotが再起動していることを確認してください。

Dec  6 20:32:04 mail dovecot[569643]: log(569643): Warning: Killed with signal 15 (by pid=1 uid=0 code=kill)
Dec  6 20:32:04 mail dovecot[730870]: master: Dovecot v2.3.16 (7e2e900c1a) starting up for imap, pop3, lmtp (core dumps disabled)

スクリプトの動作に問題がなければ、証明書の更新を行ったときにDovecotが再起動するかを確認します。

--dry-runオプションを指定してあげると、実際に証明書を更新せずに更新テストを行えるので、こちらで試してみるのが良いでしょう。

# certbot renew --dry-run

Dovecotが再起動していることを確認できたら、作業は完了となります。

コメント

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