KUSANAGI for ConoHaとLet’s Encryptの小粋な使い方

ConoHaさんはかわいいですよ?

この記事は、ConoHa Advent Calender の13日目の記事になります。
ということで、KUSANAGIの中の人宮﨑です。KUSANAGIは、超高速WordPress仮想マシンということで、WordPressを高速に動作させるようセットアップ済みの環境(OSイメージ)を色々なクラウド事業社さんに提供しています。
もちろん、KUSANAGI for ConoHaでConoHaで動きます。
この www.myzkstr.com も ConoHa 上で動いています。

Let’s EncryptのSSL証明書をHTTPS以外で使用してみる。

KUSANAGIでは、Let’s Encryptが提供する無償SSL証明書を取得し、HTTPSの環境を簡単にセットアップする機能を提供しています。
このLet’s EncryptのSSL証明書は期限が90日と商用SSL証明書に比べると短いのですが、Let’s Encryptのクライアントで更新することで継続的に使用できます。もちろん、KUSANAGIではcronで定期的にSSL証明書の更新を行います。
さて、このSSL証明書ですが、HTTPS接続以外にも使用用途があります。ということで、いくつか紹介します。
ここでは、KUSANAGIでSSLの証明書を取得済みとして説明します。

SMTPサーバPostfixでTLS

SMTPはメールを送受信するサービスですが、歴史が古いプロトコルなため基本はプレーンテキストでの通信となり、内容を傍受可能な状態になります。
近年(といっても21世紀に入ってから)では、SMTP over SSLやSTARTTLSの機能を組み込み、SMTPで暗号化通信を行うことは一般的になりました。
このSSL通信では、当然のようにサーバSSL証明書が必要になりますので、Let’s Encrypt で取得したSSL証明書を利用してみましょう。

Let’s EncryptのSSL証明書

Let’s EncryptでSSL証明書を取得すると、以下のように証明書関連ファイル(実際にはsymbolic link)が生成されます。

サーバ証明書 /etc/letsencrypt/live/www.myzkstr.com/cert.pem
中間証明書 /etc/letsencrypt/live/www.myzkstr.com/chain.pem
サーバ証明書+中間証明書 /etc/letsencrypt/live/www.myzkstr.com/fullchain.pem
秘密鍵 /etc/letsencrypt/live/www.myzkstr.com/privkey.pem

Postfixの設定

KUSANAGIのベースOSであるCentOS7には、あらかじめPostfixがインストールされています。ただし、SMTP-AUTHを使用するため、以下のパッケージを yumでインストールしてください。

cyrus-sasl-2.1.26-20.el7_2.x86_64
cyrus-sasl
cyrus-sasl-md5
cyrus-sasl-gssapi
cyrus-sasl-plain
cyrus-sasl-lib
cyrus-sasl-scram

postfixの設定ファイル、/etc/postfix/main.cf に以下の設定を追記します。
以下は例ですので、鵜呑みにせずに設定内容を吟味してください。真に必要な設定は SSL/TLSの設定とSMTP-AUTHの部分で、そのほかの部分はSMTP送受信を制限する設定になります。

#security
disable_vrfy_command = yes
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
allow_percent_hack = yes
swap_bangpath = yes
allow_untrusted_routing = no

smtpd_recipient_restrictions =
  permit_mynetworks,
    permit_sasl_authenticated,
          check_recipient_access hash:/etc/postfix/access,
            reject_non_fqdn_recipient,
                  reject_unauth_destination,
                    permit_auth_destination,
                          reject
smtpd_etrn_restrictions = permit_mynetworks, reject_invalid_hostname

smtpd_client_restrictions =
  permit_mynetworks,
    check_client_access hash:/etc/postfix/access,
          reject_rbl_client all.rbl.jp,
            reject_rbl_client bl.spamcop.net,
                  reject_rbl_client sbl.spamhaus.org,
                    reject_unknown_client,
                          permit

#メール中継の設定
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#MAIL FROM コマンドの送信者アドレスを制限
smtpd_sender_restrictions = reject_unknown_sender_domain

# ssl/tls
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_cert_file = /etc/letsencrypt/live/www.myzkstr.com/cert.pem
smtpd_tls_key_file = /etc/letsencrypt/live/www.myzkstr.com/privkey.pem
smtpd_tls_CAfile = /etc/letsencrypt/live/www.myzkstr.com/chain.pem
smtpd_tls_CApath = /etc/letsencrypt/live/www.myzkstr.com/
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

# sasl
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = www.myzkstr.com
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

SMTP over SSL接続をするには、smtps(465番ポート)の設定が必要なので、以下のように /etc/postfix/master.conf を設定します。

smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

postfixをrestartすれば、設定が反映されているはずです。

STARTTLSの確認方法

SMTP(25番ポート)にnetcatなどで接続し、EHLO localhost と打ってSTARTTLSが入っていれば、STARTTLS接続できます。
SMTP-AUTHの設定もここで確認できます。crypt済みのpamの情報をAUTHとして使っているので、当たり前ですがCRAM-MD5とかは使えません。

# nc localhost 25
220 www.myzkstr.com ESMTP
EHLO localhost
250-www.myzkstr.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

SMTPSの確認方法

SMTPS(465番ポート)の場合は、openssl コマンドで確認します。設定したSSL証明書で接続されていることが分かります。

# openssl s_client -connect localhost:465 -crlf
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.myzkstr.com
verify return:1
---
Certificate chain
 0 s:/CN=www.myzkstr.com
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
  (省略)
---
220 www.myzkstr.com ESMTP
ehlo localhost
250-www.myzkstr.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
DONE

POP3/IMAPサーバdovecotでTLS

SMTPと同様に、受信したメールをMUA(メールクライアント)から取得する際、POP3やIMAPを使用しますが、近年SSL接続を経由するのが一般的です。
CentOS7で標準的なPOP3/IMAPサーバのdovecotで、Let’s EncryptのSSL証明書を使用してみましょう。

dovecotの設定

SSL証明書の設定は、/etc/dovecot/conf.d/10-ssl.conf に以下の設定を追記します。
中間証明書+サーバ証明書である fullchain.pem を使用します。

ssl = yes
ssl_cert = </etc/letsencrypt/live/www.myzkstr.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/www.myzkstr.com/privkey.pem

これで、POP3 over SSLや IMAP over SSLが使用できます。
非SSLのPOP3やIMAPを停止するには、/etc/dovecot/conf.d/10-master.conf で、以下のようにportを0とするとよいでしょう。

service imap-login {
  inet_listener imap {
    #port = 143
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    #port = 110
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

POP3 over SSLの確認

POP3 over SSLのテストは、openssl コマンドで 995版ポートに接続します。設定したSSL証明書で接続されていることが分かります。
“+OK Dovecot ready.” と出ていれば、POP3で接続できています。quit と打てば接続を終了します。

# openssl s_client -connect localhost:995
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.myzkstr.com
verify return:1
---
Certificate chain
 0 s:/CN=www.myzkstr.com
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
  (中略)
---
+OK Dovecot ready.
quit
closed

IMAP4 over SSLの確認

IMAP4 over SSLのテストは、openssl コマンドで、993版ポートに接続します。
” Dovecot ready.”の文字を確認します。”a logout” と打てば接続を終了します。

# openssl s_client -connect localhost:993
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.myzkstr.com
verify return:1
---
Certificate chain
 0 s:/CN=www.myzkstr.com
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
  (中略)
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
a logout
closed

まとめ

SMTP/POP3/IMAP4 over SSLで検索すると、大抵は自己証明SSL証明書を生成する手順をとりますが、通信相手が正しいことの保障とはなりません。
Let’s EncryptのSSL証明書を使用することで、中間CAを通して認証されるため、送信元から自分への通信が正しいことを保証できるため、より望ましい状態となります。
今どきは、自分でメールサーバを立てることは少ないと思いますが、参考にしていただけると幸いです。

Follow me!

Leave a Reply

Your email address will not be published. Required fields are marked *