CentOSでメールサーバーを構築。Let’s EncryptでSSL/TLSを設定して安全な通信を行う。(メールサーバー構築 3)

2018/11/01 CentOS, Dovecot, Postfix, サーバー構築

mail-postfix03-top2
前回の記事ではメールサーバーとしての基本的な機能である送信(SMTP)と受信(POP3/IMAP)を行うことが出来るように設定を行いました。
その状態でも運用には問題ありませんが、セキュリティ面で更に強固にするために構築したメールサーバーのサービスでSSL/TLSを利用できるように設定します。
SSL/TLSを利用することで平文でやり取りされていた認証情報(SMTP認証や受信時の情報)やメールの内容が暗号化されますので、万が一、ネットワークの盗聴などがあった場合でも認証情報やメールの内容などを覗き見ることは出来ません。

スポンサーリンク

SSL/TLSを設定した場合の構成は以下の図のようになります。
SMTPS-img1

  1. 送信・受信共にSSL/TLSによって暗号化されます。
  2. 送信先のメールサーバーについてはSSL/TLSに対応している場合、送受信が暗号化されます。

SSL/TLSを利用する場合、少し前だと有償のサーバー証明書を利用する必要がありましたが、最近ではLet’s Encryptというサーバー証明書を無償で発行するための有志のコミュニティが作成したプロジェクトがあります。このLet’s Encryptを利用してメールのSSL/TLS対応を設定していきます。是非、設定してみて下さい。
※Postfixとdovecotでは通信の暗号化に、トランスポート層セキュリティ (Transport Layer Security/TLS)を利用しています。TLSはSSLの次世代規格で厳密には異なる技術(SSLを引継いだのがTLS)ですが、共に通信をセキュアにするための技術のため、本記事ではSSL/TLSと記載しています。

目次

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

メールサーバーの通信をSSL/TLSで暗号化するためには、サーバー証明書が必要になります。
本記事では無償のサーバー証明書を発行できる”Let’s Encrypt”を利用します。Let’s Encryptを利用するためにはホスト名(FQDN:ホスト名にドメイン名がついたもの、以下ホスト名と記載がある時はFQDN)が正引き(ホスト名からIPアドレスを参照)できる必要があります。
本環境では、ホスト名として以前の記事で設定されている”mail.testdom.com”を利用する前提としています。こちらはAレコードとしてDNSにIPアドレスを登録していますので、ホスト名の正引きができる状態になっています。(逆引きは必須ではありませんが、設定されていると迷惑メールと判定されにくくなります。)
Let’s Encryptを利用する前に、ホスト名の正引きができることを確認します。
※ホスト名の正引き設定は、ご利用のDNSサーバーやドメイン管理業者によって手順が異なるため、本記事では割愛しています。

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

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

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

指定したホスト名に対して、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”ゾーンの設定を確認します。

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

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

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

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

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

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

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

”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レポジトリがインストールされていることを確認します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

上記のように”certbot””python2-certbot”が表示されればパッケージはインストールされています。

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

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

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

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

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

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

上記のように”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コマンドを以下のように実行します。

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

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

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

5.PostfixのSSL/TLS設定

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

  • SMTPSでSSL/TLS通信を行うように設定します。
  • SMTP-AUTHの認証情報は、SMTPの通信が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としています。)

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

main.cf設定ファイルが開きます。具体的は変更ポイントは以下になります。尚、変更点でコメントを付ける、外すという記載がありますが、以下のような意味合いになります。

  • コメントを外す => 行頭の”#”を削除する。
  • コメントを付ける => 行頭に”#”を付ける。

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

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

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

  • 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としています。)

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

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

スポンサーリンク

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

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

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

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

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

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

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

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

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

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

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

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

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

7.dovecotの設定

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

パラメータで記載する”<”については削除しないようにします。削除すると認証に失敗します。 上記の3パラメータについて変更後、ファイルを保存します。これで10-ssl.confの編集は完了です。

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

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

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

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

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

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

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

に変更します。

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

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

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

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

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

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

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

7-4.dovecot 設定の反映

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

メールクライアントであるthunderbirdにメールアカウントを設定します。手動設定で以下のように設定してしました。
設定値は実際の環境に合わせて変更してください。
mail-postfi03-9-1-1
正常に設定ができると、画面のようにアカウントが追加されます。
mail-postfi03-9-1-2
メールアカウントが追加されましたので、外部からメールを配信してみます。メールログは以下のように出力されました。

外部のIPからtestuser01@testdom.comに対してメールが配送されたことが確認できます。
テスト用のメールが配送されているかを確認するため、POP3Sでメールの受信を行います。
mail-postfi03-9-1-3
上記のように配送されたテスト用のメールが受信できました。
メールサーバー側に出力されているログは以下のようになります。

接続時にTLSと出力されていることから、SSL/TLSによるメール受信を行っていることが、ログからも確認できます。
続いて、SMTPSを利用してメールを外部にリレー配送してみます。配送先は弊社のテストアカウントです。
mail-postfi03-9-1-4
正常に認証を通過して配送ができました。配送時のメールログは以下になります。

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

※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
メールログは以下のよう出力されています。

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

10.まとめ

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

関連する記事


Facebookでのご購読が便利です。

Twitter・Feedlyでもご購読できます。

Twitterでフォローする Feedlyでフォローする

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  • スポンサーリンク