🥞

電子メールのセキュリティ技術のあれそれ

2024/04/11に公開

本記事では電子メールのセキュリティ技術であるPGP、S/MIME、SPF、DKIM、DMARCのシーケンスの詳細やそれぞれの違いについて示します。

PGP(Pretty Good Privacy)

ハイブリット暗号とメッセージダイジェストを用いてメールの暗号化と署名・検証を行います。また公開鍵の管理は認証局を利用せずPGP利用者の責任のもと行われます。

前準備

送信側・受信側共に鍵ペアを生成し、自身の公開鍵を相手に提供します。

送信側のシーケンス

  1. メールのハッシュ値を求め送信側の秘密鍵で署名を生成します。
  2. メールを使い切りでランダムな値のセッション鍵で共通鍵暗号によって暗号化します。
  3. セッション鍵を受信側の公開鍵で公開鍵暗号によって暗号化します。

受信側のシーケンス

  1. 暗号化されたセッション鍵を受信側の秘密鍵で復号します。
  2. 暗号化されたメールをセッション鍵で復号します。
  3. 暗号化されたハッシュ値を送信側の公開鍵で復号します。
  4. 受信したメールから新たにハッシュ値を求め復号したハッシュ値との一致によって署名を検証します。

S/MIME(Secure / Multipurpose Internet Mail Extensions)

公開鍵暗号とメッセージダイジェストを用いて暗号化と署名・検証を行います。また、公開鍵の管理は認証局を利用して行います。

前準備

送信側・受信側共にS/MIME証明書を相手に提供します。

送信側のシーケンス

  1. メールのハッシュ値を求め、送信側の秘密鍵で署名を行います。
  2. メールを受信側の公開鍵で暗号化します。

受信側のシーケンス

  1. 暗号化されたメールを受信者の秘密鍵で復号します。
  2. 署名を送信側の公開鍵で検証します。
  3. 受信したメールから新たにハッシュ値を求め復号したハッシュ値との一致によって署名を検証します。

PGPとS/MIMEの違い

S/MIMEがPGPと大きく異なる点は公開鍵の管理に認証局を利用する点です。認証局がS/MIME証明書(クライアント証明書)を発行することで送信側のメールアドレスに紐付く公開鍵の正当性が保証され、管理されます。
またPGPではハイブリット方式による暗号化でしたがS/MIMEでは公開鍵暗号のみで暗号化を行なっています。

SPF(Sender Policy Framework)

メールの受信者が送信者のIPアドレスを確認することでなりすましを防止する送信ドメイン認証の一つです。送信元のなりすましを防止することが目的でセキュリティが十分ではありません。そのため後述するDKIMやDMARCなどと併用されます。

前準備

送信側はDNSにTXTレコードの一種であるSPFレコードを追加します。
example.co.jp. IN TXT "v=spf1 +ip4:192.168.100.0/24 ~all"

送信側のシーケンス

  1. 通常通りにメールを送信します。

受信側のシーケンス

  1. MEIL FROMコマンドで指定される送信者のメールアドレス(Enveolpe-From)を確認します。MAIL FROMコマンドが利用できない場合はHELO/EHLOコマンドでドメイン名を確認します。
  2. 送信側のDNSサーバにSPFレコードを要求します。
  3. 受け取ったSPFレコードを用いて送信側のIPアドレスとの一致を確認することでSPF認証結果を得ます。

SPF認証結果

大雑把に言えば「SPFレコードの末尾までの条件で決まる場合はそれに従い、決まらない場合は拒否する」と「検証が何らかの理由で中断された場合は、拒否するかどうかを選択できる」の2パターンがあります。

結果 説明
none SPFレコードが送信側に存在していません。RFCではこの場合、メールを拒否するかどうかを選択できますが、受信する場合は通常より調査する必要があるとしています。
neutral 認証に成功も失敗もしていません。RFCではこの場合、失敗として扱わなければならないとしています。
pass 認証に成功しました。
fail 認証に失敗しました。
softfail FailとNeutral(又はNone)の中間に位置します。RFCではこの場合、メールを拒否するべきではないが通常より調査する必要があるとしています。
temperror SPF検証機能がチェックの実行中に一時的なエラーを検知し処理に失敗しました。RFCではこの場合、メールを拒否するかどうかを選択できますが、受信する場合は通常より調査する必要があるとしています。
permerror SPFレコードが送信側に存在しているが、正しく解釈できませんでした(構文エラー)。RFCではこの場合、メールを拒否するかどうかを選択できますが、受信する場合は通常より調査する必要があるとしています。

DKIM(DomainKeys Identified Mail)

送信側が電子署名を行い、受信側が電子署名を検証することでなりすましや改ざんを防止する送信ドメイン認証の一つです。

前準備

送信側は鍵ペアを生成し、DNSにTXTレコードの一種であるDKIMレコードを追加します。
[セレクタ名]._domainkey.[ドメイン名] IN TXT "v=DKIM1; p=[base64エンコードされた公開鍵]"

送信側のシーケンス

  1. 作成したメール本文とメールヘッダからハッシュ値を求めます。
  2. ハッシュ値に対して送信側の秘密鍵を用いて署名を行います。
  3. 署名をヘールヘッダ内のDKIM-Signatureヘッダに格納します。

受信側のシーケンス

  1. MEIL FROMコマンドで指定される送信者のメールアドレス(Enveolpe-From)を確認します。MAIL FROMコマンドが利用できない場合はHELO/EHLOコマンドでドメイン名を確認します。
  2. 送信側のDNSサーバにDKIMレコードを要求します。
  3. 受け取ったDKIMレコードに含まれる公開鍵を用いてメールヘッダ内のDKIM-Signatureヘッダに含まれる署名を検証することでDKIM認証結果を得ます。

DKIM認証結果

結果 説明
none 署名されていません。受信可否はSPFと同様又はSPFの結果に従います。
neutral 署名はされていましたが、正しく解釈できませんでした(構文エラー)受信可否はSPFと同様又はSPFの結果に従います。
pass 認証に成功しました。
fail 認証に失敗しました。
temperror 署名はされていましたが、一時的なエラーを検知し検証に失敗しました。受信可否はSPFと同様又はSPFの結果に従います。
permerror 署名はされていましたが、回復不可能なエラーを検知し検証に失敗しました。受信可否はSPFと同様又はSPFの結果に従います。

DKIM-Signatureヘッダーのタグ

タグ 説明
v バージョン番号 1
a 署名アルゴリズム rsa-sha256
s セレクタ mail1
d 署名を行なったドメイン名 example.com
c メール本文やメールヘッダの正規化アルゴリズム simple/simple
q 公開鍵の取得方法 dns/txt
i 署名者の識別情報 [メールアドレスなど]
h 署名される範囲に含まれるヘッダーリスト From:To:Date
l 署名される範囲に含まれるメール本文の長さ 1024
bh メール本文のハッシュ値 (省略)
b 署名データ (省略)
t 署名生成時刻(タイムスタンプ) 1712836800
x 署名の有効期限 1713268800

DMARC(Domain-based Message Authentication, Reporting and Conformance)

SPFとDKIMと一緒に使われる送信ドメイン認証の一つです。受信側でのSPFやDKIMの認証結果に基づいたメールの取り扱いのポリシを受信側に公開します。

前準備

送信側はDNSにTXTレコードの一種であるDMARCレコードを追加します。
_dmarc.[ドメイン名] IN TXT "v=DMARC1; p=none; aspf=r; adkim=r; rua=mailto:[ドメールアドレス]"

送信側のシーケンス

  1. SPFとDKIMを利用してメールを送信します。

受信側のシーケンス

  1. SPFとDKIMの認証を行います。
  2. 送信側のDNSサーバにDMARCレコードを要求します。
  3. DMARCレコードに含まれるポリシーに従いメールの扱いを決定します。

ポリシー

ポリシー 説明
none DMARC認証結果に関わらず受信します
quarantine DMARC認証に失敗したメールを隔離フォルダに隔離します。
reject DMARC認証に失敗したメールを拒否します。

DMARCレコードのタグ

タグ 説明
v バージョン DMARC1
p ドメインのポリシー reject
sp サブドメインのポリシー quarantine
rua DMARC集約レポートを送信するメールアドレス mailto:[メールアドレス]
ruf DMARCフォレンジックレポートを送信するメールアドレス mailto:[メールアドレス]
pct DMARCポリシーを適用するメールの割合 0から100の数値
aspf SPF認証の厳格さ rまたはs
adkim DKIM認証の厳格さ rまたはs

SPF・DKIM・DMARCの違い

  • SPFはメールの送信元を確認することでなりすましを防止しますが、メールの内容の真正性は確認していないので改ざんされているかどうかはわかりません。
  • DKIMはメール内容の真正性を確認することで改ざんを防止しますが、メールの送信元を厳密には確認していないのでなりすましをされているかどうかはわかりません。
  • DMARCはSPFとDKIMの認証結果からポリシーに基づいて受信の可否を決めます。結果的にSPFとDKIMを強化していることになります。

最後に

最後まで読んでくださり、ありがとうございました!
この記事が少しでもあなたの役立てば幸いです!

参考文献

https://datatracker.ietf.org/doc/html/rfc4880
https://ja.wikipedia.org/wiki/公開鍵基盤#信用の輪(Web_of_Trust)
https://datatracker.ietf.org/doc/html/rfc8551
https://datatracker.ietf.org/doc/html/rfc7208
https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/
https://datatracker.ietf.org/doc/html/rfc6376
https://datatracker.ietf.org/doc/html/rfc7489
https://datatracker.ietf.org/doc/html/rfc8601
https://datatracker.ietf.org/doc/html/rfc5322

Discussion