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

最終更新日:2013年9月5日

1. 必要なライブラリを追加する

TLSを使うにあたり、SMTPでのユーザ認証も同時に行うようにします。(ユーザ認証は必ずしも必要ではないですが、実運用ではTLS+ユーザ認証というケースが多いと思います)
Redhat(CentOS, SL-Linux)では、ユーザ認証にはSASLライブラリを使用します。 SASLライブラリとして cyrus-sasl ライブラリを使用するようになっています。 最初に必要なライブラリを追加しておきます。
# yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-md5 cyrus-sasl-ntlm

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

CentOSのPostfixでは標準でTLSのライブラリがリンクされているので設定だけでTLSを使ったメールの暗号化が可能になります。またSASLによる認証も可能です。 なお、TLS化を実施する前にすでにPostfixの設定が完了しているものとし、設定の変更部分のみについて説明します。
(SMTP認証を行わず暗号化のみを実施するならSASLに関する設定は不要です)

2-1. /etc/postfix/main.cf の編集

PostfixでTLSを有効にするとともに、SASLを使ったSMTPのユーザ認証を行うようにします。
::
::
# TLS parameters
# smtp_use_tls = yes
# smtp_tls_note_starttls_offer = yes
smtpd_tls_auth_only = no
smtpd_use_tls = yes

smtpd_tls_cert_file=/etc/pki/tls/certs/mail-server.pem
smtpd_tls_key_file=/etc/pki/tls/private/nopass_mail-server.key
tls_random_source = dev:/dev/urandom
# smtpd_tls_CAfile = /etc/pki/CA/cacert.pem
# smtpd_tls_loglevel = 1
# smtpd_tls_received_header = yes
# smtpd_tls_session_cache_timeout = 3600s
::
::
# SASL Auth
# smtpd_sasl_local_domain = --- ローカル認証リルム(デフォルトはmyhostname。なお、ここでの設定は myorigin と saslpasswd の設定時の mydomain の設定ので同じにすること。)
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_authenticated_header = yes

# broken_sasl_auth_clients = yes --- Outlook Express v4 や MicroSoft Exchange v5.0 といた古いクライアントのAUTH実装をサポートする場合は "yes"
# smtpd_sasl_authenticated_header = yes --- 認証したユーザをReceived ヘッダに表示する場合は "yes"
::
::
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
permit_auth_destination,
reject


2-2. /usr/lib64/sasl2/smtpd.conf を編集。(32bit環境なら、/usr/lib/sasl2/smtpd.conf)

pwcheck_method: saslauthd
mech_list: plain login



2-3. /etc/postfix/master.conf を編集。

SMTPSが機能するようにします。
::
::
# smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

2-4. サービスの再起動

上記作業が完了したら、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 --- 認証成功

Mailwebmaster@robata.org

Copyright© 1998-2013 ROBATA.ORG