最終更新日:2011年6月25日
現在、多くのメールサーバ(SMTP)ではクリアテキストを使った通信パケットでサーバ・クライアント間が通信されているため、パケットキャプチャツールなどをこの間に介在させると、通信の内容を盗聴される可能性が出てしまいます。
そこで、サーバ・クライアント間の通信をSSLを使った暗号化とする事で、安全に通信ができるようにする手順について説明していきます。 なお、TLSを実現するためのSASLにおいて、本資料ではその認証用DBとしてSASL独自のものではなく、通常のLinux(Unix)認証: PAM を使った方法を説明します。
TLSを使った暗号化の為には、これを実行するサーバに暗号化の為のプライベートキーとサーバ証明書が必要になります。 Postfixをインストールすると、取り敢えずデフォルトで証明書が用意されているので、独自の証明書が不要な場合にはこの章は飛ばしてください。
独自の証明書を用意する手順としては
- プライベートキーの作成
- プライベートキーを使い「署名要求書(CSR)」を作成
- CSRを証明機関(CA)へ送付.。CAにてCSRを元にサーバ証明書を作成し、送ってもらう。
- サーバ証明書にプライベートキーのマージ(必要な場合)
# 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)への署名方法に関してはこちらをご覧下さい。
# apt-get install libsasl2 libsasl2-modules sasl2-bin
(debian6では、apt-get install libsasl2-2 libsasl2-modules sasl2-bin )
# 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 の動作が確認できます。
# 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
pwcheck_method: saslauthd
# 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
# 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
# /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 --- 認証成功
メールクライアントでは次の設定でTLSを設定します。

Homeへ
Copyright© 1998-2003 ROBATA.ORG