CentOSのPostfixとDovecotにSSLを設定して安全に通信を行う

centos-mail-postfix03

前回の記事ではメールサーバーとしての基本的な機能である送信(SMTP)と受信(POP3/IMAP)を行うことが出来るように設定を行いました。

Open Source
CentOSのPostfixとDovecotで送受信ができるメールサーバーを構築

前回の記事ではCentOSにインストールしたPostfixでメールを送信できるようにするところまでの設定手順を紹介しました。今回は同じ環境を使ってメールの送信と受信ができるところまでの設定手順を紹介します。 外部からのメールを受け取ることも ...

この状態でも運用には問題ありませんが、メールサーバーとクライアント間で通信が平文になっていますので、通信をよりセキュアにするためSSL/TLSを設定することをお勧めします。
SSL/TLSは設定することで平文でやり取りされていた認証情報(SMTP認証や受信時の情報)やメールの内容が暗号化することができます。万が一、ネットワークの盗聴(スニッファ)などがあった場合でも認証情報やメールの内容などは暗号化されていますので安全です。

メールサーバー 構築の基礎 全4回

1
CentOSとPostfixを使って送信専用のメールサーバーを構築する方法

こんにちは、ITエンジニアのKomuraです。 最近ではクラウドでのSaaSによるメールサービス(GoogleのG SuiteやMicrosoftのOffice365など)が一般的になり、以前ほどメールサーバーを構築する機会も少なりましたが ...

2
CentOSのPostfixとDovecotで送受信ができるメールサーバーを構築

前回の記事ではCentOSにインストールしたPostfixでメールを送信できるようにするところまでの設定手順を紹介しました。今回は同じ環境を使ってメールの送信と受信ができるところまでの設定手順を紹介します。 外部からのメールを受け取ることも ...

centos-mail-postfix033
CentOSのPostfixとDovecotにSSLを設定して安全に通信を行う

前回の記事ではメールサーバーとしての基本的な機能である送信(SMTP)と受信(POP3/IMAP)を行うことが出来るように設定を行いました。 この状態でも運用には問題ありませんが、メールサーバーとクライアント間で通信が平文になっていますので ...

dkim-postfix044
CentOSのPostfixで迷惑メール判定されないようDKIMを設定する

2023/10/19    

構築したメールサーバーから送信したメールが迷惑メールとして識別されたことはありませんか?このような場合は、送信したメールが経由するメールサーバーのなりすましメール対策に引っかかっている場合が殆どです。(まれに迷惑メールのブラックリストに登録 ...

メールサーバー構築の基礎 3回目になる本記事では、セキュリティ面で更に強固にするために構築したメールサーバーでSSL/TLSを利用できるように設定する方法を紹介していきます。

1. メールサーバーの構成と概要

今回想定するメールサーバーにSSL/TLSを設定した場合の構成とメールフローは以下の図のようになります。

SMTPS-img1


メールサーバーの構成とSSL/TLS設定時のメールフロー

  1. メールの送信と受信は共にSSL/TLSによって暗号化されます
  2. 送信先のメールサーバーはSSL/TLSに対応している場合、送受信が暗号化されます
  3. ドメイン名としてtestdom.comを利用
  4. ホスト名を含むFQDNはmail.testdom.com

SSL/TLSを利用する場合、少し前までは有償のサーバー証明書を利用する必要がありましたが、最近ではLet's Encryptというサーバー証明書を無償で発行するための有志のコミュニティが作成したプロジェクトがあります。このLet's Encryptを利用してメールのSSL/TLS対応を設定していきます。是非、設定してみて下さい。

SSLとTLS

※Postfixとdovecotでは通信の暗号化に、トランスポート層セキュリティ (Transport Layer Security/TLS)を利用しています。TLSはSSLの次世代規格で厳密には異なる技術(SSLを引継いだのがTLS)ですが、共に通信をセキュアにするための技術のため、本記事ではSSL/TLSと記載しています。

1. メールサーバーに設定したホスト名の正引き確認

メールサーバーの通信をSSL/TLSで暗号化するためには、サーバー証明書が必要になります。
本記事では無償のサーバー証明書を発行できる”Let's Encrypt”を利用します。Let’s Encryptを利用するためにはホスト名が正引き(ホスト名からIPアドレスを参照)できる必要があります。

注意

本記事でホスト名はFQDNになります。FQDNはFully Qualified Domain Nameの略で、ホスト名、ドメイン名(サブドメイン名)などすべてを省略せずに指定した記述形式です。(例:mail.testdom.com)以下、ホスト名と記載がある時はFQDN形式を指します。

本環境では、ホスト名として以前の記事で設定されている”mail.testdom.com”を利用する前提としています。こちらはAレコードとしてDNSにIPアドレスを登録していますので、ホスト名の正引きができる状態になっています。

逆引きは必須ではありませんが、設定されていると迷惑メールと判定されにくくなります。

Let's Encryptを利用する前に、ホスト名の正引きができることを確認します。

ホスト名の正引き設定は、ご利用のDNSサーバーやドメイン管理業者によって手順が異なるため、本記事では割愛しています。

1-1. hostコマンドによる正引きの確認

Linuxではhostコマンドによるホスト名の確認が可能です。使い方はhostコマンドにホスト名を付けて実行します。
以下が実行例になります。尚、hostコマンドはデフォルトでインストールされていないため、yumコマンドでbind-utilsをインストールします。

 command
# yum -y install bind-utils

bind-utilsがインストールされると、hostコマンドが利用できるようになります。”mail.testdom.com”を確認する場合、以下のようにコマンドを実行します。

 command
$ host mail.testdom.com
mail.testdom.com has address 110.20.3.145

指定したホスト名に対して、IPアドレスが表示されれば、DNSの設定は完了しています。
もしホスト名が見つからないという警告が表示された場合には、ご利用のDNS設定を見直して下さい。ここでは正常に確認ができたという前提で先へ進めていきます。

2. ファイアウォールへの接続許可設定

Let's Encryptでは証明書の発行時にHTTPとHTTPSを利用してサイトの確認を行っているため、HTTPの接続ポート80番とHTTPSの接続ポートである443番について接続許可を行います。尚、ファイアウォールはCentOSのデフォルトであるfirewall-cmdを利用している前提となります。

2-1. 現状のファイアウォール設定を確認

先ず、現状の設定を確認します。HTTPとHTTPSの接続は、Let's Encryptの接続用にしか利用しませんが、Let's Encryptの接続元IPが不明なため、本記事では全てのネットワークから接続を許可するように設定します。インターフェイスに適用されているゾーン、"public"ゾーンの設定を確認します。

 command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client pop3 imap smtp smtp-submission
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

上記のようにメールの接続ポートは許可されていますが、HTTPとHTTPSは許可されていません。

2-2. HTTPSサービスの接続許可を追加

項目2-1. で確認した「public」ゾーンの接続許可サービスにHTTPとHTTPSを追加します。追加は以下のように行います。

 command
# firewall-cmd --add-service={http,https} --permanent
success

"success"と表示されれば設定は完了です。設定を反映するためにファイアウォールの設定をリロードします。

 command
# firewall-cmd --reload
success

「success」と表示されれば設定のリロードは完了です。

2-3. HTTPとHTTPS接続ポートの追加確認

設定した内容が正常に反映されているかを確認します。確認は以下のように行います。

 command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client pop3 imap smtp smtp-submission http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

”services”の項目にhttpとhttpsが追加されていることが確認できれば、確認は完了です。ここまででLet's Encrypt用ファイアウォールの接続許可は完了しました。

3. Let’s Encrypt を利用したサーバー証明書の取得

本章ではSSL証明書の取得に関する設定を行います。メールの通信をSSL/TLSに対応させるためには、サーバー証明書(サーバーの身分証明書)が必要になります。本章ではLet’s Encryptを導入してサーバー証明書を発行する手順を紹介していきます。

3-1. certbotパッケージ導入前の設定 EPELレポジトリの導入

Let’s Encryptを利用するためのアプリケーションは”certbot”という名前でパッケージ化されています。
certbotはCentOSのベースレポジトリには含まれておらず、EPELレポジトリに含まれています。EPELレポジトリはエンタープライズ向けのレポジトリでベースレポジトリには含まれていないパッケージが多数含まれています。
環境によっては、予めインストールされている場合がありますが、本記事では確認と導入方法を説明します。

3-1-1. EPELレポジトリの確認

EPELレポジトリがインストールされているかを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、epelレポジトリがインストールされていることを確認します。

 command
$ yum list installed | grep epel

出力結果として、以下のようにEPELレポジトリパッケージが表示されればインストールされています。

 log
epel-release.noarch 7-9 @extras

もし何も表示されない場合はEPELレポジトリがインストールされていません。yumコマンドでEPELレポジトリパッケージをインストールします。

3-1-2. EPELレポジトリのインストール

yumコマンドでEPELレポジトリをインストールします。EPELレポジトリは”epel-release”パッケージ名になります。以下のようにインストールを行います。

 command
# yum -y install epel-release
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
base | 3.6 kB 00:00
extras | 3.4 kB 00:00
updates | 3.4 kB 00:00
updates/7/x86_64/primary_db | 6.0 MB 00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ epel-release.noarch 0:7-11 を インストール
--> 依存性解決を終了しました。依存性を解決しましたインストール中:
epel-release noarch 7-11 extras 15 kトランザクションの要約
インストール 1 パッケージ総ダウンロード容量: 15 k
インストール容量: 24 k
Downloading packages:
epel-release-7-11.noarch.rpm | 15 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : epel-release-7-11.noarch 1/1
検証中 : epel-release-7-11.noarch 1/1インストール:
epel-release.noarch 0:7-11
完了しました!

エラーの出力がなく「完了しました!」と表示されれば、EPELレポジトリは正常にインストールされています。インストールされているレポジトリのリストは"yum repolist"コマンドで確認します。

 command
$ yum repolist

実行すると、以下のようにレポジトリが表示されます。

 log
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: ftp.jaist.ac.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
リポジトリー ID リポジトリー名 状態
base/7/x86_64 CentOS-7 - Base 9,911
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 12,742
extras/7/x86_64 CentOS-7 - Extras 432
updates/7/x86_64 CentOS-7 - Updates 1,589
repolist: 24,6741

出力された結果にEPELが表示されていればEPELレポジトリを利用する準備は完了しています。これでEPELレポジトリのインストールと確認は完了です。

3-2. certbotパッケージのインストール

EPELレポジトリに含まれるcertbotパッケージを確認します。”yum search”コマンドを実行します。

 command
$ yum search certbot
読み込んだプラグイン:fastestmirror
Determining fastest mirrors
* base: ftp.jaist.ac.jp
* epel: ftp.jaist.ac.jp
* extras: ftp.jaist.ac.jp
* updates: ftp.jaist.ac.jp
epel 12742/12742
============= N/S matched: certbot ====================
python2-certbot.noarch : Python 2 libraries used by certbot
python2-certbot-apache.noarch : The apache plugin for certbot
python2-certbot-dns-cloudflare.noarch : Cloudflare DNS Authenticator plugin for Certbot
python2-certbot-dns-cloudxns.noarch : CloudXNS DNS Authenticator plugin for Certbot
python2-certbot-dns-digitalocean.noarch : DigitalOcean DNS Authenticator plugin for Certbot
python2-certbot-dns-dnsimple.noarch : DNSimple DNS Authenticator plugin for Certbot
python2-certbot-dns-dnsmadeeasy.noarch : DNS Made Easy DNS Authenticator plugin for Certbot
python2-certbot-dns-gehirn.noarch : Gehirn Infrastructure Service DNS Authenticator plugin for Certbot
python2-certbot-dns-google.noarch : Google Cloud DNS Authenticator plugin for Certbot
python2-certbot-dns-linode.noarch : Linode DNS Authenticator plugin for Certbot
python2-certbot-dns-luadns.noarch : LuaDNS Authenticator plugin for Certbot
python2-certbot-dns-nsone.noarch : NS1 DNS Authenticator plugin for Certbot
python2-certbot-dns-ovh.noarch : OVH DNS Authenticator plugin for Certbot
python2-certbot-dns-rfc2136.noarch : RFC 2136 DNS Authenticator plugin for Certbot
python2-certbot-dns-route53.noarch : Route53 DNS Authenticator plugin for Certbot
python2-certbot-dns-sakuracloud.noarch : Sakura Cloud DNS Authenticator plugin for Certbot
python2-certbot-nginx.noarch : The nginx plugin for certbot
certbot.noarch : A free, automated certificate authority client1

certbotには複数のプラグインがあります。この中でサーバー証明書を取得する為に必要なパッケージは

certbot.noarch : A free, automated certificate authority client

になります。”yum install”のコマンドでcertbotパッケージをインストールします。

 command
# yum -y install certbot

コマンドを実行すると、インストールの状況が出力されます。

 log
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: ftp.jaist.ac.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ certbot.noarch 0:0.27.1-1.el7 を インストール
【略】
python-zope-interface.x86_64 0:4.0.5-4.el7 python2-acme.noarch 0:0.27.1-1.el7
python2-certbot.noarch 0:0.27.1-1.el7 python2-configargparse.noarch 0:0.11.0-1.el7
python2-cryptography.x86_64 0:1.7.2-2.el7 python2-future.noarch 0:0.16.0-6.el7
python2-josepy.noarch 0:1.1.0-1.el7 python2-mock.noarch 0:1.0.1-9.el7
python2-parsedatetime.noarch 0:2.4-5.el7 python2-pyasn1.noarch 0:0.1.9-7.el7
python2-pyrfc3339.noarch 0:1.0-2.el7 python2-requests.noarch 0:2.6.0-0.el7
python2-six.noarch 0:1.9.0-0.el7 pytz.noarch 0:2016.10-2.el7
setools-libs.x86_64 0:3.3.8-2.el7
完了しました!

エラーの出力がなく「完了しました!」と表示されれば、certbotパッケージは正常にインストールされています。

3-3. certbotインストール後の確認

certbotがインストールされたことを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、certbotパッケージがインストールされていることを確認します。

 command
$ yum list installed | grep certbot
certbot.noarch 0.27.1-1.el7 @epel
python2-certbot.noarch 0.27.1-1.el7 @epel

結果に「certbot」「python2-certbot」が表示されればパッケージはインストールされています。

4. サーバー証明書の作成

サーバー証明書を作成するためのcertbotパッケージがインストールされましたので、certbotコマンドを利用してサーバー証明書を作成する手順を紹介していきます。

4-1. certbotコマンドの実行

Let’s Encryptによるサーバー証明書はcertbotコマンドで作成します。”--standalone”オプションを付与して証明書のみを発行するように実行します。”-d”オプションはメールサーバーのFQDNを指定しています。

 command
# certbot certonly --standalone -d mail.testdom.com

実行すると初回の実行時のみ、以下のように対話型のウィザードが起動します。幾つかの質問がありますので、回答します。

 log
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security
notices) (Enter 'c' to cancel): info@testdom.com      任意のメールアドレスを入力
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org-----------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A   利用規約に了解するかを回答(Aを入力)
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to Encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N    メーリングリストに入るかの選択(任意)

回答が終わると、証明書の作成が始まります。

 log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mail.testdom.com
Waiting for verification...
Cleaning up challengesIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/mail.testdom.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/mail.testdom.com/privkey.pem
Your cert will expire on 2019-01-16. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

上記のように”Congratulations!”と表示されればサーバー証明書の作成は完了です。サーバー証明書の保存場所は”/etc/letsencrypt/live/mail.testdom.com/”ディレクトリになります。(FQDN名のディレクトリは自動的に作成されます。)
作成された証明書用ファイルの役割は以下の通りです。

cert.pem サーバー証明書本体
chain.pem 中間証明書
privkey.pem 秘密鍵ファイル
fullchain.pem サーバー証明書と中間証明書のセット

ファイルのうちPostfixとdovecotで利用するものは”fullchain.pem”と ”privkey.pem”の2ファイルになります。fullchain.pemは中間証明書を含んだ証明書ファイルになります。これでサーバー証明書の作成と確認は完了です。

4-2. 証明書の更新コマンド定期実行設定

Let's Encryptで作成したサーバー証明書は有効期限が三か月です。その為定期的に更新を実行するようにcronに設定を行います。cronの設定にはcrontabにコマンドを利用します。crontabはrootユーザーで実行します。設定はcrontabコマンドを以下のように実行します。

 command
# crontab -e

実行するとエディタが起動します。以下を追記します。”--deploy-hook”オプションは、サーバー証明書の更新が行われた場合のみ実行するコマンドを指定できます。更新時にはPostfixとdovecotを再起動して、更新された証明書を読み込む必要があるため、再起動用のコマンドを指定します。
本記事では以下のように設定を行います。

 code
00 3 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart postfix dovecot"

上記は毎日3:00と5:00に更新コマンドを実行する場合の記載です。(2回実行するように記載しているのは1回目が失敗した場合のため)もし他の時刻にしたい場合には3と5を適宜変更します。変更後にはファイルを保存します。(viコマンドと同じ保存手順)
設定後にcrontabの内容を確認します。確認は

 command
# crontab -l

と実行します。先ほど追加した設定が表示されれば、自動更新の設定は完了です。

5. PostfixのSSL/TLS設定

ここまででSSL/TLS通信に利用するサーバー証明書の作成が完了しました。このサーバー証明書を利用してPostfix側でSSL/TLS通信であるSMTPSを行うように設定の変更を行っていきます。
設定変更についての前提条件は以下の通りになります。

SMTPSとSMTP-AUTH設定の前提条件

  • SMTPSでSSL/TLS通信を行うように設定
  • SMTP-AUTHの認証情報は通信がSSL/TLSで暗号化されるため平文のまま
  • SMTP-AUTHの認証情報はLinuxのユーザーアカウントを利用

この前提条件に合わせて、Postfixの設定を行っていきます。

5-1. main.cfの変更

PostfixでSSL/TLS通信を行うため設定は”/etc/postfix”ディレクトリ以下にあるmain.cfとmaster.cfファイルで行います。先ずはmain.cfを変更します。main.cfの設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。(.org、.org2ファイルは前の記事で作成していますので、本記事では.org3としています。)

 command
# cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org3

バックアップの完了後、エディタでmain.cf設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/postfix/main.cf

main.cf設定ファイルが開きます。具体的は変更ポイントは以下になります。

ポイント

変更点でコメントを「付ける」「外す」という記載がありますが、以下のような意味合いになります。

  • 「コメントを外す」は行頭の”#”を削除
  • 「コメントを付ける」は行頭に”#”を付ける

5-1-1. SSL/TLS通信用パラメータ

SMTPをSSL/TLSに対応させる設定パラメータを追記します。このパラメータはデフォルトのmain.cfには項目が無い為、設定ファイルの最下行に以下を追記します。

 code
### SSL/TLS Settings
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.testdom.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.testdom.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

各パラメータの内容は以下のようになります。

smtp_tls_security_level SMTPセッションでSSL/TLSを有効化する。mayは強制しない
smtpd_tls_cert_file SSL/TLS通信で利用するサーバー証明書のパスを指定
smtpd_tls_key_file SSL/TLS通信で利用する秘密鍵のパスを指定
smtpd_tls_session_cache_database SSL/TLS通信用キャッシュデータベースの指定
smtpd_tls_session_cache_timeout SSL/TLS通信のキャッシュ保持時間
smtpd_tls_received_header 使用されているプロトコルおよび暗号に関する情報をReceivedヘッダーに追加
smtpd_tls_loglevel SSL/TLS通信時のログ出力レベル

追記が出来たら、ファイルを保存して終了します。

5-2. master.cfの変更

main.cfの設定が終わりましたので、master.cfファイルを変更します。master.cfの設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。(.orgファイルは前の記事で作成していますので、本記事では.org2としています。)

 command
# cp -p /etc/postfix/master.cf /etc/postfix/master.cf.org2

バックアップの完了後、エディタでmain.cf設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/postfix/master.cf

master.cfファイルが開きます。具体的は変更ポイントは以下になります。

5-2-1. smtpsパラメータ

SMTPSポートを有効にするsmtpsパラメータを変更します。このパラメータはデフォルトのmaster.cfでは無効になっています。以下がデフォルトの設定について抜粋した部分です。

 code
#smtps inet n - n - - smtpd
# -o syslog_name=postfix/smtps
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=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=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING

この設定を以下のように変更します。

 code
smtps inet n - n - - smtpd   コメントを外す
# -o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes コメントを外す
-o smtpd_sasl_auth_enable=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=permit_sasl_authenticated,reject  コメントを外す
# -o milter_macro_daemon_name=ORIGINATING

変更が出来たら、master.cfファイルを保存して終了します。

5-3. 設定ファイルのチェック

設定ファイルのチェック用としてコマンド”postconf”を実行します。デフォルトパラメーターとは異なる設定のみを明示的に表示する”-n”オプションを付与します。以下のように実行します

 command
$ postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = all
local_recipient_maps = unix:passwd.byname $alias_maps
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
masquerade_domains = testdom.com
message_size_limit = 10485760
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = remtest.xyz
myhostname = mail.testdom.com
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.testdom.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.testdom.com/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = yes
unknown_local_recipient_reject_code = 550

出力された内容を確認して、変更した部分が反映されていることを確認します。
またPostfixには設定ファイルの誤りをチェックするためのコマンド”postfix check”が用意されています。このコマンドで設定ファイルのチェックも行っておきます。

 command
# postfix check

エラーが表示されなければ、main.cfとmaster.cfファイルには問題がありませんので、確認は完了です。

6. main.cf、master.cfファイル変更点の反映

変更した設定を反映するためにPostfixを再起動します。systemctlコマンドを以下のように実行します。

 command
# systemctl restart postfix

エラーが無ければ、正常に再起動は実行されています。再起動後にPostfixのステータスを確認します。

 command
# systemctl status postfix
 Postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/Postfix.service; enabled; vendor preset: disabled)
Active: active (running) since 金 2018-10-19 16:08:49 JST; 6s ago
Process: 1827 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
Process: 1840 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
Process: 1838 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
Process: 1836 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
Main PID: 1912 (master)
CGroup: /system.slice/postfix.service
tq1912 /usr/libexec/postfix/master -w
tq1913 pickup -l -t unix -u
mq1914 qmgr -l -t unix -u

表示された上記のステータスから、Postfixが正常に起動していることが確認できました。
SMTPSは465番ポートで待ち受けを行います。Postfixの再起動後に465番ポートでLISTENしていることを確認します。LISTENしているポートを確認するために”netstat”コマンドを実行します。TCPポートのみを確認します。

 command
$ netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

上記のように465番ポートがLISTENしていることが出来れば、Postfixの設定と確認は完了です。

7. dovecotの設定

送信側であるPostfixの設定が完了しましたので、受信側のdovecotでSSL/TLSに対応した通信であるPOP3SとIMAP4Sを利用できるように設定の変更を行っていきます。設定変更についての前提条件は以下の通りになります。

dovecot設定変更の前提条件

  • POP3とIMAP4両方でSSL/TLS通信を行うように設定
  • SSLを利用しないPOP3とIMAP4については無効化
  • POP3/IMAP4接続時のパスワードは平文で行う
  • SSL/TLSによって通信全体が暗号化されるため平文でもセキュア

その他は以前の記事と同じ条件になります。この前提条件に合わせて、dovecotの設定を行っていきます。

7-1. 10-ssl.confファイルの変更

dovecotの詳細な設定に関する設定ファイルは”/etc/dovecot/conf.d”に配置されています。conf.dには以下のファイルが含まれています。

10-auth.conf 20-imap.conf auth-dict.conf.ext
10-director.conf 20-lmtp.conf auth-ldap.conf.ext
10-logging.conf 20-pop3.conf auth-master.conf.ext
10-mail.conf 90-acl.conf auth-passwdfile.conf.ext
10-master.conf 90-plugin.conf auth-sql.conf.ext
10-ssl.conf 90-quota.conf auth-static.conf.ext
15-lda.conf auth-checkpassword.conf.ext auth-system.conf.ext
15-mailboxes.conf auth-deny.conf.ext auth-vpopmail.conf.ext

上記のうち、SSLに関する設定ファイルは10-ssl.confになります。このファイルを変更していきます。
10-ssl.confの設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

 command
# cp -p /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.org2

バックアップの完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/dovecot/conf.d/10-ssl.conf

10-ssl.conf設定ファイルが開きます。変更ポイントは以下になります。

7-1-1. sslパラメータ

sslパラメータは受信の接続時にSSL/TLSを必要とするかの設定です。先の記事でSSL/TLSの無効化を設定しましたが、ここではSSL/TLSを利用するように変更します。

 code
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
# disable plain pop3 and imap, allowed are only pop3+TLS, pop3s, imap+TLS and imaps
# plain imap and pop3 are still allowed for local connections
ssl = no

デフォルトでは上記のように”ssl = no”と設定されています。この設定の場合、SSL/TLSが利用されません。このパラメータを以下のように変更します。

 code
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
# disable plain pop3 and imap, allowed are only pop3+TLS, pop3s, imap+TLS and imaps
# plain imap and pop3 are still allowed for local connections
ssl = required

7-1-2. ssl_certパラメータ

ssl_certパラメータはSSL/TLSの暗号化に利用するサーバー証明書を指定します。

 code
ssl_cert = </etc/pki/dovecot/certs/dovecot.pem

デフォルトではdovecotの汎用的な証明書が設定されています。この設定の場合、接続先ドメインとは異なる証明書が利用されますのでエラーが出ます。Let's Encryptで作成したドメイン用のサーバー証明書にパスを変更します。

 code
ssl_cert = </etc/letsencrypt/live/mail.testdom.com/fullchain.pem

パラメータで記載する”<”については削除しないようにします。削除すると認証に失敗します。

7-1-3. ssl_keyパラメータ

ssl_keyパラメータはサーバー証明書の秘密鍵へのパスを指定します。

 code
ssl_key = </etc/pki/dovecot/private/dovecot.pem

デフォルトではdovecotの汎用的な証明書が設定されているかと思います。この設定の場合、接続先ドメインとは異なる秘密鍵が利用されますので、エラーが出ます。Let's Encryptで作成したドメイン用の秘密鍵ファイルにパスを変更します。

 code
ssl_key = </etc/letsencrypt/live/mail.testdom.com/privkey.pem

パラメータで記載する”<”については削除しないようにします。削除すると認証に失敗します。

上記の3パラメータについて変更後、ファイルを保存します。これで10-ssl.confの編集は完了です。

7-2. 10-master.confファイルの変更

次に動作するサービス(POP3SとIMAPS)に関する設定を行います。dovecotの動作するサービスに関する設定ファイルは”/etc/dovecot/conf.d”ディレクトリの中に含まれる10-master.confになります。このファイルを変更していきます。
10-master.confの設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

 command
# cp -p /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.org2

バックアップの完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/dovecot/conf.d/10-master.conf

10-mail.conファイルが開きます。具体的は変更ポイントは以下になります。

7-2-1. IMAPの無効化とIMAPSの有効化

IMAPの無効化とIMAPSの有効化を行うため、以下のディレクティブを変更します。

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

デフォルトでは上記のようにimapsについての記載がコメントされています。この部分について

 code
service imap-login {
inet_listener imap {
port = 0     コメントを外して変更
}
inet_listener imaps {
port = 993    コメントを外す
ssl = yes     コメントを外す
}

に変更します。

7-2-2. POP3の無効化とPOP3Sの有効化

POP3の無効化とPOP3Sの有効化を行うため、以下のディレクティブを変更します。

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

デフォルトでは上記のようにpop3sについての記載がコメントされています。この部分について

 code
service pop3-login {
inet_listener pop3 {
port = 0     コメントを外して変更
}
inet_listener pop3s {
port = 995     コメントを外す
ssl = yes     コメントを外す
}
}

に変更します。
変更後にファイルを保存します。これで10-master.confの変更は完了です。

7-3. dovecotの設定チェック

dovecotには設定チェック用としてコマンド”doveconf”が用意されています。デフォルトのパラメータとは異なる設定のみを明示的に表示する”-n”オプションを付与します。以下のように実行します。

 command
# doveconf -n
# 2.2.10: /etc/dovecot/dovecot.conf
# OS: Linux 3.10.0-862.14.4.el7.x86_64 x86_64 CentOS Linux release 7.5.1804 (Core)
auth_mechanisms = plain login
disable_plaintext_auth = no
first_valid_uid = 1000
mail_location = maildir:~/Maildir
mbox_write_locks = fcntl
namespace inbox {
inbox = yes
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
passdb {
driver = pam
}
protocols = imap pop3
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0666
user = postfix
}
}
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 0
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.testdom.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.testdom.com/privkey.pem
userdb {
driver = passwd
}

出力結果を確認して、設定を変更した内容が正常に反映されていることを確認します。間違いや不足があった場合には、修正を行います。これでdovecotの設定確認は完了です。

7-4. dovecot 設定の反映

dovecot用設定ファイルの変更が完了しましたので、変更した設定を反映するためにdovecotを再起動します。systemctlコマンドを以下のように実行します。

 command
# systemctl restart dovecot

エラーが無ければ、正常に再起動は実行されています。再起動後にdovecotのステータスを確認します。

 command
$ systemctl status dovecot
 dovecot.service - Dovecot IMAP/POP3 email server
Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
Active: active (running) since 木 2018-10-18 19:14:39 JST; 4 days ago
Process: 32189 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
Main PID: 32195 (dovecot)
CGroup: /system.slice/dovecot.service
tq32195 /usr/sbin/dovecot -F
tq32197 dovecot/anvil
mq32198 dovecot/log

表示された上記のステータスから、dovecotが正常に起動していることが確認できました。
dovecotの再起動後にPOP3S用の995番ポートとIMAPS用の993番ポートがオープンしていることを確認します。”netstat”コマンドを実行します。

 command
$ netstat -nat
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

netstatの結果から995番ポートと993番ポートがLISTENしていることが確認できました。これでdovecotの設定は完了です。

8. メール送受信用のファイアウォールへ接続許可設定

Postfixとdovecotの設定が完了しましたので、外部から接続できるように、SMTPSの接続ポートである465番とPOP3Sの接続ポートである995番ポート、IMAPSの接続ポート993番ポートについて接続許可を行います。尚、ファイアウォールはCentOSのデフォルトであるfirewall-cmdを利用している前提となります。

8-1. 現状のファイアウォール設定を確認

先ず、現状の設定を確認していきます。本記事ではSMTPS、POP3S、IMAPSについて、全てのネットワークから接続を許可するように設定します。インターフェイスに適用されているゾーン、”public”ゾーンの設定を確認します。

 command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client pop3 imap smtp smtp-submission http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

8-2. SMTPS/POP3S/IMAPSサービスの接続許可を追加

”public”ゾーンの接続許可サービスにSMTPS、POP3S、IMAPSを追加します。追加は以下のように行います。

 command
# firewall-cmd --add-service={smtps,imaps,pop3s} --permanent
success

「success」と表示されれば設定は完了です。設定を反映するためにファイアウォールの設定をリロードします。

 command
# firewall-cmd --reload
success

「success」と表示されれば設定のリロードは完了です。

8-3. SMTPS/POP3S/IMAPS接続ポートの追加確認

設定した内容が正常に反映されているかを確認します。確認は以下のように行います。

 command
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client pop3 imap smtp smtp-submission http https imaps smtps pop3s
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

"services"の項目にsmtps、pop3s、imapsが追加されていることが確認できれば、設定は完了です。

9. メールクライアントからの動作確認

次は外部からメールの送受信を行い、メールの送受信ができることを確認します。メールクライアントとしてthunderbirdを利用しました。

9-1. メールクライアントの設定と送受信テスト(SMTPSとPOP3S)

メールクライアントであるthunderbirdにメールアカウントを設定します。手動設定で以下のように設定してしました。
設定値は実際の環境に合わせて変更してください。

mail-postfi03-9-1-1

正常に設定ができると、画面のようにアカウントが追加されます。

mail-postfi03-9-1-2

メールアカウントが追加されましたので、外部からメールを配信してみます。メールログは以下のように出力されました。

 log
Oct 25 12:31:37 smtp postfix/smtpd[21316]: connect from ***********.com[134.48.34.133]
Oct 25 12:31:37 smtp postfix/smtpd[21316]: Anonymous TLS connection established from ***********.com[134.48.34.133]: TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)
Oct 25 12:31:37 smtp postfix/smtpd[21316]: E9A0C121989: client=**********.com[134.48.34.133]
Oct 25 12:31:37 smtp postfix/cleanup[21324]: E9A0C121989: message-id=<OSBPR01MB1733F3A77E38A6CEF36C5B35B1F70@OSBPR01MB1733.**********.com>
Oct 25 12:31:37 smtp postfix/qmgr[18865]: E9A0C121989: from=<sup@remsys.co.jp>, size=6262, nrcpt=1 (queue active)
Oct 25 12:31:37 smtp postfix/local[21325]: E9A0C121989: to=<testuser01@testdom.com>, relay=local, delay=0.02, delays=0.02/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Oct 25 12:31:37 smtp postfix/qmgr[18865]: E9A0C121989: removed
Oct 25 12:31:37 smtp postfix/smtpd[21316]: disconnect from **********.com[134.48.34.133]

外部のIPからtestuser01@testdom.comに対してメールが配送されたことが確認できます。
テスト用のメールが配送されているかを確認するため、POP3Sでメールの受信を行います。

mail-postfi03-9-1-3

上記のように配送されたテスト用のメールが受信できました。
メールサーバー側に出力されているログは以下のようになります。

 log
Oct 25 12:32:15 smtp dovecot: pop3-login: Login: user=, method=PLAIN, rip=110.21.5.10, lip=110.20.3.145, mpid=21329, TLS, session=<27bGPwV52QBuBRSd>
Oct 25 12:32:15 smtp dovecot: pop3(testuser01): Disconnected: Logged out top=0/0, retr=2/12827, del=0/2, size=12793

接続時にTLSと出力されていることから、SSL/TLSによるメール受信を行っていることが、ログからも確認できます。
続いて、SMTPSを利用してメールを外部にリレー配送してみます。配送先は弊社のテストアカウントです。

mail-postfi03-9-1-4

正常に認証を通過して配送ができました。配送時のメールログは以下になります。

 log
Oct 25 12:36:29 smtp postfix/smtpd[21385]: connect from ******************[110.21.5.10]
Oct 25 12:36:29 smtp postfix/smtpd[21385]: Anonymous TLS connection established from [110.21.5.10]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
Oct 25 12:36:29 smtp postfix/smtpd[21385]: C7D7F120649: client=******************[110.21.5.10], sasl_method=PLAIN, sasl_username=testuser01
Oct 25 12:36:29 smtp postfix/cleanup[21387]: C7D7F120649: message-id=<5169f30c-8467-58c7-07a6-a4da95fe1a62@testdom.com>
Oct 25 12:36:29 smtp postfix/qmgr[18865]: C7D7F120649: from=<testuser01@testdom.com>, size=753, nrcpt=1 (queue active)
Oct 25 12:36:30 smtp postfix/smtpd[21385]: disconnect from ******************[110.21.5.10]
Oct 25 12:36:32 smtp postfix/smtp[21388]: C7D7F120649: to=<sup@remsys.co.jp>, relay=***********.com[23.123.119.158]:25, delay=2.8, delays=0.08/0/0.31/2.4, dsn=2.6.0, status=sent (250 2.6.0 <5169f30c-8467-58c7-07a6-a4da95fe1a62@testdom.com> [InternalId=4316442136732, Hostname=************.com] 8313 bytes in 0.217, 37.321 KB/sec Queued mail for delivery)

メールログからもSSL/TLSを利用して接続後、SMTP認証を通過してメールがリレー配送されたことを確認できます。
受信されたメールヘッダーのReceivedにも以下のようにTLS/SSLに関する記載が出力されています。

 log
(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))

※Postfixの設定パラメーター”smtpd_tls_received_header = yes”を設定しているので、暗号化プロトコルとアルゴリズムがヘッダーに出力されています。

9-2. メールクライアントの設定(SMTPSとIMAPS)

メールクライアントであるthunderbirdにメールアカウントを設定します。今回はIMAPSで接続するためのアカウントを設定します。手動設定で以下のように設定してしました。設定値は実際の環境に合わせて変更してください。

mail-postfi03-9-2-1

正常に設定ができると、画面のようにアカウントが追加されます。

mail-postfi03-9-2-2

imapsを利用してメールの受信を行ってみます。

mail-postfi03-9-2-3

メールログは以下のよう出力されています。

 log
Oct 25 12:38:59 smtp dovecot: imap-login: Login: user=, method=PLAIN, rip=110.21.5.10, lip=110.20.3.145, mpid=21397, TLS, session=<++fdVwV5FQBuBRSd>
Oct 25 12:38:59 smtp dovecot: imap(testuser01): Disconnected: Logged out in=8 out=395
Oct 25 12:39:35 smtp dovecot: imap-login: Login: user=, method=PLAIN, rip=110.21.5.10, lip=110.20.3.145, mpid=21400, TLS, session=<1j0DWgV5TABuBRSd>

上記のようにログからもSSL/TLSを利用してimaps接続できていることが確認できました。
これでimapsでの確認は完了です。

10. まとめ

今回の記事では、メールサーバーの接続環境をセキュアにするために接続するプロトコル全てをSSL/TLSに対応させる設定を行いました。平文での認証情報のやり取りも暗号化されますので、かなり安全な環境になりました。SSL/TLS通信に利用する証明書についてもLet's Encryptを利用していることから、コスト面でも安価に運用を行うことができます。
メールはトラブルシューティングが難しいところがありますが、今回の記事のように、自身で環境を構築してログの確認などを含めて運用してみると、勘どころが分かってきます。是非、スキルアップのためにも、メールサーバーを構築してみて下さい。

  • この記事を書いた人
rem-profile-photo

レムシステム

レムシステムはPC・サーバー・ネットワークでの業務効率化を主な業務としている会社です。全国に対応しています。

-CentOS, Dovecot, Postfix
-