メール送受信の通信経路をSSL/TLSに対応する [Postfix/Dovecot]
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」をオンにします。
以上となります。