wiz.code

XMailでSSLを使う

メールのセキュリティ

ApacheでのSSL接続がひとまず完了したので、次にメールサーバー(XMail)のSSLを設定していきます。

メールの送信にはSMTPというプロトコル、受信にはPOP3というプロトコルが一般的に利用されていますが、どちらも通信内容は暗号化されません。 メールの通信データを暗号化するために、ホームページのHTTPSと同様にSSLを使用したものが、SMTPSPOP3Sです。

メールでSSLを使用する方法は2種類あります。 ひとつは、SSL通信用のポート番号を設ける方法。 もうひとつは、通常のポート番号で接続し、暗号化通信を開始するコマンドを実行する方法です。

SSL通信用のポート番号を使って暗号化
通常、SMTPのポート番号は25、POP3は110です。 これとは別に、SSLによる暗号化通信専用のポート番号を設けて、初めからデータを暗号化します。 SSL通信用のポート番号を使う場合、SMTPは465、POP3は995を使います。
通常のポート番号を使って暗号化
通信に使うポートはそのままにして、途中から暗号化通信を行う方法です。 この方法では、SMTPやPOP3で接続した後に「STARTTLS」というコマンドを実行することで暗号化通信を開始することをサーバーに伝えます。 STARTTLSを実行したあとは、すべての通信内容が暗号化されます。

どちらの方法も、サーバー側とクライアント側の対応が必要です。 クライアント側では、それぞれのプロトコルで暗号化を行う設定にすれば、ポート番号は自動的に変更されるようになっています。 サーバー側では、HTTPSと同じように、暗号鍵と電子証明書をメールサーバーに設置することで、暗号化通信を行う環境を準備します。

間違いやすいメールセキュリティのお話

メールのセキュリティについては、ESMTPやAPOPなどのキーワードや、25,110,465,995などいくつものポート番号が出てくるので混同しやすいところです。 送信と受信のプロトコルが異なること、認証方法が複数あることなどがその原因です。 ポイントは「メール認証」と「暗号化」はまったく別の話、ということです。 ここで一度整理しておきます。

SMTP
SMTP(25番ポート)は、メールを送信するためのプロトコル
メールクライアントからメールサーバーへの送信だけでなく、メールサーバー同士の送信(メールリレー)にも使われる
ユーザー認証は行われない
通信データは暗号化されない
ESMTP
拡張型SMTP(25番ポート)
SMTPにユーザー認証等のコマンドを追加して拡張したもの
ユーザー認証に使用する認証情報はPOP3と同じものを使う場合が多い
通信データは暗号化されない
POP before SMTP / SMTP after POP
スパムメールやウィルスメールの送信を規制するために、メール送信をPOP3で認証した後の数分間だけに制限した施策
メールクライアントでの設定変更が必要ないことから広く普及したが、「受信」よりも「送信」を先に行うクライアントの場合、メールを送信できないという症状が発生した(受信を先に行うか、送受信を素早く2回以上行えば送信できる)
基本的に、SMTP認証を利用していれば、この送信制限の対象外となる
OP25B
スパムメールやウィルスメールの送信を規制するために、各インターネットプロバイダが25番ポートでメールを送信できないようにした施策
メールの送信にはサブミッションポート(587番ポート)を利用する
メールクライアントでポート番号の変更が必要
通常、ユーザーの認証を必須としている
通信データは暗号化されない
SMTPS
SMTPをSSLにより暗号化する
SSL通信用ポート(465番ポート)を使う方法と、STARTTLSコマンドにより暗号化通信を開始する方法がある
SSL通信用ポートを使用する場合は、すべての通信が暗号化される
ユーザー認証は必須ではない
POP3
POP3(ポート番号110)は、メールを受信するためのプロトコル
ユーザー認証が必要
通信データは暗号化されない
APOP
POP3の認証情報を保護するために拡張されたコマンド
パスワードをハッシュ関数によって非可逆に暗号化し、認証情報を保護することが目的
パスワード以外のメール本文などは暗号化されないため、メール内容を保護することはできない
POP3S
POP3をSSLにより暗号化する
SSL通信用ポート(995番ポート)を使う方法と、STARTTLSコマンドにより暗号化通信を開始する方法がある
SSL通信用ポートを使用する場合は、すべての通信が暗号化される
STARTTLS
SMTPやPOP3の拡張コマンドとして実装された、暗号化通信を行うためのコマンド
通信ポートはSMTP(25番ポート)、POP3(110番ポート)のままで利用できる
SMTPのサブミッションポート(587番ポート)でも利用できる
メールクライアントで暗号化通信を利用する設定が必要
STARTTLSコマンド以降の通信が暗号化される
最近は、メールリレーでSTARTTLSを使用し、中継経路も暗号化するメールサーバーがある

メールサーバーを構築する上では、上記のいずれの方法を採用するか、を決めなければなりません。 分かりやすくポート番号別に見ていきます。

25番ポート

メールの送信に使用するポートです。 メールリレーによって、外部のメールサーバーから送られるメールを受け取るために、25番ポートは必須です。 また、OP25Bによる25番ポートの制限はプロバイダによるものなので、サーバー側が25番ポートをふさぐ必要はありません。 ただし、サーバーが踏み台にされないように、SMTP認証を行わないとメールリレーを許可しない設定にしなければなりません。(XMailでは標準で対応)

最近は、メールのリレーでSTARTTLSを利用してくれるメールサーバーもありますから、STARTTLS対応にします。

110番ポート

メールの受信に使用するポートです。 外出先からメールを受け取るとき、SSL通信用のポートを使うPOP3Sに制限するのであれば必要ありません。 また、110番ポートはインターネットからアタックをかけられやすいポートなので、特に必要なければふさいでしまってよいでしょう。

465番ポート

SMTPのすべてを暗号化するために使用するポートです。 25番ポートがSTARTTLSに対応していれば暗号化されるので必須ではありませんが、その場合はサブミッションポート(587番)を用意しないと外出先からメールの送信ができない場合があります。

留意点として、465番ポートは、SMTPにSTARTTLSが採用された時点で無効となり、現在は異なるプロトコル(URL Rendesvous Directory for SSM)の番号に割り当てられています。 まぁ、このあたりで問題がなければ開けておいてよいでしょう。 使用する場合は待ち受けのポート番号が衝突しないか、を確認するようにしてください。

今回は、465番を使用し、さらにサブミッションポートも開放します。

587番ポート

OP25Bによって外出先から25番ポートを使用できない場合に、サブミッションポートとして使用するポートです。 465番ポートを使わない場合は必須です。

前述したように、465番と587番の両方を使用します。

995番ポート

暗号化通信によるメールの受信に使用するポートです。 110番ポートを使用しない場合は必須です。

今回は110番ポートをふさぐので、995番を使用します。

POP before SMTP

SMTP認証を必須とするのであれば必要ありません。 メールクライアントが「受信」よりも「送信」を優先すると、メールを送信できない場合があるので、今回は使用しません。

APOP

POP3はSSLで暗号化されるので必須ではありません。 パスワードの暗号化に使うハッシュ関数(MD5)に脆弱性が発見され、使用中止の勧告が出されていますが、POP3Sによって通信が暗号化されていればその影響はありません。 今回はXMailで使えるかどうか、だけ確認します。

秘密鍵と電子証明書の設置

前置きが長くなってしまいましたが、ここからXMailの設定です。

まず、SMTPSとPOP3Sを動作させるため、秘密鍵と電子証明書を設置します。 XMailでは、MailRootディレクトリにserver.key(秘密鍵)とserver.cert(電子証明書)を配置することで、SSLが使用できるようになります。 いずれも、ApacheのSSL設定で使用したものがあるので、それを利用します。 両方のファイルは、ホームのsslディレクトリに作成してあるので、それぞれ名前を変えてコピーします。

# cp ssl/wiz-code.private.key /var/MailRoot/server.key
# cp ssl/wiz-code.private.cert /var/MailRoot/server.cert

次に、XMailが自己署名証明書を受け入れられるように、server.tabを編集します。 自己署名証明書の受け入れは「SSLAllowSelfSigned」変数に「1」を設定します。 項目がなければ追記します。

server.tabを編集
# vi /var/MailRoot/server.tab

"SSLAllowSelfSigned"[TAB]"1"

XMailのSSLは既定で「有効」になっており、特に指示を与えなければ無効にはなりません。 この段階で、SMTPSとPOP3Sが利用できるようになっているはずです。 XMailを再起動して確認してみましょう。

serviceコマンドでXMailを再起動
# service xmail stop
# service xmail start

XMailはsystemctlコマンドに対応していないので、serviceコマンドで再起動(終了と起動)を指示しました。 /etc/init.d/xmailへ直接指示してもおそらく動作は同じだと思います。

SSL接続の確認

XMailがちゃんとSSLで動作するか確認します。 SSL通信を自力で行うのは多分不可能なので、メールクライアントを使います。

アプリケーションインストーラ

アプリケーションインストーラで「インターネット」カテゴリの「メール」にThunderbirdがあったので、これを使いましょう。

Thunderbirdをインストール中

インストール中...。

Thunderbirdを起動

インストール完了。 起動します。

Thunderbird

ちなみに、Thunderbirdは使ったことありません。 いつも通り、下調べせず"勘"で設定していきます。

とりあえず、メールアカウントの設定に進む。

アカウント情報を記入

ユーザー名、メールアドレス、パスワードを記入。

アカウント設定完了

プロバイダを検索?? いやいや、プライベートドメインだから見つからないでしょ、と思ったらメールサーバーへのアクセス試行で設定値を推測したようですね。 賢いな…。

いずれも、STARTTLSで暗号化通信が利用できるようです。

自己署名証明書に対するセキュリティ警告

電子証明書のセキュリティ警告が表示されました。 自己署名証明書なので、これは当然の結果です。 「例外を許可」して、設定完了かな。

テストメールの送信

テストメールを送信してみましょう。

送信のセキュリティ警告

セキュリティ警告が出て送信できませんでした。 こちらも例外を許可します。

送信失敗

あら。 SMTPの設定がダメっぽい?

SMTPの設定

SMTP認証のユーザー名をメールアドレスに変更。 XMailはマルチドメイン対応なので、ユーザー名はメールアドレスと同じにする必要があります。

てか、ThunderbirdのSMTPはポート番号の既定値がサブミッションポート(587番)なんだ。 サブミッションポートはまだ用意していないので、ここは25のままでOK。

POP3の設定

同じ理由で、POP3のユーザー名も変更しておきます。 パスワードの入力欄がないけど、接続するときに再設定するのかな?

SMTP認証のパスワード入力

やっぱり出てきた。 パスワードを入力します。

送信成功。 続けて受信します。

受信も成功

受信の時もパスワード入力を求められましたが、ちゃんと受信できました。

ここまでの検証結果。 SMTP(25)とPOP3(110)のSTARTTLSによるSSL暗号化はいずれも成功です。

POP3の設定(SSL通信ポート)

次に、SSL通信ポートによる暗号化をチェックします。

アカウント設定で、POP3の「接続の保護」をSTARTTLSからSSL/TLSに変更します。 ポート番号も自動的に995に変更されます。

SMTPの設定(SSL通信ポート)

SMTPも同様に変更します。 こちらは、ポート番号が自動的に変わらなかったので、既定値として表示される「465」に書き換えました。

SSL通信ポートで送受信

新しいメールを作成して、送受信を行ったところ、それぞれで電子証明書のセキュリティ警告が出ました。 電子証明書の例外設定はポートごとに管理されているようです。 例外を許可し、送信・受信とも成功しました。

SMTPSとPOP3SのSSL通信ポートによる暗号化も問題ないですね。

サブミッションポート

SMTPの設定(サブミッションポート)

最後に、サブミッションポートの接続を確認します。 SMTPの設定をSTARTTLSに戻し、ポート番号を587に書き換えます。

サブミッションポートの送信エラー

メール送信でエラーが出ました。 といっても、これは予想通りです。 XMailは、サブミッションポートを待ち受けしません。

サブミッションポートを使うには、XMailでSMTPサーバーの待ち受けポートを増やす必要があります。 ちなみに、25番ポートを変更するわけにはいきません。 外部メールサーバーからのメールを受信できなくなりますので、25番ポートに加えて、587番ポートをSMTPの待ち受けに追加します。

XMailの起動スクリプトを編集

待ち受けポートの追加は、server.tabなどの設定ファイルではなく、XMailの起動オプションで指定します。

/etc/init.d/xmail の起動スクリプトにコマンドライン用の変数があるので、ここに「-SI (IPアドレス):(ポート番号)」の書式でコマンドラインを追加します。 このとき、25番ポートと587番ポートの両方を待ち受けにするように記述します。 587番ポートだけだと、25番ポートが待ち受けされません。

サブミッションポートでの送信成功

XMailを再起動し、サブミッションポートで送信。 今度は成功しました。

また、SMTPのポート番号を25番に戻してもちゃんと送信できるか確認し、こちらもOK。

XMailのSSL設定まとめ

SMTPは25番ポートと587番ポート(サブミッションポート)で稼働し、ともにSTARTTLS対応。

SMTPSは465番ポートで稼働。

POP3は110番ポートで稼働し、STARTTLS対応。(ただし、110番ポートはファイアウォールでは開かない)

POP3Sは995番ポートで稼働。

以上で、XMailサーバーの設定は完了です。

この章のまとめ