MTA-STS を設定してみた

Pocket

こんにちは。インフラエンジニアの末廣です。
TECHSCORE Advent Calendar 2018 22日目の記事です。

2018年9月に RFC 8461 - SMTP MTA Strict Transport Security (MTA-STS) が発行されたので設定してみました。

MTA-STS が生まれた背景

MTA間の通信暗号化には STARTTLS が用いられていますが、STARTTLS は日和見暗号化であるため、送信側と受信側との間で暗号化について合意に至らなければ平文での通信になってしまいます。したがって STARTTLS は通信路上の盗聴に対しては強固なセキュリティを提供できますが、次のように STARTTLS の使用を迂回させる攻撃には無力です。

  • EHLO コマンドへの応答から "250 STARTTLS" を削除することにより、受信側が STARTTLS に対応していないかのように送信側に見せかける。
  • 偽の MX レコードを送りつけたり BGP で経路を捻じ曲げたりすることにより、偽の MX に接続させる。

このような攻撃に対抗する手段として DANE がありますが、DNSSEC の設定が必要です。世の中には2種類の人間がいます。DNSSEC を設定したい人とそうではない人です。後者(私もです)のために DNSSEC を必要としない対抗策として MTA-STS が考えられたそうです。

MTA-STS による問題の解決

MTA-STS では、メール受信側が DNS と HTTPS を使って次の情報をポリシーとして公開します。

  • 認証局から発行された証明書を用いた TLS に対応している正規の MX ホストのリスト
  • 上記に反している場合の送信側の振る舞い方

送信側は、このポリシーを取得してメール送信先の MX を検証することにより、上記に挙げたような STARTTLS を迂回させる攻撃を検知することができます。

SMTP のためのプロトコルなのに HTTPS を用いるのは気持ち悪いですが、HTTPS によってセキュリティを担保しています。

MTA-STS の設定

受信側の MTA-STS 対応は簡単です。次の3ステップで設定できます。

  1. 全てのメール受信サーバーに STARTTLS を設定する。
  2. MTA-STS ポリシーを作成し HTTPS で公開する。
  3. DNS に MTA-STS TXT レコードを設定する。

以下、techscore.com ドメインを例に設定内容を説明していきます。

STARTTLS 設定

TLS に用いる証明書は MX ホストの正規の証明書でなければなりません。つまり、以下の条件を満たしている必要があります。

  • SAN (Subject Alternative Name) のいずれかのエントリーが MX ホスト名にマッチすること
  • 認証局に署名された正規の証明書であること
  • 有効期限内であり、破棄されていないこと

techscore.com の MX は mail.techscore.com ですので、mail.techscore.com の証明書を取得・設定しています。

MTA-STS ポリシーの公開

対象ドメインの mta-sts サブドメインで MTA-STS ポリシーを公開します。
techscore.com では、https://mta-sts.techscore.com/.well-known/mta-sts.txt で以下の内容を公開しています。

  • "version" は "STSv1" 固定です。
  • "mode" は、送信側がポリシーの検証(MX ホスト名と証明書の検証)に失敗したときにどのように振舞うべきかの指定です。次の3つのうちのいずれかを設定します。
    • "enforce": メールを送信してはならない
    • "testing": メールを送信する(後述する TLSRPT に対応している場合は検証失敗のレポートも行なう)
    • "none": MTA-STS 設定がなかったことにしてメールを送信する(MTA-STS 対応を取りやめるときに用いる)
  • "max_age" はポリシーの有効期間の最大値で、秒数で指定します。1週間以上が推奨されています。
  • "mx" は MX ホスト名です。ワイルドカード(例:*.example.com)での指定も可能です。1行で1ホストの設定をするので、MX ホストが複数ある場合は "mx: ホスト名" の行を必要なだけ繰り返し記述します。

MTA-STS TXT レコードの設定

対象ドメインの _mta-sts サブドメインに MTA-STS TXT レコードを設定します。
techscore.com では、以下のように設定しています。

  • "v" は "STSv1" 固定です。
  • "id" は MTA-STS ポリシー更新の有無を確認するための文字列です。 ポリシーごとにユニークでなければなりませんが順序は問わないのでランダムな文字列でもよいです。メール送信側はこの値を確認することによってポリシーの再取得が必要かどうかを判断します。

以上で MTA-STS の設定は完了です。

TLSRPT の設定

TLSRPT は、攻撃や受信側の設定ミスによってメール送信できなかったり安全でない通信でメール送信せざるを得なかったりしたときに、メール送信側から受信ドメインに対してレポートするためのしくみです。MTA-STS に必須という訳ではありませんが、これを設定しておくとエラーレポートを受け取ることができるようになります。

techscore.com では次のように設定しています。

  • "v" は "TLSRPTv1" 固定です。
  • "rua" でレポートの送信先を指定します。HTTPS の URI を指定することもできます。

設定の確認

正しく設定できたかどうかはMTA-STS validatorで確認できます。

Summary の MTA-STS が OK になっていないのは、mode が "testing" になっているためです。それ以外の設定は正しいと診断してくれています。

世間の対応状況

HSTS Preload List と同様に、STARTTLS Everywhere で MTA-STS に対応しているドメインのリストが管理されています。2018年12月21日時点では 214 ドメインが登録されています。gmail.com、yahoo.com、hotmail.com、icloud.com、facebook.com などの有名どころのドメインが名を連ねていますが、jp ドメインはひとつだけでした。リストへの登録はドメイン所有者が任意で行うので、リストに掲載されていないことが MTA-STA に対応していないことを示す訳ではありませんが、日本で MTA-STS に対応しているドメインは少なそうです。

なお、このリストに掲載されているドメインの MTA-STS mode はすべて "testing" でした。普及はこれからのようです。

送信側の対応状況

受信側として対応しているメールサービスプロバイダーなら送信側としても対応しているかもしれないと考えて gmail.com、yahoo.com、icloud.com などから techscore.com にメール送信してみました。どの送信元も TLS で接続してきましたが、MTA-STS ポリシーを取得しにはきませんでした。送信側としては MTA-STS に対応してなさそうです。

送信側として MTA-STS に対応するには以下の機能を実装する必要があります。

  • MTA-STS ポリシーの取得(DNS および HTTPS)とキャッシュの管理
  • MX ホストの検証(ホスト名、証明書など)
  • MTA-STS ポリシーに従ったメール送信制御
  • (TLSRPT に対応するなら)レポートの送信

受信側と比較して送信側は対応の難易度が高いため、対応が進んでいないようです。

Postfix の公式サイトには MTA-STS に関する情報はありません。postfix-mta-sts-resolver を使えば Postfix を MTA-STA に対応させることができますが、MTA-STS のマイナーな機能は実装されていないそうです。

さいごに

2018年11月8日に開催された JPAAWG 1st General Meeting において M3AAWG から来られた Vice Chairman の方が「次は MTA-STS の推進だ」とおっしゃられていました。メールは Web と比較して TLS が普及していませんが、MTA-STS の推進によって安全にメール送信できるようになるといいですね。

参考

Pocket

Comments are closed, but you can leave a trackback: Trackback URL.