Upgrade to Pro — share decks privately, control downloads, hide ads and more …

送信ドメイン認証・暗号化 Deep Dive!

送信ドメイン認証・暗号化 Deep Dive!

送信ドメイン認証SPF, DKIM, DMARCの復習と、暗号技術であるMTA-STS, DANE, TLS-RPTやDNSSECを紹介し、それぞれの仕組みや具体的な設定方法について、詳しく掘り下げて説明します。
また、今回オランダ政府の運営するセキュリティチェックサイトInternet.nlで、上記の技術を使って100点を目指してかなり頑張ってみたのでその内容を共有したいと思います。
全体的な概要を知りたい方はもちろん、より深い内容を知りたいマニアの方も楽しめると思います。

HIRANO Yoshitaka

November 11, 2020
Tweet

More Decks by HIRANO Yoshitaka

Other Decks in Technology

Transcript

  1. 自己紹介 名前 平野 善隆 所属 株式会社クオリティア チーフエンジニア 資格等 Licensed Scrum

    Master Certified Scrum Developer 主な活動 M3AAWG JPAAWG IA Japan 迷惑メール対策委員会 迷惑メール対策推進協議会 メッセージング研究所(MRI) Audax Randonneurs Nihonbashi
  2. メールとの関わり 1990 パソコン通信などでメールに触れる 199x ドメインを取得して近所のISPに個人のサーバーを置 かせてもらって運用開始 2000 外人さんの多い会社に転職したのでメールの漢字に ふりがなを付けたりして遊ぶ (のちのhiragana.jp)

    個人のサーバーをちゃんとしたデータセンターに移 動。imail.ne.jpというドメインを取って一攫千金を 夢見るが挫折 2004 メールの会社に入社 以降 スパムフィルタ、誤送信防止製品の開発やサービス の立ち上げ。PPAPの礎を築く。 https://bit.ly/3pgX4Qk Speaker Deck
  3. メールセキュリティ技術 SPF DKIM 誤送信 防止 無害化 Password ZIP Anti Phishing

    Anti SPAM DNS SEC SMTP AUTH DANE MTA- STS START TLS BIMI ARC DMARC TLSRPT Anti Virus Virus Filter Sand box 安心 マーク なんかいろいろあって よく分からない
  4. 何から守りたいのか クオリティア メール サーバ メール サーバ なりすまし 乗っ取り 盗聴 改ざん

    盗難 漏洩 ウィルス メール サーバ フィッシング メール サーバ なりすまし
  5. Emailを守るための技術 •なりすまし・改ざん・フィッシング •乗っ取り・踏み台 •盗聴・なりすまし受信 •スパム・マルウェア •情報漏洩 SPF DKIM DMARC ARC

    BIMI POP before SMTP SMTP AUTH MFA STARTTLS MTA-STS TLSRPT DANE DNSSEC AntiSPAM AntiVirus SandBox Active! zone 一時保留 PasswordZIP WebDownload Active! gate
  6. 一方 日本では SPF SPF -all DMARC 厳しい DMARC DNSSEC STARTTLS

    MTA-STS DANE オランダ政府(※1) 94% 92% 94% 59% 93% 98% - 81% go.jp (※2) 93% 73% 7.0% 1.5% 5.5% 58% 0% 0% .jp (※3) 62% 11% 1.5% 0.3% 0.04% 54% 0.004% (13件) 0.002% (6件) https://www.forumstandaardisatie.nl/sites/bfs/files/rapport-meting-informatieveiligheidstandaarden-maart-2020.pdf ※1 オランダ政府データ (2020/03) ※2 QUALITIA独自調べ go.jp(全てではない)のうちMXのあるドメイン(サブドメインは含まない)に対する割合 N=330 (2020/11) ※3 QUALITIA独自調べ jpドメイン(全てではない)のうちMXのあるドメイン(サブドメイン含む)に対する割合 N=約32万 (2020/10) 0 20 40 60 80 100 SPF SPF(-all) DMARC 厳しいDMARC DNSSEC STARTTLS DANE オランダ政府 go.jp .jp
  7. SPFがないとき 192.0.2.1 203.0.113.1 Env From: [email protected] From: [email protected] Subject: お振り込みください

    いつもお世話になっております。 ・・・・ 振り込みね。ポチっと。 × クオリティア
  8. SPFがあるとき 192.0.2.1 Env From: [email protected] From: [email protected] Subject: お振り込みください AR:

    spf=pass いつもお世話になっております。 ・・・・ qualitia.co.jp txt “v=spf1 ip4:192.0.2.1 –all” Envelope FromからIPをチェック ◦ 本物だな。振り込みっと。 クオリティア
  9. SPFがあるとき 192.0.2.1 203.0.113.1 Env From: [email protected] From: [email protected] Subject: お振り込みください

    AR: spf=fail いつもお世話になっております。 ・・・・ qualitia.co.jp txt “v=spf1 ip4:192.0.2.1 –all” 偽物っぽいなぁ × クオリティア
  10. SPFの書き方 example.jp TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.32/28 –all" 送信元サーバーのIPアドレスを記述する 192.0.2.1からの許可 それ以外は不許可

    example.jp TXT "v=spf1 +ip4:192.0.2.1 +ip4:192.0.2.32/28 –all" 許可するものは+。省略可能。 こんな書き方でも同じ 192.0.2.32/28からも許可
  11. 間違ったSPFの設定例 example.jp txt "v=spf1 ip4:192.0.2.0/24 –all" example.jp txt "v=spf1 include:_spf.google.com

    –all" SPFのレコードが複数存在する example.jp txt "v=spf1 ip4:192.0.2.0/24 include:_spf.google.com –all" × 0.6% (N=約20万) If the resultant record set includes more than one record, check_host() produces the "permerror" result. RFC7208 4.5
  12. 間違ったSPFの設定例 example.jp txt "v=spf1 include:spf1.example.jp include:spf2.example.jp .... –all" spf1.example.jp txt

    "v=spf1 たくさんinclude" DNSのlookupが11回以上 example.jp txt "v=spf1 ip4:192.0.2.0/24 .... –all" × 0.9% (N=約20万) 一番多いのは90回!
  13. 間違ったSPFの設定例 example.jp txt "v=spf1 ip:192.0.2.1 -all" example.jp txt "v=spf1 ipv4:192.0.2.1

    -all" example.jp txt "v=spf1 ip4: 192.0.2.1 -all" example.jp txt "v=spf1 ip4:192.0.2.1 192.0.2.2 -all" example.jp txt "v=spf1 ip4:spf.example.jp -all" example.jp txt "v=spf1 inciude:spf.example.jp -all" example.jp txt "v=spf1 include:192.0.2.1 -all" example.jp txt "v=spf1 ip4:192.0.2.1 -all MS=ms12345678" 文法間違い × 0.5% (N=約20万)
  14. SPFがあっても 192.0.2.1 203.0.113.1 Env From: jiro@悪徳グループ.example From: [email protected] Subject: お振り込みください

    AR: spf=none いつもお世話になっております。 ・・・・ qualitia.co.jp txt “v=spf1 ip4:192.0.2.1 –all” 振り込みね。ポチっと。 クオリティア Env FROMは 自分のところから
  15. 悪徳グループのSPFで認証 192.0.2.1 203.0.113.1 Env From: jiro@悪徳グループ.example From: [email protected] Subject: お振り込みください

    AR: spf=pass いつもお世話になっております。 ・・・・ 悪徳グループ.example txt “v=spf1 ip4:203.0.113.1 –all” qualitia.co.jp txt “v=spf1 ip4:192.0.2.1 –all” SPF PASSで安心! 振り込み、ポチっと。 クオリティア SPFも書いとこ
  16. DKIM-Signature: v=1; d=qualitia.co.jp; s=s1; h=From:Subject; b=abcdef・・・・ From: [email protected] Subject: お振り込みください

    いつもお世話になっております。 ・・・・ DKIMがあるとき 署名して送ります s1._domainkey.qualitia.co.jp txt “v=DKIM1;p=ABCDEF...” 暗号化 Public Key Private Key hash クオリティア
  17. DKIM-Signature: v=1; d=qualitia.co.jp; s=s1; h=From:Subject; b=abcdef・・・・ From: [email protected] Subject: お振り込みください

    AR: dkim=pass いつもお世話になっております。 ・・・・ DKIMがあるとき 安心して振り込みね。ポチっと。 s1._domainkey.qualitia.co.jp txt “v=DKIM1;p=ABCDEF...” 複合化 Public Key Private Key hash ◦ クオリティア
  18. DKIM-Signature: v=1; d=qualitia.co.jp; s=s1; h=From:Subject; b=abcdef・・・・ From: [email protected] Subject: 泥棒にお振り込みください

    いつもお世話になっております。 ・・・・ DKIMがあるとき 署名したものを 改ざんします s1._domainkey.qualitia.co.jp txt “v=DKIM1;p=ABCDEF...” Public Key Private Key クオリティア
  19. DKIM-Signature: v=1; d=qualitia.co.jp; s=s1; h=From:Subject; b=abcdef・・・・ From: [email protected] Subject: 泥棒にお振り込みください

    AR: dkim=fail いつもお世話になっております。 ・・・・ DKIMがあるとき 改ざんされてるかも?! s1._domainkey.qualitia.co.jp txt “v=DKIM1;p=ABCDEF...” 複合化 Public Key Private Key hash × クオリティア
  20. デジタル署名 Hash ・元のデータを固定長のデータに変換する ・基本的に戻せない 誕生日占い 自分の誕生日、誕生月、誕生年の数字を足してください。 その数字を一桁ずつ分けた上で、全てを足しててください。 この計算を、数字が一桁になるまで続けましょう 1972年7月1日 ⇨

    1972 + 7 + 1 = 1980 ⇨ 1 + 9 + 8 + 0 = 18 ⇨ 1 + 8 = 9 1:アイデアマン 2:平和主義 3:お祭り好き 4:保守的 5:パイオニア 6:ロマンチスト 7:インテリ 8:大物 9:エンターテイナー md5, sha1, sha256
  21. デジタル署名 公開鍵暗号 ・暗号化する側の鍵(秘密鍵:Private Key)と 復号するの鍵(公開鍵: Public Key)が異なる ・変換されたデータは元に戻せる RSA, ECDSA,

    Ed25519, ... 公開鍵で暗号化 ➔ 秘密鍵で復号  秘密鍵を持っている人しか見えない 秘密鍵で暗号化 ➔ 公開鍵で復号  秘密鍵を持っている人が書いたことがわかる
  22. デジタル署名 署名 ・データからHashを生成 ・Hashを秘密鍵で暗号化 ・これを署名として公開 ・公開鍵ももちろん公開 検証 ・データからHash(①)を生成 ・署名を公開鍵で複合(②) ・①と②が一致するかどうか確認

    Hashと公開鍵暗号の秘密鍵を使います ぼくドラえもんです ⇨ abcde abcde ⇨ くぁwせdrftgyふじこlp ぼくドラえもんです (署名:くぁwせdrftgyふじこlp) ぼくドラえもんです ⇨ abcde くぁwせdrftgyふじこlp ⇨ abcde abcde == abcde Hashと公開鍵暗号の公開鍵を使います
  23. DKIM署名の手順 • 本文をCanonicalize  いい感じに単純にする • 本文のHashを作成 • 本文のHashを含む仮のDKIM-Signatureを作成 •

    署名するヘッダ + 仮のDKIM-Signatureを Canonicalize • それのHashを作成 • 暗号化 • b=に追加
  24. 下準備 Private Key / Public Keyの作成 openssl genrsa -out private.pem

    2048 openssl rsa -in private.pem -pubout -out public.key
  25. 本文のHashを作成 本文をCanonocalize / Hashを作成 echo -n 'test¥r¥n' | openssl sha256

    -binary | openssl base64 -e g3zLYH4xKxcPrHOD18z9YfpQcnk/GaJedfustWU5uGs
  26. 仮のDKIM-Signatureを作成 DKIM-Signature: a=rsa-sha256; c=relax/simple; d=hirano.cc; s=s1; t=163777045; h=from:to:subject; bh=g3zLYH4xKxcPrHOD18z9YfpQcnk/GaJedfustWU5uGs; b=

    Canonicalizeの方法 暗号-Hashの方法 署名者 署名日時 セレクター 署名するヘッダー 本文のHash
  27. ヘッダのHashを作成 「ヘッダ + 仮のDKIM-Signature」の署名を作成 echo -n 'from:[email protected]¥r¥nto:[email protected]¥r¥nsubject:test¥r¥ndkim- signature:a=rsa-sha256; c=relax/simple; d=hirano.cc;

    s=s1; t=163777045; h=from:to:subject; bh=g3zLYH4xKxcPrHOD18z9YfpQcnk/GaJedfustWU5uGs; b=' | openssl sha256 -sign private.pem -binary | openssl base64 -e AciJkTMYYH6s2S/dvrriZlaDJ9uaAd5XjiYGSHc+95K1oFs4xmkhrQKbNwzjbYiW KOTl3llRPydNNOmnw4LgtRbl0LCLPnOzIXbfklwq0mMGKQhTCeRIdmzJxzoKCwAF vuWnRBTOJmFLWf4WCs1pqEpYV0SharRW8uCbW8cBGp8p0PWj2q51Fend405KImea Odknekp9HmhgnuIKFHaLxA/KaW27h+OcUX1W7SdnXDmaEpi3uLJY/HIedxM+aZUa sFrxzhHsZkJE74ZZMn2xRLcE7VGRB3WgKrJtZCnZ0NuXHle+Fr0KavT3DOX9vQ8x v/dYwjhNhpwnl9jFtkGT9A==
  28. 完成 DKIM-Signature: a=rsa-sha256; c=relax/simple; d=hirano.cc; s=s1; t=163777045; h=from:to:subject; bh=g3zLYH4xKxcPrHOD18z9YfpQcnk/GaJedfustWU5uGs; b=AciJkTMYYH6s2S/dvrriZlaDJ9uaAd5XjiYGSHc+95K1oFs4xmkhrQKbNwzjbYiW

    KOTl3llRPydNNOmnw4LgtRbl0LCLPnOzIXbfklwq0mMGKQhTCeRIdmzJxzoKCwAF vuWnRBTOJmFLWf4WCs1pqEpYV0SharRW8uCbW8cBGp8p0PWj2q51Fend405KImea Odknekp9HmhgnuIKFHaLxA/KaW27h+OcUX1W7SdnXDmaEpi3uLJY/HIedxM+aZUa sFrxzhHsZkJE74ZZMn2xRLcE7VGRB3WgKrJtZCnZ0NuXHle+Fr0KavT3DOX9vQ8x v/dYwjhNhpwnl9jFtkGT9A==
  29. 最近のDKIM事情 •RFC8301: Cryptographic Algorithm and Key Usage Update to DomainKeys

    Identified Mail (DKIM) (2018/1月) ・署名も検証もrsa-sha256を使いましょう(MUST) ・rsa-sha1はやめましょう(MUST) ・署名は1024bit以上(MUST)、2048bit以上(SHOULD) ・検証は1024bit~4096bit(MUST) ※ しかし、2048bitはDNSに書けるサイズ255バイトを超えてしまう なりすまし・改ざんから守る もう、今どきいいですよね? 有効なRSA署名のうち18%の署名者が2048bitを使用 ※クオリティア調べ
  30. 最近のDKIM事情 •RFC8463: A New Cryptographic Signature Method for DomainKeys Identified

    Mail (DKIM) (2018/9月) ・署名側は実装しましょう(SHOULD) ・検証側は実装必須(MUST) ・後方互換性のために署名はEd25519-SHA256と RSA-SHA256(1024bit以上)を2つ記述する Ed25519-SHA256を使いましょう BASE64後のサイズが44バイトしかないのでDNSの問題もない なりすまし・改ざんから守る
  31. DKIMがあっても From: [email protected] Subject: お振り込みください AR: dkim=none いつもお世話になっております。 ・・・・ 振り込みね。ポチっと。

    s1._domainkey.qualitia.co.jp txt “v=DKIM1;p=ABCDEF...” Private Key DKIMがないときと 変わらない クオリティア DKIMなしで 送ったらええやん
  32. もしかしたら? From: [email protected] Subject: お振り込みください AR: dkim=none いつもお世話になっております。 ・・・・ あれ?クオリティアさん

    普段、署名付いてるよね s1._domainkey.qualitia.co.jp txt “v=DKIM1;p=ABCDEF...” Private Key DKIMがないときと 変わらない クオリティア DKIMなしで 送ったらええやん
  33. DKIM-Signature: v=1; d=悪徳グループ.example; s=aku; h=From:Subject; b=abcdef・・・・ From: [email protected] Subject: お振り込みください

    いつもお世話になっております。 ・・・・ DKIMがあっても 署名して送ります aku._domainkey.悪徳グループ.example txt “v=DKIM1;p=ABCDEF...” 暗号化 悪徳グループの Private Key Private Key hash クオリティア
  34. DKIM-Signature: v=1; d=悪徳グループ.example; s=aku; h=From:Subject; b=abcdef・・・・ From: [email protected] Subject: お振り込みください

    AR: dkim=pass いつもお世話になっております。 ・・・・ DKIMがあっても ポチっと。 複合化 悪徳グループの Public Key Private Key hash ◦ aku._domainkey.悪徳グループ.example txt “v=DKIM1;p=ABCDEF...” 悪徳グループの Private Key クオリティア
  35. 悪徳グループのSPFで認証 (dmarc p=none) 192.0.2.1 203.0.113.1 Env From: jiro@悪徳グループ.example From: [email protected]

    Subject: お振り込みください AR: spf=pass, dmarc=Fail いつもお世話になっております。 ・・・・ 悪徳グループ.example txt “v=spf1 ip4:203.0.113.1 –all” _dmarc.qualitia.co.jp txt “v=DMARC1; p=none” dmarc=failだわ。 × クオリティア
  36. 悪徳グループのSPFで認証 (dmarc p=reject) 192.0.2.1 203.0.113.1 Env From: jiro@悪徳グループ.example From: [email protected]

    Subject: お振り込みください AR: spf=pass, dmarc=Fail いつもお世話になっております。 ・・・・ 悪徳グループ.example txt “v=spf1 ip4:203.0.113.1 –all” × 届かない _dmarc.qualitia.co.jp txt “v=DMARC1; p=reject” × クオリティア
  37. DKIM-Signature: v=1; d=悪徳グループ.example; s=aku; h=From:Subject; b=abcdef・・・・ From: [email protected] Subject: お振り込みください

    AR: dkim=pass, dmarc=fail いつもお世話になっております。 ・・・・ 悪徳グループのDKIM署名 悪徳グループの Public Key aku._domainkey.悪徳グループ.example txt “v=DKIM1;p=ABCDEF...” 悪徳グループの Private Key × _dmarc.qualitia.co.jp txt “v=DMARC1; p=reject” ×届かない クオリティア
  38. 厳しい設定 smtpd_tls_security_level = may smtpd_tls_key_file = /etc/letsencrypt/live/example.jp/privkey.pem smtpd_tls_cert_file = /etc/letsencrypt/live/example.jp/fullchain.pem

    smtpd_tls_ciphers = high smtpd_tls_mandatory_ciphers = high smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1 smtpd_tls_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1 tls_high_cipherlist = EECDH+AESGCM tls_preempt_cipherlist = yes Postfixの場合
  39. STARTTLSがあるとき 送信 サーバ 受信 サーバ EHLO sender.example.jp 250-recv.example.jp 250-STARTTLS 250

    OK STARTTLS 220 ready for TLS なんやかんや やり取り EHLO sender.example.jp ここから暗号化 STARTTLS対応 このあたりは 平文
  40. 途中で改ざんされると 送信 サーバ 受信 サーバ EHLO sender.example.jp 250-recv.example.jp 250-STARTTLS 250

    OK FROM: [email protected] 250-recv.example.jp 250-XXXXXXXX 250 OK ふむふむ TLS非対応 なのね MITMさん 盗み放題 ちょこっと 書き換え 暗号化せずに 送りましょ STARTTLS Downgrade Attack
  41. TLS Protocol Downgrade Attack 送信 サーバ 受信 サーバ STARTTLS 220

    Ready for TLS ClientHello (TLS1.2でつなぎたいです) TLS1.2は非対 応なのね MITMさん 盗み放題 捨てて しまえ TLS1.1で 送りましょ TLS Handshake開始
  42. MTA-STSがあるとき クオリティア メール サーバ メール サーバ 暗号化に対応 していなければ送らない _mta-sts.qualitia.co.jp. IN

    TXT "v=STSv1; id=20191114123000Z;" version: STSv1 mode: enforce mx: mx1.qualitia.co.jp max_age: 1296000 https://mta-sts.qualitia.co.jp/.well-known/mta-sts.txt =盗まれない ポリシー
  43. MTA-STSがあるとき 送信 サーバ 受信 サーバ mx.example.jp EHLO sender.example.com 250-recv.example.jp 250-STARTTLS

    250 OK STARTTLS 220 ready for TLS Webサーバ https://mta-sts.受信ドメイン/.well-known/mta-sts.txt mode: enforce mx: mx.example.jp
  44. 改ざんされた場合でも 送信 サーバ 受信 サーバ mx.example.jp EHLO sender.example.com 250-recv.example.jp 250-STARTTLS

    250 OK Webサーバ https://mta-sts.受信ドメイン/.well-known/mta-sts.txt mode: enforce mx: mx.example.jp 250-recv.example.jp 250-XXXXXXXX 250 OK ふむふむ TLS非対応 なのね 終了 ちょこっと 書き換え MITMさん
  45. MTA-STSの設定方法 _mta-sts.example.jp txt "v=STSv1; id=20201111010203" 受信するメールアドレス: [email protected] 受信メールサーバー: mx.example.jp DNSの設定

    version: STSv1 mode: enforce mx: mx.example.jp max_age: 1296000 Webの設定 https://mta-sts.example.jp/.well-known/mta-sts.txt none testing enforce *.example.jpのようにも書けます
  46. レポートの例 (問題ない場合) { "organization-name": "Google Inc.", "date-range": { "start-datetime": "2020-09-07T00:00:00Z",

    "end-datetime": "2020-09-07T23:59:59Z" }, "contact-info": "[email protected]", "report-id": "2020-09-07T00:00:00Z_hirano.cc", "policies": [ { "policy": { "policy-type": "sts", "policy-string": [ "version: STSv1", "mode: testing", "max_age: 86400", "mx: *.hirano.cc" ], "policy-domain": "hirano.cc" }, "summary": { "total-successful-session-count": 5, "total-failure-session-count": 0 } } ] } 成功 5通 失敗 0通
  47. レポートの例 (問題のある場合) { "organization-name": "Google Inc.", "date-range": { "start-datetime": "2019-10-01T00:00:00Z",

    "end-datetime": "2019-10-01T23:59:59Z" }, "contact-info": "[email protected]", "report-id": "2019-10-01T00:00:00Z_hirano.cc", "policies": [ { "policy": { "policy-type": "sts", "policy-string": [ "version: STSv1", "mode: testing", "max_age: 86400", "mx: *.hirano.cc" ], "policy-domain": "hirano.cc" }, "summary": { "total-successful-session-count": 0, "total-failure-session-count": 55 }, 失敗 55通 "failure-details": [ { "result-type": "validation-failure", "sending-mta-ip": "209.85.219.198", "receiving-ip": "210.158.71.76", "receiving-mx-hostname": "ah.hirano.cc", "failed-session-count": 2 }, { "result-type": "starttls-not-supported", "sending-mta-ip": "209.85.222.201", "receiving-ip": "210.158.71.76", "receiving-mx-hostname": "ah.hirano.cc", "failed-session-count": 1 }, .... 省略 .... ] } ] }
  48. DNSSECのトラストチェイン example.jp. IN MX 10 mail.example.jp. DNSKEY (ZSK) DNSKEY (KSK)

    DNSKEY (ZSK) DNSKEY (KSK) DS 署名 署名 Hashを預ける 署名 署名 DNSKEY (ZSK) DNSKEY (KSK) DS 署名 署名 example.jpのzone ルートのzone jpのzone Hashを預ける
  49. DANE クオリティア メール サーバ メール サーバ CAの代わりにDNSSECを信頼 DNSSEC 公開鍵証明書認証局(CA) 不要

    ルートDNS DNSSEC 信頼 _25._tcp.mx1.qualitia.co.jp. IN TLSA 3 0 1 2B73BB905F…" mx1.qualitia.co.jp Public KeyのHash ◦ Public Key
  50. DANEの設定方法 openssl x509 -in cert.pem -pubkey -noout | openssl rsa

    -pubin -outform DER | openssl sha256 (stdin)= 293f3944e435835ec797acbbe52ffb1bc8e 6637879fbe62d9b6195479e01f67e Public KeyのHashを作成
  51. DANEの設定方法 openssl s_client -connect mx1.example.jp:25 -starttls smtp < /dev/null |

    openssl x509 -pubkey –noout | openssl rsa -pubin -outform DER | openssl sha256 (stdin)= 293f3944e435835ec797acbbe52ffb1bc8e 6637879fbe62d9b6195479e01f67e はじめての設定なら、 サーバーから証明書を取り出すのもあり
  52. DNSに追加 _25._tcp.mx1.example.jp TLSA 3 1 1 293f3944e... メールサーバー メールアドレスのドメイン部分ではありません! 受信するメールアドレス:

    [email protected] 受信メールサーバー: mx1.example.jp 0: Hashなし 1: SHA256 2: SHA512 ※TLSのKeyを入れ替えるときにはTLSAレコードを 先に書いて、DNSのキャッシュ期間が過ぎたらメー ルサーバーの設定を新しいKeyに変更し、古いTLSA レコードを削除します。
  53. DANE DNSSECに対応していて、 TLSAレコードがあれば、 STARTTLSを必須で使用し、 PublicKeyをTLSAの値で検証します。 Microsoftの対応予定 送信側の対応2020年末まで 受信側の対応2021年末まで (by M3AAWG

    General Meeting (2020/06)) TLS DANE Arcor yes no AOL yes no Bund.de yes yes Comcast yes yes Freenet yes yes Gmail yes no GMX yes yes Kabel Deutschland yes yes O2 yes no Outlook.com yes no Riseup yes yes T-Online yes no Unitymedia yes yes Vodafone yes yes web.de yes yes Yahoo yes no https://posteo.de/en/help/to-and-from-which-other-email-providers-will-my-emails-be-encrypted
  54. 経路暗号化まとめ 何もなし STARTTLS MTA-STS DNSSEC DANE zip暗号化 経路上の暗号化 × ◦

    ◦ - ◦ △ STARTTLS Downgrade攻撃 - × ◦ - ◦ - TLS Protocol Downgrade攻撃 - × ◦ - △ - 偽の証明書 - × × - ◦ - なりすまし受信 × × × ◦ ◦ × ◦ 安全 △ 安全であるが完全ではない × 安全ではない - 影響を受けない
  55. Require TLS RFC8689 (2019/11) SMTPで MAIL FROM: <[email protected]> REQUIRETLS ヘッダに

    TLS-Required: No と書くことで、機能をOffにできます。
  56. まとめ • DMARC 使いましょう • STARTTLS 使いましょう • MTA-STS 使いましょう

    • DNSSEC 使いましょう • DANE 使いましょう • internet.nlで100点になるまでの道は険しい • オランダすごいよ Thank You!
  57. ARC

  58. ARCがあれば arc=passですね。 Private Key クオリティア メーリングリスト サーバ ml.example.jp ARC-Seal: i=1;

    cv=none; d=ml.example.jp;... ARC-Message-Signature: i=1; d=ml.example.jp; h=from:subject:dkim-signature:... ARC-Authentication-Result: i=1; ml.example.jp; dkim=pass; spf=pass; dmarc=pass DKIM-Signature: v=1; d=qualitia.co.jp; b=abcdef・・・・ From: [email protected] Subject: [◦◦ML:1234]久しぶりの投稿 AR: dkim=fail, arc=pass こんにちは。おひさしぶりです。 ・・・・
  59. dig コマンドで確認 DNSSEC非対応ドメイン dig qualitia.co.jp ;; ->>HEADER<<- opcode: QUERY, status:

    NOERROR, id: 23896 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; ANSWER SECTION: qualitia.co.jp. 1443 IN A 54.65.37.180 DNSSEC非対応ドメイン + DNSSEC非対応リゾルバー DNSSEC非対応ドメイン + DNSSEC対応リゾルバー ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6419 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; ANSWER SECTION: qualitia.co.jp. 3600 IN A 54.65.37.180 同じです
  60. dig コマンドで確認 DNSSEC対応ドメイン dig mail.interlingua.co.jp ;; ->>HEADER<<- opcode: QUERY, status:

    NOERROR, id: 17088 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; ANSWER SECTION: mail.interlingua.co.jp. 0 IN A 210.158.71.76 DNSSEC対応ドメイン + DNSSEC非対応リゾルバー DNSSEC対応ドメイン + DNSSEC対応リゾルバー ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10109 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; ANSWER SECTION: mail.interlingua.co.jp. 300 IN A 210.158.71.76 同じです DNSSEC対応ドメインは adフラグが付きます
  61. dig コマンドで確認 なりすまされているDNSSEC対応ドメイン dig dnssec-failed.org ;; ->>HEADER<<- opcode: QUERY, status:

    NOERROR, id: 14060 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; ANSWER SECTION: dnssec-failed.org. 6510 IN A 69.252.80.75 DNSSEC対応ドメイン + DNSSEC非対応リゾルバー DNSSEC対応ドメイン + DNSSEC対応リゾルバー ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 63229 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 DNSSEC対応リゾルバーでは SERVFAILになります IPは返りません DNSSEC非対応リゾルバーは 答えを返してしまいます adフラグはありません VPNを使っているとご自宅のDNSサーバーから SERVFAILを受け取っても、その後、会社のDNSサー バーに聞きに行ってNOERRORになるかも知れません
  62. DNSSEC対応/非対応まとめ DNSSEC非対応ドメイン DNSSEC対応ドメイン なりすまされた DNSSEC対応ドメイン DNSSEC非対応リゾルバ adフラグなし adフラグあり adフラグなし DNSSEC対応リゾルバ

    adフラグなし adフラグあり adフラグなし DNSSEC非対応ドメイン DNSSEC対応ドメイン なりすまされた DNSSEC対応ドメイン DNSSEC非対応リゾルバ 回答あり 回答あり 回答あり DNSSEC対応リゾルバ 回答あり 回答あり SERVFAIL adフラグ 応答
  63. レコードセットの署名 •dig +dnssec interlingua.co.jp mx interlingua.co.jp. 294 IN MX 10

    mail.interlingua.co.jp. interlingua.co.jp. 294 IN RRSIG MX 13 3 300 20200817003038 20200802230038 55501 interlingua.co.jp. g5r2rLGrbrX6aYap2p/wDgJgL/LWs18/aQRtZAKDYQxFkF6eQg0Xy0c/ pNdysOWDNRQxO/4zom+Wvb87YwYl+g== interlingua.co.jp. 6 IN DNSKEY 256 3 13 ( 6zijMNFnm5+VuhJQqRG6ehQy0aDjOXYXZmx7yTL46TKp RI9p9cCx+aDBhzwa5eK19vCf1MiVoMqIVDBqvFoU8g== ) ; ZSK; alg = ECDSAP256SHA256 ; key id = 55501 interlingua.co.jp. 6 IN DNSKEY 257 3 13 ( rpYAYd2eS/tow2Be8qrAMHQkl4Lwxp5fsSPQmt9137/s 3mDX72NyvjXIdYaNcPPUEh5F4FM4iyylFtx9LS4CvA== ) ; KSK; alg = ECDSAP256SHA256 ; key id = 63661 •dig +multi interlingua.co.jp dnskey 署名 公開鍵 署名した人
  64. レコードセットの署名 interlingua.co.jp. 294 IN MX 10 mail.interlingua.co.jp. interlingua.co.jp. 294 IN

    RRSIG MX 13 3 300 20200817003038 20200802230038 55501 interlingua.co.jp. g5r2rLGrbrX6aYap2p/wDgJgL/LWs18/aQRtZAKDYQxFkF6eQg0Xy0c/ pNdysOWDNRQxO/4zom+Wvb87YwYl+g== interlingua.co.jp. 6 IN DNSKEY 256 3 13 ( 6zijMNFnm5+VuhJQqRG6ehQy0aDjOXYXZmx7yTL46TKp RI9p9cCx+aDBhzwa5eK19vCf1MiVoMqIVDBqvFoU8g== ) ; ZSK; alg = ECDSAP256SHA256 ; key id = 55501 署名 公開鍵 権威DNSサーバーはMXレコードセットのHashをZSK(Zone Signing Key)の秘密鍵で暗号化し、 RRSIG MXとして公開 フルリゾルバーはRRSIGをZSKの公開鍵で復号し、MXレコードセットのHashと合っているかどう かを確認 MXレコードセットはZSKの所有者interlingua.co.jpが書いたものから改ざんされていないことがわかる
  65. 公開鍵の署名 •dig +dnssec +multi interlingua.co.jp dnskey interlingua.co.jp. 300 IN DNSKEY

    256 3 13 ( 6zijMNFnm5+VuhJQqRG6ehQy0aDjOXYXZmx7yTL46TKp RI9p9cCx+aDBhzwa5eK19vCf1MiVoMqIVDBqvFoU8g== ) ; ZSK; alg = ECDSAP256SHA256 ; key id = 55501 interlingua.co.jp. 300 IN DNSKEY 257 3 13 ( rpYAYd2eS/tow2Be8qrAMHQkl4Lwxp5fsSPQmt9137/s 3mDX72NyvjXIdYaNcPPUEh5F4FM4iyylFtx9LS4CvA== ) ; KSK; alg = ECDSAP256SHA256 ; key id = 63661 interlingua.co.jp. 300 IN RRSIG DNSKEY 13 3 300 ( 20200817003032 20200802230032 63661 interlingua.co.jp. 6GYbqK+/csGs3SW70LdxvHwAHM+AAGem6G4vK4OvrJWu 4lQesbZTVO9fXHIfkSZnx0QqppKSEt9SBhUdVF91lg== ) 署名 KSKの公開鍵 ZSKの公開鍵 権威DNSサーバーはDNSKEYレコードセットのHashをKSK(Key Signing Key)の秘密鍵で暗号化し、 RRSIG DNSKEYとして公開 公開鍵はKSKの所有者interlingua.co.jpが書いたものから改ざんされていないことがわかる
  66. 鍵のHash(DS)を親Zoneに預ける interlingua.co.jp. 300 IN DNSKEY 257 3 13 ( rpYAYd2eS/tow2Be8qrAMHQkl4Lwxp5fsSPQmt9137/s

    3mDX72NyvjXIdYaNcPPUEh5F4FM4iyylFtx9LS4CvA== ) ; KSK; alg = ECDSAP256SHA256 ; key id = 63661 KSKの公開鍵のHash。 DSと呼びます KSKの公開鍵 KSK(Key Signing Key)の公開鍵のHashを親のZoneに登録しておく •dig interlingua.co.jp ds interlingua.co.jp. 4520 IN DS 63661 13 2 975FAD7B7EF66EEB94F2D364EE1B8A84D9F87C445655FB383A064BD4 78D726DC このレコードはjp.のzoneに存在 interlingua.co.jpのKSKの公開鍵が改ざんされていないことをjpが保証する
  67. 親ZoneでDSを署名 •dig +dnssec interlingua.co.jp ds interlingua.co.jp. 4087 IN DS 63661

    13 2 975FAD7B7EF66EEB94F2D364EE1B8A84D9F87C445655FB383A064BD4 78D726DC interlingua.co.jp. 4087 IN RRSIG DS 8 3 7200 20200831174502 20200801174502 32163 jp. N8AnyWRKCGnaZmsLPhvkOoUuhKKzwNcPvATKCr4dzTCcmaWFpNDKNEU7 gddNckfgg2VxtRpvV2ZT5MPcwhWpqWM1O7p+TxX3fz3pYm/7RjoCjvK6 p5n4IdSmkHCT+9ThHD3popKUWXI/KtXkgXUCkFatkTFxt9uTJOmsXxN/ OVs= jp. 86394 IN DNSKEY 256 3 8 ( AwEAAa9eY9Ns9TIFqb+iYkU9C7n80Y0M1L2NZcEbvmCJ frJqQC09tA+7TJbJ7y3k5q+wtYznOpGY1v2qbeTaEbaR vr7ZFa/OQUZbl7yE7qNDNVl7+s5/zXFq09hRWoFFaWgY 5rC75FmeVambDibge+G0yIGNsD1PsYQ/7oG3mujg+0jn ) ; ZSK; alg = RSASHA256 ; key id = 32163 •dig +multi jp dnskey 署名 公開鍵 署名した人
  68. DNSSECのトラストチェイン interlingua.co.jp. IN MX 10 mail.interlingua.co.jp. DNSKEY (ZSK) DNSKEY (KSK)

    DNSKEY (ZSK) DNSKEY (KSK) DS 署名 署名 Hashを預ける 署名 署名 DNSKEY (ZSK) DNSKEY (KSK) DS 署名 署名 interlingua.co.jpのzone ルートのzone jpのzone Hashを預ける