電子メールのセキュリティ技術のあれそれ
本記事では電子メールのセキュリティ技術であるPGP、S/MIME、SPF、DKIM、DMARCのシーケンスの詳細やそれぞれの違いについて示します。
PGP(Pretty Good Privacy)
ハイブリット暗号とメッセージダイジェストを用いてメールの暗号化と署名・検証を行います。また公開鍵の管理は認証局を利用せずPGP利用者の責任のもと行われます。
前準備
送信側・受信側共に鍵ペアを生成し、自身の公開鍵を相手に提供します。
送信側のシーケンス
- メールのハッシュ値を求め送信側の秘密鍵で署名を生成します。
- メールを使い切りでランダムな値のセッション鍵で共通鍵暗号によって暗号化します。
- セッション鍵を受信側の公開鍵で公開鍵暗号によって暗号化します。
受信側のシーケンス
- 暗号化されたセッション鍵を受信側の秘密鍵で復号します。
- 暗号化されたメールをセッション鍵で復号します。
- 暗号化されたハッシュ値を送信側の公開鍵で復号します。
- 受信したメールから新たにハッシュ値を求め復号したハッシュ値との一致によって署名を検証します。
S/MIME(Secure / Multipurpose Internet Mail Extensions)
公開鍵暗号とメッセージダイジェストを用いて暗号化と署名・検証を行います。また、公開鍵の管理は認証局を利用して行います。
前準備
送信側・受信側共にS/MIME証明書を相手に提供します。
送信側のシーケンス
- メールのハッシュ値を求め、送信側の秘密鍵で署名を行います。
- メールを受信側の公開鍵で暗号化します。
受信側のシーケンス
- 暗号化されたメールを受信者の秘密鍵で復号します。
- 署名を送信側の公開鍵で検証します。
- 受信したメールから新たにハッシュ値を求め復号したハッシュ値との一致によって署名を検証します。
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"
送信側のシーケンス
- 通常通りにメールを送信します。
受信側のシーケンス
- MEIL FROMコマンドで指定される送信者のメールアドレス(Enveolpe-From)を確認します。MAIL FROMコマンドが利用できない場合はHELO/EHLOコマンドでドメイン名を確認します。
- 送信側のDNSサーバにSPFレコードを要求します。
- 受け取った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エンコードされた公開鍵]"
送信側のシーケンス
- 作成したメール本文とメールヘッダからハッシュ値を求めます。
- ハッシュ値に対して送信側の秘密鍵を用いて署名を行います。
- 署名をヘールヘッダ内のDKIM-Signatureヘッダに格納します。
受信側のシーケンス
- MEIL FROMコマンドで指定される送信者のメールアドレス(Enveolpe-From)を確認します。MAIL FROMコマンドが利用できない場合はHELO/EHLOコマンドでドメイン名を確認します。
- 送信側のDNSサーバにDKIMレコードを要求します。
- 受け取った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:[ドメールアドレス]"
送信側のシーケンス
- SPFとDKIMを利用してメールを送信します。
受信側のシーケンス
- SPFとDKIMの認証を行います。
- 送信側のDNSサーバにDMARCレコードを要求します。
- 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を強化していることになります。
最後に
最後まで読んでくださり、ありがとうございました!
この記事が少しでもあなたの役立てば幸いです!
参考文献
Discussion