#author("2018-08-23T22:07:33+09:00","","") #author("2018-08-23T22:12:01+09:00","","") [[CentOS7]] *メールサーバー間通信内容暗号化(Postfix+Dovecot+OpenSSL+Certbot) [#m9cbb964] メールの送受信を行う場合、ユーザー名、パスワードやメール本文が盗み見される恐れがあるため、メールサーバー間の通信内容を暗号化する。 また、メールサーバーとの通信内容を暗号化するには、サーバー証明書を発行する必要があるが、自作したサーバー証明書ではクライアントが通信を行うたび(メールソフト起動毎)にセキュリティの警告が表示されてしまう。対処としては、有料のサーバー証明書を発行するか、自作サーバー証明書を発行して各クライアントにインポートすればよいが、有料のサーバー証明書は高額かつ年単位に継続して費用がかかる、自作サーバー証明書のインポートは不特定多数のすべての利用者に対してサーバー証明書をインポートさせるのは現実的ではないことから、ここでは、''[[Certbot>https://certbot.eff.org/]]''の無料サーバー証明書を導入し、無料でセキュリティの警告が表示されずに暗号化通信が行えるようにする。 ''【Certbotの特徴】'' -サーバー証明書を無料で発行できる -サーバー証明書の取得がコマンドのみで行える(Web経由、メール経由等での煩わしい手続き等がない) -サーバー証明書の更新がコマンドのみで行える(維持=サーバー証明書の更新/差し替えを完全自動化) &ref(01.png); *Certbotクライアントインストール [#a942b9a3] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# cd /usr/local/ &color(lime){← ディレクトリ移動};| |[root@localhost local]# git clone https://github.com/certbot/certbot &color(lime){← Certbotクライアントダウンロード};| |[root@localhost local]# cd &color(lime){← ディレクトリ移動};| |[root@localhost ~]# /usr/local/certbot/certbot-auto --help &color(lime){← Certbotクライアントインストール};| *サーバー証明書取得 [#l0ff159a] ''Certbot''ではサーバー名の認証をWeb経由で行うため、サーバー証明書に指定するサーバー名で外部からWebアクセスできるようにしておく必要がある。 -Webサーバーが稼動している場合は、メールサーバー名でWebサーバーへアクセスできるようにする。 -Webサーバーが稼動していない場合は、サーバー証明書取得時に''Certbot''が一時的にWebサーバーとして稼動して認証を行うため、''TCP80''番と''443''番ポートをOPENする。 **メールサーバー上にWebサーバーも稼動している場合 [#pe4502c2] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/httpd/conf.d/virtualhost-hoge.com.conf &color(lime){← バーチャルホスト設定ファイル作成};| |&color(lime){メールサーバー名(例:mail.hoge.com)でWebサーバー(例:hoge.com)へアクセスできるようにする}; &br; <VirtualHost *:80> &br; ServerName hoge.com &color(lime){← Webサーバー名}; &br; ServerAlias mail.hoge.com &color(lime){← メールサーバー名}; &br; DocumentRoot /var/www/html/hoge &color(lime){← ドキュメントルート}; &br; </VirtualHost>| |[root@localhost ~]# systemctl reload httpd| |[root@localhost ~]# /usr/local/certbot/certbot-auto certonly --webroot -w &color(lime){ドキュメントルート}; -m &color(lime){メールアドレス}; -d &color(lime){メールサーバー名}; --agree-tos &color(lime){← サーバー証明書取得};| |&color(lime){--パラメータ指定例-- &br; ドキュメントルート⇒/var/www/html/hoge/ &br; メールアドレス⇒任意のメールアドレス &br; メールサーバー名⇒mail.hoge.com| |&color(lime){--パラメータ指定例-- &br; ドキュメントルート⇒/var/www/html/hoge/ &br; メールアドレス⇒任意のメールアドレス &br; メールサーバー名⇒mail.hoge.com};| **メールサーバー上にWebサーバーが稼動していない場合 [#l9139322] ルーター側の設定でポート''80''番と''443''番をOPENする。 |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# /usr/local/certbot/certbot-auto certonly -a standalone -m &color(lime){メールアドレス}; -d &color(lime){メールサーバー名}; --agree-tos| |&color(lime){--パラメータ指定例-- &br; メールアドレス⇒任意のメールアドレス &br; メールサーバー名⇒mail.hoge.com| *Postfix設定 [#m3f671b7] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/postfix/main.cf &color(lime){← Postfix設定ファイル編集};| |&color(lime){下記を追加}; &br; smtp_tls_security_level = may &br; smtpd_tls_security_level = may &br; smtpd_tls_cert_file = /etc/letsencrypt/live/mail.hoge.com/fullchain.pem &color(lime){← サーバー証明書+中間証明書を指定}; &br; smtpd_tls_key_file = /etc/letsencrypt/live/mail.hoge.com/privkey.pem &color(lime){← 秘密鍵を指定}; &br; smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache &br; &color(lime){下記を追加※使用する暗号化方法を指定(脆弱性のある暗号化方法を除外)}; &br; 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 &br; smtp_tls_ciphers = high &br; smtpd_tls_ciphers = high &br; smtpd_tls_mandatory_ciphers = high &br; &color(lime){下記を追加※脆弱性のある暗号化方式(SSLv2,SSLv3)を無効化}; &br; smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3 &br; smtp_tls_mandatory_protocols=!SSLv2,!SSLv3 &br; smtpd_tls_protocols=!SSLv2,!SSLv3 &br; smtp_tls_protocols=!SSLv2,!SSLv3| |[root@localhost ~]# vi /etc/postfix/master.cf &color(lime){← postfix設定ファイル(master.cf)編集};| |&color(lime){#};submission inet n - n - - smtpd &color(lime){← 行頭に#を追加してコメントアウト(SUBMISSIONポート無効化)}; &br; # -o syslog_name=postfix/submission &br; # -o smtpd_tls_security_level=encrypt &br; &color(lime){#}; -o smtpd_sasl_auth_enable=yes &color(lime){← 行頭に#を追加してコメントアウト(SUBMISSIONポートでSMTP認証無効化)}; &br; &br; smtps inet n - n - - smtpd &color(lime){← 行頭の#を削除してコメント解除(SMTPS有効化)}; &br; -o smtpd_tls_wrappermode=yes &color(lime){← 行頭の#を削除してコメント解除(SMTPS有効化)}; &br; -o smtpd_sasl_auth_enable=yes &color(lime){← 行頭の#を削除してコメント解除(SMTPS有効化)}; &br; &br; tlsmgr unix - - n 300 1 tlsmgr &color(lime){← 行頭の#を削除してコメント解除(SMTPS有効化)};| *Postfix再起動 [#o5d5a2ea] **Postfix再起動 [#t26bb7c7] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# systemctl restart postfix &color(lime){← Postfix再起動};| **TCP465番ポート開放 [#ge74bc4a] ''【ルーター】'' ルーター側の設定で、''TCP465''番ポートへのアクセスをサーバーに転送するようにする。 ''【ファイアウォール】'' サーバー側のファイアウォール設定で、''TCP465''番ポートへのアクセスを許可するようにする。 [[Portチェックテスト【外部からのPort開放確認】>http://www.cman.jp/network/support/port.html]]で「ホスト名(''FQDN'') または グローバルIPアドレス」にサーバー名(例:mail.hoge.com)、「チェックポート番号」に''465''と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、 -ホスト:mail.hoge.com -ポート:''465'' -にアクセスできました と表示されることを確認。 **TCP587番ポート閉塞 [#sae8d378] ''【ルーター】'' ルーター側の設定で、''TCP587''番ポートへのアクセスをサーバーに転送しないようにする。 ''【ファイアウォール】'' サーバー側のファイアウォール設定で、''TCP587''番ポートへのアクセスを禁止するようにする(アクセス許可設定を削除する)。 [[Portチェックテスト【外部からのPort開放確認】>http://www.cman.jp/network/support/port.html]]で「ホスト名(''FQDN'') または グローバルIPアドレス」にサーバー名(例:mail.hoge.com)、「チェックポート番号」に''587''と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、 -ホスト:mail.hoge.com -ポート:''587'' -に到達できませんでした と表示されることを確認。 *Dovecot設定 [#ba82fc62] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/dovecot/conf.d/10-ssl.conf &color(lime){← Dovecot設定ファイル編集};| |# SSL/TLS support: yes, no, required. &br; #ssl = yes &br; ssl = yes &color(lime){← TLS通信の有効化}; &br; &br; # PEM encoded X.509 SSL/TLS certificate and private key. They're opened before &br; # dropping root privileges, so keep the key file unreadable by anyone but &br; # root. Included doc/mkcert.sh can be used to easily generate self-signed &br; # certificate, just make sure to update the domains in dovecot-openssl.cnf &br; ssl_cert = </etc/letsencrypt/live/mail.hoge.com/fullchain.pem &color(lime){← サーバー証明書+中間証明書を指定}; &br; ssl_key = </etc/letsencrypt/live/mail.hoge.com/privkey.pem &color(lime){← 秘密鍵を指定}; &br; &br; # SSL protocols to use &br; #ssl_protocols = !SSLv2 &br; ssl_protocols = !SSLv2 !SSLv3 &color(lime){← 脆弱性のある暗号化方式(SSLv2,SSLv3)を無効化}; &br; &br; # SSL ciphers to use &br; #ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL &br; 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 &color(lime){← 使用する暗号化方法を指定(脆弱性のある暗号化方法を除外)};| *Dovecot再起動 [#uc3eef65] **Dovecot再起動 [#f9bf0885] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# systemctl restart dovecot &color(lime){← Dovecot起動};| **TCP995番(POPの場合)またはTCP993番(IMAPの場合)ポート開放 [#y26cf63b] ''【ルーター】'' ルーター側の設定で、''TCP995''番(''POP''の場合)または''TCP993''番(''IMAP''の場合)ポートへのアクセスをサーバーに転送するようにする。 ''【ファイアウォール】'' サーバー側のファイアウォール設定で、''TCP995''番(''POP''の場合)または''TCP993''番(''IMAP''の場合)ポートへのアクセスを許可するようにする。 [[Portチェックテスト【外部からのPort開放確認】>http://www.cman.jp/network/support/port.html]]で「ホスト名(''FQDN'') または グローバルIPアドレス」にサーバー名(例:hoge.com)、「チェックポート番号」に''995''または''993''と入力、「ご注意・制約事項」を確認チェックして「Portチェック実行」ボタンを押下し、 -ホスト:hoge.com -ポート:''995''または''993'' -にアクセスできました と表示されることを確認。 *Postfix、Dovecot確認 [#k4c5ac26] メールソフトでメール送受信してセキュリティの警告が表示されないこと *サーバー証明書自動更新設定 [#t0f5bab0] ''Certbot''のサーバー証明書の有効期間は3ヶ月のため、毎月自動でサーバー証明書を更新するようにする。 |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/cron.monthly/certbot &color(lime){← サーバー証明書自動更新スクリプト作成};| #!/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}