TOP > カテゴリ > サーバー構築・運用・Linux >

メール送受信の通信経路をSSL/TLSに対応する [Postfix/Dovecot]

CentOSで各種サーバー構築(目次)

Postfix、DovecotでSMTPS/POP3S/IMAPSを利用した暗号通信の設定方法です。メールを送受信する際のユーザー認証も暗号化されます。

また、前回の記事ではPostfixの認証を総当たり攻撃から防ぐFail2banを設定しましたが、Dovecotにも適用します。

前提条件

開発者の為のメール送信サーバー(Postfix)の構築方法
開発者の為のメール送受信サーバー(Postfix)の構築方法
POP3/IMAPサーバーをDovecotで構築する
NginxにRoundcubeのWebメールシステムを導入する (任意)
DKIM/ADSPの設定 (任意)

1. サーバー証明書の発行

NginxでWebサイトのSSLは適用済みとします。次は設定の例です。

[Nginxの設定例]

// Nginxの設定ファイル
sudo vi /etc/nginx/conf.d/example.com.conf

---
# リダイレクト(http -> https)
server {
    listen       80;
    server_name  example.com;
    return       301 https://www.example.com$request_uri;
}

# メイン
server {
    listen       443 ssl;
    server_name  www.example.com;
    root /home/ユーザー名/html/www.example.com;

    * 省略 *
}
---

[メール用の証明書発行]

sudo certbot certonly --webroot -w /home/ユーザー名/html/www.example.com/ -d mail.example.com

-wドキュメントルート
-dドメイン名

既にWebサイト(www.example.com)をhttpsにしている場合は、対話式の「メールアドレスの入力」「規約への同意」「Let's Encryptパートナーにメールアドレスを公開」の操作はありません。

[証明書/秘密鍵のパスを確認]

sudo certbot certificates

2. Postfixの設定

[main.cf]

// main.cfファイルを編集する
sudo vi /etc/postfix/main.cf

// 以下をファイルの末尾に追加する

# [SSL/TLS設定]
smtpd_use_tls = yes
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1

[master.cf]

// master.cfファイルを編集する
sudo vi /etc/postfix/master.cf

---
# サブミッションポートを閉じる
#submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes

# SMTPSを有効にする
smtps     inet  n       -       n       -       -       smtpd
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
---

// Postfixの再起動
sudo systemctl restart postfix
sudo systemctl status postfix

3. Dovecotの設定

[10-ssl.conf]

// 10-ssl.confファイルを編集する
sudo vi /etc/dovecot/conf.d/10-ssl.conf

---
ssl = yes

# <は必要なので注意
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
---

[10-master.conf]

// 10-master.confファイルを編集する
sudo vi /etc/dovecot/conf.d/10-master.conf

---
# IMAPを無効/IMAPSを利用可能にする
service imap-login {
  inet_listener imap {    
    # 無効にする
    port = 0
    
    # RoundcubeなどのWebメールシステムを使用する際は
    #「port = 0」は記述せずに「port = 143」を下記のままにします。
    # ※その際はファイアウォール側ではIMAPの143ポートは閉じると良いです。
    
    # port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

# POP3を無効/POP3Sを利用可能にする
service pop3-login {
  inet_listener pop3 {
    # 無効にする
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
} 
---

// Dovecotを再起動
sudo systemctl restart dovecot
sudo systemctl status dovecot

4. Fail2banの設定

Fail2banは各自でインストール済みとします。

// 基本設定ファイルは編集しない
sudo vi /etc/fail2ban/jail.conf

// dovecot.confを作成する
sudo vi /etc/fail2ban/jail.d/dovecot.conf

[dovecot.conf]

10分以内に5回認証に失敗すると24時間のBANとなります。24時間経過すると自動的にBANが解除されます。

[dovecot]
enabled = true
maxretry = 5
findtime = 600
bantime =  86400

// 設定の反映
sudo systemctl reload fail2ban
 
// sshdの監視状態(ステータス)
sudo fail2ban-client status sshd
// postfix-saslの監視状態(ステータス)
sudo fail2ban-client status postfix-sasl
// dovecotの監視状態(ステータス)
sudo fail2ban-client status dovecot

5. ポートの開放

// SMTP-Submission(587)を閉じる
sudo firewall-cmd --permanent --zone=public --remove-service=smtp-submission
// POP3(110)を閉じる
sudo firewall-cmd --permanent --zone=public --remove-service=pop3
// IMAP(143)を閉じる
sudo firewall-cmd --permanent --zone=public --remove-service=imap

// SMTPS(465)を開放
sudo firewall-cmd --permanent --zone=public --add-service=smtps
// POP3S(995)を開放
sudo firewall-cmd --permanent --zone=public --add-service=pop3s
// IMTPS(993)を開放
sudo firewall-cmd --permanent --zone=public --add-service=imaps


// firewallのリロード
sudo firewall-cmd --reload
 
// 状態を確認
sudo firewall-cmd --list-all

// 登録可能なサービス一覧
sudo firewall-cmd --get-services

外部サイトでポートの確認が行えます。

6. 証明書の自動更新設定

CRONジョブが初めての方はCRONジョブでPHPファイルを実行するを参考にして下さい。また、rootでCRONジョブを登録して下さい。

// CRONジョブの設定ファイルをエディタで開く
crontab -e
 
// 次の1行を書き込む
// 毎朝3:30に証明書の更新を実行する
30 3 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"

// Web/メールで2種類の証明書がある場合は次のようNginxを含めます。
30 3 * * * certbot renew -q --deploy-hook "systemctl restart nginx postfix dovecot"

renew サーバー証明書を更新する。(有効期限が30日未満の場合のみ)
-qエラーメッセージのみを出力する。
--deploy-hookサーバー証明書ごとに実行する。

7. 操作確認

パソコン側のメーラーで次のように設定します。

受信 POP3 mail.example.com 995 SSL/TLS
送信 SMTP mail.example.com 465 SSL/TLS

秀丸メールの場合

メニューの[ファイル][アカウントの新規作成]で途中に「手動設定」を選択して、最後に「アカウント毎の設定」ボタンを押します。左下の「上級者向け設定」をオンにして[メールサーバー][詳細]を選択して「POP over SSL」「SMTP over SSL」をオンにします。

以上となります。





関連記事



公開日:2019年11月28日 最終更新日:2019年11月30日
記事NO:02806