TLS(SSL)によるSMTPの暗号化

最終更新日:2011年6月25日

はじめに、

現在、多くのメールサーバ(SMTP)ではクリアテキストを使った通信パケットでサーバ・クライアント間が通信されているため、パケットキャプチャツールなどをこの間に介在させると、通信の内容を盗聴される可能性が出てしまいます。
そこで、サーバ・クライアント間の通信をSSLを使った暗号化とする事で、安全に通信ができるようにする手順について説明していきます。 なお、TLSを実現するためのSASLにおいて、本資料ではその認証用DBとしてSASL独自のものではなく、通常のLinux(Unix)認証: PAM を使った方法を説明します。

1.サーバ証明書の入手(独自のものを用意する場合)

TLSを使った暗号化の為には、これを実行するサーバに暗号化の為のプライベートキーとサーバ証明書が必要になります。 Postfixをインストールすると、取り敢えずデフォルトで証明書が用意されているので、独自の証明書が不要な場合にはこの章は飛ばしてください。
独自の証明書を用意する手順としては
  1. 秘密鍵(プライベートキー)を作成
    証明書が必要なサーバ側で以下の方法で秘密鍵を作成する。

    # cd /etc/ssl/private
    # openssl genrsa -des3 -out server.key 1024 ----(ここではキー長を1024バイトにしてますが、必要に応じて可変してください)
    Generating RSA private key, 512 bit long modulus
    .++++++++++++
    ...++++++++++++
    e is 65537 (0x10001)
    Enter pass phrase for robata_server.key: サーバ用プライベートキーファイルのパスフレーズ設定
    Verifying - Enter pass phrase for robata_server.key: サーバ用プライベートキーファイルのパスフレーズ設定(確認用)

    これで、プライベートキーの作成は完了です。 ただし、このキーは暗号化された状態で、このキーをサーバでそのまま利用するとサーバの起動時にパスフレーズを求めてきてしまいますので、暗号化を解除したキーも作成しておきます。

    # openssl rsa -in server.key -out nopass_server.key
  2. 署名要求書(CSR)を作成

    # cd /etc/ssl
    # openssl req -new -days 3650 -key private/server.key -out csr.pem

    Enter pass phrase for private/robata_server.key: 先ほどのサーバ用パスフレーズを入力
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [JP]:
    State or Province Name (full name) [Chiba-ken]:
    Chiba-shi []:
    Organization Name (eg, company) [ROBATA]:
    Organizational Unit Name (eg, section) []:HOME
    Common Name (eg, YOUR name) []:sv.robata.org
    Email Address []:root@robata.org

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    #

    以上で署名要求書(csr.pem) が作成されましたので、これをCAへ送ってサーバ証明書を作ってもらってください。
    なおCSRを作成の際に入力する「Country Name」~「Email Address」などは、CAが自己認証局の場合にはCAと同じ値を指定してください。

  3. サーバ証明書に必要に応じてプライベートキーをマージ
    CAからサーバ証明書が送り返されてきたなら、必要に応じてプライベートキーとマージしてしてください。
    (WebサーバやメールのTLS化では、プライベートキーとマージが必要です)
    このときマージするキーはパスフェーズを解除したキーを利用してください。

    ここでは、サーバ証明書がcertsディレクトリに「server.pem」として作成されたものとして説明します。 
    作成されたServer証明書に、サーバ署名要求の際に作成したサーバのプライベートキーファイルをマージします。

    # cat certs/server.pem private/nopass_server.key > certs/postfix_cert.pem

    なお、証明書の確認を少しでも高速にしたい場合には、以下のようにCAの証明書も一緒にマージすると良いらしい。

    # cat certs/server.pem CA/cacert.pem private/nopass_server.key > certs/postfix_cert.pem

    作成された証明書ファイル postfix_cert.pem がサーバ側での証明書となります。 
手順は以上です。 このとき、証明機関(CA)としてベリサインやセコムなどの公式の証明機関を使うのが基本ですが、社内用だけで利用する場合などに、これら有償の証明書を入手するよりも社内で独自に構築した証明機関を構築して利用することも可能です。
自前のCAの構築方法ならびに署名要求書(CSR)への署名方法に関してはこちらをご覧下さい。

2.Postfix をTLSでの暗号化ができるように設定

  1. DebinaのPostfixでは標準でTLSのライブラリがリンクされているので設定だけでTLSを使ったメールの暗号化が可能になります。ただし、認証に関してはSASLを使った形にしないとTLS化ができないので、まず最初にSALS関連をインストールします。
# apt-get install libsasl2 libsasl2-modules sasl2-bin
(debian6では、apt-get install libsasl2-2 libsasl2-modules sasl2-bin )
  1. 次に saslauthd が起動時に自動で開始されるように /etc/default/saslauthd の以下の部分を設定します。
# Should saslauthd run automatically on startup? (default: no)
START=yes   ---デフォルトは no

MECHANISMS="pam"
以上で saslauthd を起動させる準備ができましたので、
# /etc/init.d/saslauthd restart
以上でsaslauthd を起動させましょう。
正常に起動できれば、
# testsaslauthd -u ユーザID -p パスワード
(ex. testsaslauthd -u matsuzaki -p real-password)
で、Linuxに登録されているユーザにて saslauthd の動作が確認できます。
  1. 次に、/etc/postfix/main.cf を開き以下の箇所を編集します。
# TLS parameters (独自の証明書を使わない場合)
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

# TLS parameters (独自の証明書を使う場合)
smtpd_tls_cert_file=/etc/ssl/certs/postfix_cert.pem
smtpd_tls_key_file=/etc/ssl/private/nopass_server.key



# postfix でTLSを利用する
smtpd_use_tls=yes

# smtpd_tls_CAfile = /etc/ssl/CA/cacert.pem
# smtpd_tls_CApath = /etc/ssl/CA/

smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache

# smtpでSASL認証を使うようにする。
# SASL Auth
# broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_authenticated_header = yes
# smtpd_sasl_local_domain = $mydomain

# smtpdでSASL認証に成功した場合に、転送できるようにする。
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    permit_auth_destination,
    reject


  1. /etc/postfix/sasl/smtpd.conf を以下の内容で作成します。
pwcheck_method: saslauthd
    


  1. /etc/postfix/master.conf でsmtpsを有効にするように修正します。
# smtps     inet  n       -       -       -       -       smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
  |
  V
smtps     inet  n      -     -       -      -      smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
  


  1. Postfixはchroot化された環境で動作するので、そのままではsaslauthd との通信に失敗してしまいます。 その対策として以下を実施します。
# rm -r /var/run/saslauthd/
# mkdir -p /var/spool/postfix/var/run/saslauthd
# ln -s /var/spool/postfix/var/run/saslauthd /var/run
# chgrp sasl /var/spool/postfix/var/run/saslauthd
# adduser postfix sasl


  1. 上記作業が完了したら、saslauthd と postfix を再起動します。
# /etc/init.d/saslauthd restart
# /etc/init.d/postfix restart
以上までの設定で、SMTPパケットのTLSでの暗号化か可能になりました。 (POPやIMAPに関してはまだ暗号化されていません。 それらについては別の章で説明します。)
SASLによるSMTP認証がうまく動作するかの確認は次のように行います。
まず、はじめにLinuxユーザの認証用ID/PasswordをBASE64化したデータを次の手順で入手します。
# perl -MMIME::Base64 -e 'print encode_base64("ユーザID\0ユーザID\0パスワード");'
(例: perl -MMIME::Base64 -e 'print encode_base64("matsuzaki\0matsuzaki\0pass1234");' )
たとえば結果として 「amltbXkAamltbXkAcaaamC1zZWNyZXQ=」が返ってきたとします。

リモートから telnet にてメールサーバに接続して、次のように確認を実施します。
~$ telnet メールサーバのIPアドレス  25
Trying xx.xxx.xx.xxx...
Connected to xxxx.
Escape character is '^]'.
220 xxxx ESMTP Mailserver
ehlo ドメイン名 (ex. ehlo robata.org)
250-xxxxx
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH NTLM LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250-AUTH=NTLM LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
AUTH PLAIN amltbXkAamltbXkAcaaamC1zZWNyZXQ=
235 Authentication successful --- 認証成功



3.メールクライアントでのTLSの設定

メールクライアントでは次の設定でTLSを設定します。

Home

Mailwebmaster@robata.org

Copyright© 1998-2003 ROBATA.ORG