戻る

Secure MTA(Postfix-TLS) 〜 smtp-auth & SMTP over SSL

対象バージョン ... woody(stable) sarge / sid の場合(ver 2.x)は、sasl 関連でインストールするパッケージ名が若干違います。
また、Postfix 自体の設定も、指定できるオプションなどが変わっている(カモ)

ちなみに、証明書作成手順のパートはちょっとあやしいです(汗

てーか、smtp と pop でドキュメント分けた方がいいな。

Postfix の基本インストール・設定は終わっているものとし、メールサーバをセキュアに稼動させるために SMTP-AUTH の追加設定と、SMTP over SSL の設定についてのメモ。

追加モジュール類のインストール

# apt-get install postfix-tls sasl-bin libsasl-modules-plain libsasl-digestmd5-plain
繰り返しになりますが、Postfix の基本インストール・設定は終わっているのが前提です。

AUTHの設定

Postfix の main.cf の追加編集。ファイル末尾に追加すればいい。
## for sasl (smtp-auth) config
smtpd_sasl_auth_enable = yes               AUTH を有効にする
smtpd_sasl_local_domain = $myhostname      後述の saslpasswd で指定するドメイン名と同じにする
smtpd_sasl_security_options = noanonymous  anonymous ログインを禁止
smtpd_recipient_restrictions =             以下の条件のメールを許可
        permit_mynetworks,                   $mynetworks からのアクセス
        permit_sasl_authenticated,           認証済みのメール
        permit_auth_destination,             自サーバ宛のメール
        reject                             それ以外は全て拒否
broken_sasl_auth_clients = yes             古いクライアント用
permit_auth_destination 設定は、詳しくはこちら。古いクライアント用の設定は、古いマイクロソフト製の MUA が、EHLO の応答の "250-AUTH method list" を認識しない(らしい)ため、"250-AUTH=method list" と、こいつが認識するように、間に"="を付加する設定。利用者が限定されるなら、別に指定しなくてもよい
もし、平文パスワード(plain / login)での認証を禁止する場合は、"smtpd_sasl_security_options"に、noplaintext を追加で記述する。
smtpd_sasl_security_options = noanonymous, noplaintext

AUTH ユーザの作成
$myhostname は、main.cf で指定しているのと同じドメイン名を指定。
# saslpasswd -u $myhostname username
ほかのいろんなものと同じように、パスワードを2回入力する。もちろんこれは SMTP-AUTH 用の ID とパスワードなので、シェルログインや pop / imap その他諸々のアカウントは別物です。
このコマンドで、/etc/sasldb ファイルが更新(初めてなら新規に作成)されるが、debian の Postfix パッケージは、chroot 環境で動作するため、/etc/sasldb は参照できない。そこで、/var/spool/postfix/etc へコピーする必要がある。また、パーミッションも root しか参照できないようになっているので、owner を変更する。
# chgrp postfix /etc/sasldb
# cp -p /etc/sasldb /var/spool/postfix/etc
この操作(コピーのみ)は、saslpasswd で auth ユーザを作成・変更する度に実行する必要有り。ただし、/etc と /var が同一パーティションの場合は、ハードリンクをはっておけば必要ない。(シンボリックリンクは不可)
# ln /etc/sasldb /var/spool/postfix/etc
なお、saslpasswd で作成したユーザは、以下のコマンドで確認可能
# sasldblistusers
user: username realm: hostname mech: DIGEST-MD5
user: username realm: hostname mech: PLAIN
user: username realm: hostname mech: CRAM-MD5

以上で設定完了。Postfix をリブートし、動作確認。
# /etc/init.d/postfix restart

$ telnet localhost 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 cheddar ESMTP Postfix (Debian/GNU)
ehlo hoge
250-cheddar
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5  この2行があるのを確認
250-AUTH=LOGIN PLAIN CRAM-MD5 DIGEST-MD5  こっちは、古い OE 系を捨てるなら別になくてもよいか
250-XVERP
250 8BITMIME
ただし、パスワードファイル(sasldb)などが見当たらない場合でも、上記の出力はあるので、必ず認証のテストまで行うこと。

でもって、to: リモートなメールをリモートの回線から送信するときは SMTP-AUTH が必須であること(AUTH しない場合は REJECT される)・ローカルから to: リモートなメールを送信するときは AUTH なしで送信できることもあわせて確認する。

AUTH の設定は以上。

SMTP over SSL の設定

SMTP で SSL(TLS) 通信を行うには、2通りの方法があります。一つは、Web でいう https みたいに、接続のはじめから暗号化通信を行うパターンと、starttls といって、まず最初は通常の smtp のポートへ接続し(クリアテキストの通信)その後に暗号化通信に切替えて、以降の通信を行うパターンです。
パターン1では、(デフォルトでは)ポート 465/tcp へ接続して、セッション確立の時点で暗号化された smtp のやり取りをおこないます(Web での https と似た感じ)。パターン2では、(通常の smtp と同じく)ポート 25/tcp へ接続し、starttls コマンドを発行後に暗号化された通信が始まります。
ここでは、両手順の暗号化の設定を行います。一般に、後者の方が多く使われていますが。
といっても、クライアント〜サーバ間は暗号化できても、(おそらくほとんどの)サーバ〜サーバ間は、従来のクリアテキストでリレーするんだろーけどね…。個人的には、auth 時のパスワードだけ cram-md5 で暗号化してればいいと思ってます(^-^;
あー、OutlookExpress とか Netscape(7.0x以前) は cram-md5 非対応だから、SSL 使えたほうがいいのか。
サーバ証明書の作成
適当なディレクトリで作業します(/etc/ssl/certs など)た、openssl パッケージがインストールされている必要があります。

1. サーバ秘密鍵の作成
# openssl genrsa -out server.key 1024
warning, not much extra random data, consider using the -rand option
Generating RSA private key, 1024 bit long modulus
................++++++
.++++++
e is 65537 (0x10001)
2. サーバ証明書の作成
# openssl req -new -x509 -key server.key -out server.crt
Using configuration from /usr/lib/ssl/openssl.cnf
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) [AU]:JP(適当)
State or Province Name (full name) [Some-State]:Kanagawa(適当)
Locality Name (eg, city) []:Yokohama(適当)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ddns.example.org(適当)
Organizational Unit Name (eg, section) []:(適当)
Common Name (eg, YOUR name) []:ddns.example.org 使用する(DDNSの)ドメイン名
Email Address []:root@ddns.example.org(適当)
c.f. OpenSSL コマンドの使い方: http://ash.jp/sec/openssl_ca.htm

あとは、パーミッションを変更しておく。
# chmod 400 server.key server.crt

なお、Apache-SSL を既にインストールしており、同じサーバ証明書を使用したい場合(たいていこのパターンだろうが)は、/etc/apache-ssl/apache.pem から上記2ファイルを作成できる。
# cat /etc/apache-ssl/apache.pem
-----BEGIN RSA PRIVATE KEY-----
:                                                              :
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
:                                                              :
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
:                                                              :
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
:                                                              :
-----END CERTIFICATE-----
#
上記ファイル内の赤い部分を"server.key"として、青い部分を"server.crt"として保存すればよい。
main.cf の変更
末尾に追加すれば良い。
## for tls config
smtpd_tls_cert_file = /etc/ssl/certsfile/server.crt  上記で作成したサーバ秘密鍵
smtpd_tls_key_file = /etc/ssl/certsfile/server.key   上記で作成したサーバ証明書
smtpd_tls_session_cache_database = sdbm:/etc/postfix/smtpd_scache
smtpd_use_tls = yes                                  STARTTLS コマンドを有効にする

master.cf の変更
一番末尾の箇所
# only used by postfix-tls
smtps  inet  n  -  n  -   -  smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
#587   inet  n  -  n  -   -  smtpd -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
tlsmgr fifo  -  -  n 300  1  tlsmgr
smtps で始まる行は、port 465/tcp で LISTEN する smtps プロトコルを有効にする設定。デフォルトではコメントアウトされているので、コメントを解除する。STARTTLS 対応のみで、465/tcp で SSL 接続を待ち受けないのなら、smtps の行はコメントアウトのままで良い。逆に、こちらは有効にして main.cf の smtpd_use_tls を yes にしなければ(or コメントアウトすれば) STARTTLS には対応せず、465/tcp で SSL 接続を待ち受けるだけの状態になる。
tlsmgr は、初期状態の設定にはないので、新規に記述する。
以上で設定完了。Postfix をリブートし、動作確認。

1. smtps(465/tcp)で LISTEN しているかチェック
$ netstat -ta
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
:          :      :
tcp        0      0 *:smtp                  *:*                     LISTEN
tcp        0      0 *:smtps                 *:*                     LISTEN
:          :      :
2. STARTTLS が有効になっているかチェック
$ telnet localhost 25
Trying 127.0.0.1...
Connected to 127.0.0.1
Escape character is '^]'.
220 cheddar ESMTP Postfix (Debian/GNU)
ehlo hoge
250-cheddar
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5
250-AUTH=LOGIN PLAIN CRAM-MD5 DIGEST-MD5
250-XVERP
250 8BITMIME
動いているようなら、(SSL通信をtelnetから操作するのは骨が折れるので)実際に mua を使用して試験をする。Windows なら、Outlook Express や Netscape、Linux なら、Sylpheed などが SSL/TLS に対応。
ただし、Sylpheed は、暗号化通信のための接続に、いきなり 465/tcp へ接続するのか・25/tcp へ接続して STARTTLS を使うのか、の設定はすごくわかりやすいが、OE や Netscape はスゲーわかりにくい(^-^;
Ethereal 等でパケットキャプチャすればよくわかるが、465/tcp へ直接接続した場合は、セッションの全データが暗号化され、25/tcp へ接続後に STARTTLS を実行すると、そこからが暗号化される。