メールサーバー間通信内容暗号化(Postfix+Dovecot+OpenSSL+Certbot)

最終更新日: 2017.03.14

<<トップページ <<新着情報 <<逆引き集 <<リンク集 <<サイト内検索 <<メルマガ <<Scientific Linuxで自宅サーバー構築 <<Fedoraで自宅サーバー構築

■概要

メールの送受信を行う場合、ユーザー名、パスワードやメール本文が盗み見される恐れがあるため、メールサーバー間の通信内容を暗号化する。
また、メールサーバーとの通信内容を暗号化するには、サーバー証明書を発行する必要があるが、自作したサーバー証明書ではクライアントが通信を行うたび(メールソフト起動毎)にセキュリティの警告が表示されてしまう。対処としては、有料のサーバー証明書を発行するか、自作サーバー証明書を発行して各クライアントにインポートすればよいが、有料のサーバー証明書は高額かつ年単位に継続して費用がかかる、自作サーバー証明書のインポートは不特定多数のすべての利用者に対してサーバー証明書をインポートさせるのは現実的ではないことから、ここでは、Certbotの無料サーバー証明書を導入し、無料でセキュリティの警告が表示されずに暗号化通信が行えるようにする。

【Certbotの特徴】
・サーバー証明書を無料で発行できる
・サーバー証明書の取得がコマンドのみで行える(Web経由、メール経由等での煩わしい手続き等がない)
・サーバー証明書の更新がコマンドのみで行える(維持=サーバー証明書の更新/差し替えを完全自動化)

メールサーバー構築済であること



■Certbotクライアントインストール

【CentOS7の場合】
[root@centos ~]# cd /usr/local/ ← ディレクトリ移動

[root@centos local]# git clone https://github.com/certbot/certbot ← Certbotクライアントダウンロード

[root@centos local]# cd ← ディレクトリ移動

[root@centos ~]# /usr/local/certbot/certbot-auto --help ← Certbotクライアントインストール

【CentOS6の場合】
[root@centos ~]# yum -y install epel-release ← EPELリポジトリインストール

[root@centos ~]# cd /usr/local/ ← ディレクトリ移動

[root@centos local]# git clone https://github.com/certbot/certbot ← Certbotクライアントダウンロード

[root@centos local]# cd ← ディレクトリ移動

[root@centos ~]# /usr/local/certbot/certbot-auto -n ← Certbotクライアントインストール

■サーバー証明書取得

Certbotではサーバー名の認証をWeb経由で行うため、サーバー証明書に指定するサーバー名で外部からWebアクセスできるようにしておく必要がある。
Webサーバーが稼動している場合は、メールサーバー名でWebサーバーへアクセスできるようにする。⇒(1)
Webサーバーが稼動していない場合は、サーバー証明書取得時にCertbotが一時的にWebサーバーとして稼動して認証を行うため、TCP80番と443番ポートをOPENする。⇒(2)

(1)メールサーバー上にWebサーバーも稼動している場合
[root@centos ~]# vi /etc/httpd/conf.d/virtualhost-centossrv.com.conf ← バーチャルホスト設定ファイル作成
メールサーバー名(例:mail.centossrv.com)でWebサーバー(例:centossrv.com)へアクセスできるようにする
<VirtualHost *:80>
    ServerName centossrv.com ← Webサーバー名
    ServerAlias mail.centossrv.com ← メールサーバー名
    DocumentRoot /var/www/html/centos ← ドキュメントルート
</VirtualHost>

[root@centos ~]# systemctl reload httpd ← Apache設定反映※CentOS7の場合
[root@centos ~]# /etc/rc.d/init.d/httpd reload ← Apache設定反映※CentOS6,5の場合

[root@centos ~]# /usr/local/certbot/certbot-auto certonly --webroot -w ドキュメントルート -m メールアドレス -d メールサーバー名 --agree-tos
 ← サーバー証明書取得


−−パラメータ指定例−−
ドキュメントルート⇒/var/www/html/centos/
メールアドレス⇒任意のメールアドレス
メールサーバー名⇒mail.centossrv.com


(2)メールサーバー上にWebサーバーが稼動していない場合
ルーター側の設定でポート80番と443番をOPENする。
※ルーターの設定は各ルーターのマニュアルまたはメーカー別ルーターポート開放手順を参照


[root@centos ~]# /usr/local/certbot/certbot-auto certonly -a standalone -m メールアドレス -d メールサーバー名 --agree-tos


−−パラメータ指定例−−
メールアドレス⇒任意のメールアドレス
メールサーバー名⇒mail.centossrv.com


■Postfix設定

[root@centos ~]# vi /etc/postfix/main.cf ← Postfix設定ファイル編集
下記を追加
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.centossrv.com/fullchain.pem ← サーバー証明書+中間証明書を指定
smtpd_tls_key_file = /etc/letsencrypt/live/mail.centossrv.com/privkey.pem ← 秘密鍵を指定
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
下記を追加※使用する暗号化方法を指定(脆弱性のある暗号化方法を除外)
tls_high_cipherlist = kEECDH:+kEECDH+SHA:kEDH:+kEDH+SHA:+kEDH+CAMELLIA:kECDH:+kECDH+SHA:kRSA:+kRSA+SHA:+kRSA+CAMELLIA:!aNULL:!eNULL:!SSLv2:!RC4:!MD5:!DES:!EXP:!SEED:!IDEA:!3DES
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_ciphers = high
下記を追加※脆弱性のある暗号化方式(SSLv2,SSLv3)を無効化
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtp_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_protocols=!SSLv2,!SSLv3
smtp_tls_protocols=!SSLv2,!SSLv3

[root@centos ~]# vi /etc/postfix/master.cf ← postfix設定ファイル(master.cf)編集
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
#smtps     inet  n       -       n       -       -       smtpd ← 行頭の#を削除(コメント解除)
#  -o smtpd_tls_wrappermode=yes ← 行頭の#を削除(コメント解除)
#  -o smtpd_sasl_auth_enable=yes ← 行頭の#を削除(コメント解除)
↓
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

#tlsmgr    unix  -       -       n       300     1       tlsmgr ← 行頭の#を削除
↓
tlsmgr    unix  -       -       n       300     1       tlsmgr

■Postfix再起動

(1)Postfix再起動
[root@centos ~]# systemctl restart postfix ← Postfix再起動※CentOS7の場合
[root@centos ~]# /etc/rc.d/init.d/postfix restart ← Postfix再起動※CentOS6,5の場合

(2)ポート465番のOPEN
ルーター側の設定でポート465番をOPENする。
※ルーターの設・閧ヘ各ルーターのマニュアルまたはメーカー別ルーターポート開放手順を参照

ポートチェック【外部からポート開放確認】で「host名」にサーバー名(例:mail.centossrv.com)、「port番号」に465と入力して「ポートチェック」ボタン押下し、「ホスト=mail.centossrv.com ポート=465 にアクセスできました。」と表示されることを確認。

■Dovecot設定

【CentOS7,6の場合】
[root@centos certs]# vi /etc/dovecot/conf.d/10-ssl.conf ← Dovecot設定ファイル編集
# SSL/TLS support: yes, no, required. 
#ssl = yes
ssl = yes ← TLS通信の有効化

# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
ssl_cert = </etc/letsencrypt/live/mail.centossrv.com/fullchain.pem ← サーバー証明書+中間証明書を指定
ssl_key = </etc/letsencrypt/live/mail.centossrv.com/privkey.pem ← 秘密鍵を指定

# SSL ciphers to use
#ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
ssl_cipher_list = EECDH+AESGCM+AES128:EECDH+AESGCM+AES256:EDH+AESGCM+AES128:EDH+AESGCM+AES256:EECDH+SHA256+AES128:EECDH+SHA384+AES256:EDH+SHA256+AES128:EDH+SHA256+AES256:EECDH+SHA1+AES128:EECDH+SHA1+AES256:EDH+SHA1+AES128:EDH+SHA1+AES256:EECDH+HIGH:EDH+HIGH:AESGCM+AES128:AESGCM+AES256:SHA256+AES128:SHA256+AES256:SHA1+AES128:SHA1+AES256:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!3DES ← 使用する暗号化方法を指定(脆弱性のある暗号化方法を除外)

# SSL protocols to use
#ssl_protocols = !SSLv2
ssl_protocols = !SSLv2 !SSLv3 ← 脆弱性のある暗号化方式(SSLv2,SSLv3)を無効化

【CentOS5の場合】
[root@centos ~]# vi /etc/dovecot.conf ← Dovecot設定ファイル編集
# Disable SSL/TLS support.
ssl_disable = no ← TLS通信無効を解除

# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
ssl_cert = </etc/letsencrypt/live/centossrv.com/fullchain.pem ← サーバー証明書+中間証明書を指定
ssl_key = </etc/letsencrypt/live/centossrv.com/privkey.pem ← 秘密鍵を指定

# SSL ciphers to use
#ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
ssl_cipher_list = EECDH+AESGCM+AES128:EECDH+AESGCM+AES256:EDH+AESGCM+AES128:EDH+AESGCM+AES256:EECDH+SHA256+AES128:EECDH+SHA384+AES256:EDH+SHA256+AES128:EDH+SHA256+AES256:EECDH+SHA1+AES128:EECDH+SHA1+AES256:EDH+SHA1+AES128:EDH+SHA1+AES256:EECDH+HIGH:EDH+HIGH:AESGCM+AES128:AESGCM+AES256:SHA256+AES128:SHA256+AES256:SHA1+AES128:SHA1+AES256:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!3DES ← 使用する暗号化方法を指定(脆弱性のある暗号化方法を除外)

# SSL protocols to use
#ssl_protocols = !SSLv2
ssl_protocols = !SSLv2 !SSLv3 ← 脆弱性のある暗号化方式(SSLv2,SSLv3)を無効化

■Dovecot再起動

(1)Dovecot再起動
[root@centos ~]# systemctl restart dovecot ← Dovecot起動※CentOS7の場合
[root@centos ~]# /etc/rc.d/init.d/dovecot restart ← Dovecot再起動※CentOS6,5の場合

(2)ポート995番(POPの場合)または993番(IMAPの場合)のOPEN
ルーター側の設定でポート995番(POPの場合)または993番(IMAPの場合)をOPENする。
※ルーターの設定は各ルーターのマニュアルまたはメーカー別ルーターポート開放手順を参照

ポートチェック【外部からポート開放確認】で「host名」にサーバー名(例:mail.centossrv.com)、「port番号」に995(POPの場合)または993(IMAPの場合)と入力して「ポートチェック」ボタン押下し、「ホスト=mail.centossrv.com ポート=995(POPの場合)または993(IMAPの場合) にアクセスできました。」と表示されることを確認。

■メールソフト設定(受信メールサーバーをPOPにする場合)

自宅や会社等の複数拠点でメールを使用する場合で、メールボックスを同期しなくてもいい場合(例:会社で受信したメールは自宅で受信できなくてもいい場合)、受信メールサーバーにPOPを使用する。
ここでは、メールソフトとしてWindows Live メールを使用する。

Windows Live メールを起動し、メニューの「アカウント」⇒「プロパティ」でメール設定を行う



「詳細設定」タブ
「このサーバーはセキュリティで保護された接続(SSL)が必要」を送信メール側、受信メール側ともにチェック
「送信メール(SMTP)」のポート番号を465に変更

■メールソフト設定(受信メールサーバーをIMAPにする場合)

自宅や会社等の複数拠点でメールを使用する場合で、メールボックスを同期したい場合(例:会社で受信したメールを自宅でも受信したい場合)、受信メールサーバーにIMAPを使用する。
ここでは、メールソフトとしてWindows Live メールを使用する。

Windows Live メールを起動し、メニューの「アカウント」⇒「プロパティ」でメール設定を行う




「詳細設定」タブ
「このサーバーはセキュリティで保護された接続(SSL)が必要」を送信メール側、受信メール側ともにチェック
「送信メール(SMTP)」のポート番号を465に変更

■Postfix、Dovecot確認

メールソフトでメール送受信してセキュリティの警告が表示されないこと

■サーバー証明書自動更新設定

Certbotのサーバー証明書の有効期間は3ヶ月のため、毎月自動でサーバー証明書を更新するようにする。
[root@centos ~]# vi /etc/cron.monthly/certbot ← サーバー証明書自動更新スクリプト作成
#!/bin/sh
log=`mktemp`
code=0

#
# 証明書更新
#
for conf in `ls /etc/letsencrypt/renewal/`
do
    # ドメイン名取得
    domain=`echo ${conf}|sed -e 's/\([^ ]*\)\.conf/\1/p' -e d`

    # 認証方式取得
    authenticator=`grep authenticator /etc/letsencrypt/renewal/${conf}|awk '{print $3}'`

    if [ ${authenticator} = 'webroot' ]; then
        # Web認証の場合

        # ドキュメントルート取得
        webroot=`grep -A 1 webroot_map  /etc/letsencrypt/renewal/${conf}|grep =|awk '{print $3}'`

        # 証明書更新
        /usr/local/certbot/certbot-auto certonly --webroot \
        -w ${webroot} -d ${domain} --renew-by-default >> ${log} 2>&1
        [ $? -ne 0 ] && cat ${log}
    else
        # スタンドアロン認証の場合

        # 証明書更新
        lsof -i:80 > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo 'Webサーバー稼働中のためスタンドアロン認証不可'
        else
            /usr/local/certbot/certbot-auto certonly -a standalone \
            -d ${domain} --renew-by-default >> ${log} 2>&1
            [ $? -ne 0 ] && cat ${log}
        fi
    fi
done

#
# 証明書更新反映
#

# Webサーバー設定再読込み
lsof -i:443 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    rpm -q systemd > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        systemctl reload httpd
    else
        /etc/rc.d/init.d/httpd reload > /dev/null 2>&1
    fi
fi

# SMTPサーバー設定再読込み
lsof -i:465 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    rpm -q systemd > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        systemctl reload postfix
    else
        /etc/rc.d/init.d/postfix reload > /dev/null 2>&1
    fi
fi

# IMAPサーバー設定再読込み
lsof -i:995 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    rpm -q systemd > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        systemctl reload dovecot
    else
        /etc/rc.d/init.d/dovecot reload > /dev/null 2>&1
    fi
fi

#
# ログをsyslogへ出力後削除
#
cat ${log}|logger -t `basename ${0}` ; rm -f ${log}

[root@centos ~]# chmod +x /etc/cron.monthly/certbot ← サーバー証明書自動更新スクリプトへ実行権限付加



▲このページのトップへ戻る

LPIロゴ Copyright© 2005-2017 fallenangels, All rights reserved.
ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします