メールの送受信を行う場合、ユーザー名、パスワードやメール本文が盗み見される恐れがあるため、メールサーバー間の通信内容を暗号化する。
また、メールサーバーとの通信内容を暗号化するには、サーバー証明書を発行する必要があるが、自作したサーバー証明書ではクライアントが通信を行うたび(メールソフト起動毎)にセキュリティの警告が表示されてしまう。対処としては、有料のサーバー証明書を発行するか、自作サーバー証明書を発行して各クライアントにインポートすればよいが、有料のサーバー証明書は高額かつ年単位に継続して費用がかかる、自作サーバー証明書のインポートは不特定多数のすべての利用者に対してサーバー証明書をインポートさせるのは現実的ではないことから、ここでは、Certbotの無料サーバー証明書を導入し、無料でセキュリティの警告が表示されずに暗号化通信が行えるようにする。
【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アクセスできるようにしておく必要がある。
[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 |
ルーター側の設定でポート80番と443番をOPENする。
[root@localhost ~]# /usr/local/certbot/certbot-auto certonly -a standalone -m メールアドレス -d メールサーバー名 --agree-tos |
&color(lime){--パラメータ指定例-- メールアドレス⇒任意のメールアドレス メールサーバー名⇒mail.hoge.com |
[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有効化) |
[root@localhost ~]# systemctl restart postfix ← Postfix再起動 |
【ルーター】
ルーター側の設定で、TCP465番ポートへのアクセスをサーバーに転送するようにする。
【ファイアウォール】
サーバー側のファイアウォール設定で、TCP465番ポートへのアクセスを許可するようにする。
Portチェックテスト【外部からのPort開放確認】で「ホスト名(FQDN) または グローバルIPアドレス」にサーバー名(例:mail.hoge.com)、「チェックポート番号」に465と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、
と表示されることを確認。
【ルーター】
ルーター側の設定で、TCP587番ポートへのアクセスをサーバーに転送しないようにする。
【ファイアウォール】
サーバー側のファイアウォール設定で、TCP587番ポートへのアクセスを禁止するようにする(アクセス許可設定を削除する)。
Portチェックテスト【外部からのPort開放確認】で「ホスト名(FQDN) または グローバルIPアドレス」にサーバー名(例:mail.hoge.com)、「チェックポート番号」に587と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、
と表示されることを確認。
[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 ← 使用する暗号化方法を指定(脆弱性のある暗号化方法を除外) |
[root@localhost ~]# systemctl restart dovecot ← Dovecot起動 |
【ルーター】
ルーター側の設定で、TCP995番(POPの場合)またはTCP993番(IMAPの場合)ポートへのアクセスをサーバーに転送するようにする。
【ファイアウォール】
サーバー側のファイアウォール設定で、TCP995番(POPの場合)またはTCP993番(IMAPの場合)ポートへのアクセスを許可するようにする。
Portチェックテスト【外部からのPort開放確認】で「ホスト名(FQDN) または グローバルIPアドレス」にサーバー名(例:hoge.com)、「チェックポート番号」に995または993と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、
と表示されることを確認。
メールソフトでメール送受信してセキュリティの警告が表示されないこと
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}