Postfix からのメール送信も SSL で暗号化する

以前の記事 (「ubuntu 10.04 をメール サーバーに (SMTPS、POP3S、IMAP4S の設定)」、「CentOS 5.6 をメール サーバーに (SMTPS, IMAP4S, POP3S)」) で、メール サーバーとメーラーの間でやり取りするメールを暗号化する設定を紹介した。
これによって、SMTPS、POP3S、IMAP4S といった over SSL による通信路の暗号化や、STARTTLS や STLS コマンドを使ったプロトコル メッセージの暗号化が可能になる。
しかし、これはメール サーバーとメーラーの間の暗号化だけであって、メール サーバー間は相変わらずプレイン テキストのままだ。

そこでここでは、メール サーバー間のやり取りも暗号化するように設定を修正する。

メールサーバー間の通信は SMTP なので、暗号化するには SMTPS (465 番ポート) で繋いで最初から暗号化するか、SMTP (25 番ポートまたは 587 番ポート) で繋いでから STARTTLS コマンドを使って暗号化するかのどちらかだ。

以前の記事 (「ubuntu 10.04 をメール サーバーに (SMTPS、POP3S、IMAP4S の設定)」、「CentOS 5.6 をメール サーバーに (SMTPS, IMAP4S, POP3S)」) で Postfix で SMTPS や STARTTLS コマンドを使ってメールを受け付けられるようにした。
実はこれによって、他のメール サーバーからのメールも、メーラーからのものと同様に SMTPS や STARTTLS で受け付けるようになっている。
つまり、これ以上の設定をいじらなくても、他のメール サーバーがメールを送ってくるときに、SMTPS で接続してきたり、STARTTLS コマンドを使ってくれさえすれば、メール サーバー間の暗号化が実現しているということだ。

しかし、他のメール サーバーにメールを送るときは、今のままでは暗号化することはないので、何らかの設定が必要だ。

暗号化して送信しようとした時、送信先が常に固定されているのでない限り、送信先のメール サーバーが SMTPS や STATTLS に対応しているかを、予め知ることは不可能だ。
このため、まずは SMTPS で繋いでみて、エラーになったら次は SMTP で繋ぎ直して STARTTLS を試みるといった手順にならざるを得ないだろう。
送信先が STARTTLS に対応しているかどうかは SMTP で繋げばすぐにわかるので、STARTTLS がエラーになるかどうかは考える必要はない。
ところで、SMTPS も STARTTLS も暗号化の強度自体に何の違いも無いし、SMTPS に対応しているメール サーバーはほとんどが STATTLS にも対応しているので、SMTPS での送信を試みたりせず最初から SMTP で繋ぎ STARTTLS に対応していればそれを使い、対応押していなければ諦めて平文で送るのが正しい考え方だろう。

色々と遠回りをしたが結局のところ、メール サーバーから別のメール サーバーにメールを送るときに、相手側が STARTTLS に対応していれば、それを使うような設定を追加すればいいことになる。

ここまでメール サーバーとひとくくりに行っているが、このために設定が必要なメール サーバーは SMTP サーバーである Postfix になる。
つまり、Postfix が受け取ったメールを他のメールに転送する際に可能であれば STARTTLS を使うような設定を行うということだ。
それには、Postfix の設定ファイル /etc/postfix/main.cf に以下の一行を追加するだけでいい。
ここで二行目の smtp_tls_loglevel = 1 は暗号化の動作をログに記録させるためのものなので、動作を確認できたら削除しても構わないだろう。

/etc/postfix/main.cf ファイルを修正したら、 sudo service postfix restart コマンド (ubuntu の場合。CentOS では /etc/init.d/postfix restart コマンド) を実行し、Postfix を再起動して修正した設定を読みこませる。
確認のために Gmail のメール アドレスに宛ててメールを送ってみると、以下の様なログが /var/log/mail.log ファイル (ubuntu の場合。CentOS では /var/log/maillog ファイル) に記録される。

このログの 3 行目に「TLS connection established to aspmx.l.googl.com」の文字が見える。
これが TLS で暗号化されていることの証だ。

ログをよく読むと 2 行目には「certificate verification failed」の文字が、3 行目には「Untrusted」の文字がある。
これは別にエラーというわけではない。
暗号化に使う証明書を発行した認証局が検証できなかったということを意味しているだけだ。
認証局の検証ができなくてもその証明書自体は有効なので、暗号化についても何の問題もない。
「certificate verification failed」や「Untrusted」の文字が気になるのなら、ログを記録させるために追加した smtp_tls_loglevel = 1 の行を /etc/postfix/main.cf ファイルから消してしまえばいい。

暗号化に使用する証明書を発行した認証局をきちんと検証したいというのであれば、/etc/postfix/main.cf ファイルに更に smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt (ubuntu の場合。CentOS では smtp_tls_CAfile = /etc/ssl/ca-bundle.crt) を一行追加する。
先ほど追加した設定と合わせると以下のようになる。

sudo service postfix restart コマンド (ubuntu の場合。CentOS では /etc/init.d/postfix restart コマンド) を実行したら、Gmail のメール アドレスに宛ててメールを送り、記録されたログを見てみる。
smtp_tls_loglevel = 1 の行を含ませたので、暗号化の動作がログに記録される。

/etc/ssl/certs/ca-certificates.crt ファイル (ubuntu の場合。CentOS では /etc/ssl/ca-bundle.crt ファイル) には主要な公式認証局の証明書が保存されている。

関連記事

コメントを残す