CentOS7

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

メールの送受信を行う場合、ユーザー名、パスワードやメール本文が盗み見される恐れがあるため、メールサーバー間の通信内容を暗号化する。

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

【Certbotの特徴】

01.png

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

[root@localhost ~]# cd /usr/local/ ← ディレクトリ移動
[root@localhost local]# git clone https://github.com/certbot/certbot ← Certbotクライアントダウンロード
[root@localhost local]# cd ← ディレクトリ移動
[root@localhost ~]# /usr/local/certbot/certbot-auto --help ← Certbotクライアントインストール

サーバー証明書取得

Certbotではサーバー名の認証をWeb経由で行うため、サーバー証明書に指定するサーバー名で外部からWebアクセスできるようにしておく必要がある。

メールサーバー上にWebサーバーも稼動している場合

[root@localhost ~]# vi /etc/httpd/conf.d/virtualhost-hoge.com.conf ← バーチャルホスト設定ファイル作成
メールサーバー名(例:mail.hoge.com)でWebサーバー(例:hoge.com)へアクセスできるようにする
<VirtualHost *:80>
ServerName hoge.com ← Webサーバー名
ServerAlias mail.hoge.com ← メールサーバー名
DocumentRoot /var/www/html/hoge ← ドキュメントルート
</VirtualHost>
[root@localhost ~]# systemctl reload httpd
[root@localhost ~]# /usr/local/certbot/certbot-auto certonly --webroot -w ドキュメントルート -m メールアドレス -d メールサーバー名 --agree-tos ← サーバー証明書取得
--パラメータ指定例--
ドキュメントルート⇒/var/www/html/hoge/
メールアドレス⇒任意のメールアドレス
メールサーバー名⇒mail.hoge.com

メールサーバー上にWebサーバーが稼動していない場合

ルーター側の設定でポート80番と443番をOPENする。

[root@localhost ~]# /usr/local/certbot/certbot-auto certonly -a standalone -m メールアドレス -d メールサーバー名 --agree-tos
&color(lime){--パラメータ指定例--
メールアドレス⇒任意のメールアドレス
メールサーバー名⇒mail.hoge.com

Postfix設定

[root@localhost ~]# vi /etc/postfix/main.cf ← Postfix設定ファイル編集
下記を追加
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.hoge.com/fullchain.pem ← サーバー証明書+中間証明書を指定
smtpd_tls_key_file = /etc/letsencrypt/live/mail.hoge.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: \n +kECDH+SHA:kRSA:+kRSA+SHA:+kRSA+CAMELLIA:!aNULL:!eNULL: \n !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@localhost ~]# vi /etc/postfix/master.cf ← postfix設定ファイル(master.cf)編集
#submission inet n - n - - smtpd ← 行頭に#を追加してコメントアウト(SUBMISSIONポート無効化)
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes ← 行頭に#を追加してコメントアウト(SUBMISSIONポートでSMTP認証無効化)

smtps inet n - n - - smtpd ← 行頭の#を削除してコメント解除(SMTPS有効化)
-o smtpd_tls_wrappermode=yes ← 行頭の#を削除してコメント解除(SMTPS有効化)
-o smtpd_sasl_auth_enable=yes ← 行頭の#を削除してコメント解除(SMTPS有効化)

tlsmgr unix - - n 300 1 tlsmgr ← 行頭の#を削除してコメント解除(SMTPS有効化)

Postfix再起動

Postfix再起動

[root@localhost ~]# systemctl restart postfix ← Postfix再起動

TCP465番ポート開放

【ルーター】

ルーター側の設定で、TCP465番ポートへのアクセスをサーバーに転送するようにする。

【ファイアウォール】

サーバー側のファイアウォール設定で、TCP465番ポートへのアクセスを許可するようにする。

Portチェックテスト【外部からのPort開放確認】で「ホスト名(FQDN) または グローバルIPアドレス」にサーバー名(例:mail.hoge.com)、「チェックポート番号」に465と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、

と表示されることを確認。

TCP587番ポート閉塞

【ルーター】

ルーター側の設定で、TCP587番ポートへのアクセスをサーバーに転送しないようにする。

【ファイアウォール】

サーバー側のファイアウォール設定で、TCP587番ポートへのアクセスを禁止するようにする(アクセス許可設定を削除する)。

Portチェックテスト【外部からのPort開放確認】で「ホスト名(FQDN) または グローバルIPアドレス」にサーバー名(例:mail.hoge.com)、「チェックポート番号」に587と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、

と表示されることを確認。

Dovecot設定

[root@localhost ~]# 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.hoge.com/fullchain.pem ← サーバー証明書+中間証明書を指定
ssl_key = </etc/letsencrypt/live/mail.hoge.com/privkey.pem ← 秘密鍵を指定

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

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

Dovecot再起動

Dovecot再起動

[root@localhost ~]# systemctl restart dovecot ← Dovecot起動

TCP995番(POPの場合)またはTCP993番(IMAPの場合)ポート開放

【ルーター】

ルーター側の設定で、TCP995番(POPの場合)またはTCP993番(IMAPの場合)ポートへのアクセスをサーバーに転送するようにする。

【ファイアウォール】

サーバー側のファイアウォール設定で、TCP995番(POPの場合)またはTCP993番(IMAPの場合)ポートへのアクセスを許可するようにする。

Portチェックテスト【外部からのPort開放確認】で「ホスト名(FQDN) または グローバルIPアドレス」にサーバー名(例:hoge.com)、「チェックポート番号」に995または993と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、

と表示されることを確認。

Postfix、Dovecot確認

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

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

Certbotのサーバー証明書の有効期間は3ヶ月のため、毎月自動でサーバー証明書を更新するようにする。

[root@localhost ~]# 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}

添付ファイル: file01.png 65件 [詳細]

トップ   編集 凍結解除 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-10-28 (月) 22:38:41