MTA-STSのススメ
MTA-STSとは
MTA-STSとは、メールの配送経路上のメールサーバーとメールサーバーの間の暗号化の仕組みを少し強くするためのものです。
具体的には、受信側が、送信サーバーに対して
- STARTTLSを必ず使う
- TLS1.2以上を必ず使う
- 証明書が有効でなければ配送しない
ようにしてもらうことを、お願いする仕組みです。
STARTTLSだけでは、何が不足なのかということについては、後ほど説明します。
例として、sender.example.comからreceiver.example.jpへのメールの配送を考えてみます。
まず、あらかじめ、receiver.example.jpのメール管理者は、自分のところのreceiver.example.jpにメールを送るときには、ちゃんと暗号化してね、とMTA-STSのポリシーでアピールしておきます。
receiver.example.jpのMTA-STSのポリシーを見たsender.example.comのメールサーバーには、receiver.example.jpには暗号化して送る必要があることがわかるので、きちんと暗号化して送ります。また、暗号化できない場合には送りません。
設定方法
MTA-STSでは、DNSでMTA-STSを利用することを宣言し、Webでポリシーを広告します。
DNSの設定
メールのドメインがexample.jpの場合、ホスト名に_mta-stsを追加して、以下のようなTXTレコードを記述します。
_mta-sts.example.jp. IN TXT "v=STSv1; id=20201122010000"
ポリシーの設定
ポリシーはDNSではなくWebに書きます。
httpsでドメインやURLも決まっているのでメール管理者にとっては少し敷居が高いかも知れません。
example.jpに対してMTA-STSのポリシーを公開する場合、次のようなURLになります。
https://mts-sts.example.jp/.well-known/mta-sts.txt
ポリシーはGETで取得したときtext/plainとして取得できる必要があります。
ポリシー
メール受信サーバーがmx1.example.jp、mx2.example.jpの2つである場合、次のような記述になります。
改行コードはCR/LFです。
version: STSv1
mode: enforce
max_age: 86400
mx: mx1.example.jp
mx: mx2.example.jp
mxはワイルドカードが使用できますので、次のような書き方でも構いません。
version: STSv1
mode: enforce
max_age: 86400
mx: *.example.jp
TLSレポートについて
長くなったので、別に書きます!
なぜSTARTTLSだけだと不十分なのか
MTA-STSはSTARTTLSをより堅牢にする仕組みです。
では、なぜ、STARTTLSだけでは不十分なのかを解説します。
Oppotunisticである
STARTTLSはOpportunisticです。
といっても何のことかわからないので、翻訳すると、「STARTTLSは日和見主義です。」
はぁ・・・。やっぱりわかりません。日本語でおkです。
簡単に言うと、STARTTLSはできればやるけれども、できない場合にはやらないということになります。
(日和見というのはできればやりたくない感じがするので、Opportunisticとはちょっと違う気がします。)
どういうことかというと、受信サーバーがSTARTTLSに対応してますよ、と言えば送信サーバーはSTARTTLSを使用して暗号化して送るのですが、受信サーバーがSTARTTLSに対応してると言わなければ、送信サーバーはSTARTTLSを使用せず、平文でメールを送信します。
つまり、受信サーバーがSTARTTLSに対応していれば証明書の検証などが行われるのですが、なりすました偽の受信サーバーはSTARTTLSに対応していると言わないことで、証明書の検証などされることもなく、平文でメールを手に入れられます。
MTA-STSを使えば、STARTTLSの使用が必須となるので、サーバーに平文で送信されることはありません。
中間者攻撃に弱い
Opportunisticであるということと同じなのですが、経路上でを盗聴・改ざんされた場合、中間者がSTARTTLSを無効にすることが可能です。(STARTTLS Downgrade Attack)
また、同様に、TLSのハンドシェイクを改ざんすることで、TLS1.1以下にダウングレードさせ、内容を盗聴することも可能なようです。(TLS Protocol Downgrade Attack)
これらのダウングレード攻撃に対して、MTA-STSでは、TLS1.2以上を必須としているので、暗号化のない状態や、脆弱な古い暗号方式で通信されることはありません。
オレオレ証明書の問題
STARTTLSではRoot CAからのトラストチェーンが切れていたり、有効期限が切れていたり、ホスト名が異なっていても、そのまま通信することがあります。
MTA-STSでは、ポリシーを広告するHTTPSサーバー、受信メールサーバ共に、証明書が有効期限内で、証明書のトラストチェーンがRoot CAまでつながっており、証明書のSANがホスト名と一致しているかどうかを検証しますので、偽の証明書をつかったサーバーに対してメールが送信されることはありません。
MTA-STSでも守れないこと
DNSのキャッシュポイズニング等でMTA-STSのレコード自体を無効化された場合には、平文で送信されてしまいます。ただし、ポリシーのmax_ageの期間はキャッシュされたポリシーを使用しますので、max_ageを長くしておくのが安全です。
不正な認証局から偽の証明書が発行される場合があります。MTA-STSは証明書のトラストチェーンを信頼していますので、Root CAまでたどれるような偽の証明書の場合、偽物かどうかの区別はできず、悪意のある中間者はメールを詐取可能です。
おわりに
すでに、メール受信サーバーがTLS1.2に対応しているのであれば、ぜひ、Webサーバーを立ててMTA-STSのポリシーを宣言してみてください。
MTA-STSに対応しているクライアントは当然TLS1.2以上に対応していますので、メールが届くなくなるということはありません。
参考資料
RFC8461
送信ドメイン認証・暗号化 Deep Dive! (自分の発表資料ですが・・・)