メールサーバ_DNS関連の学習記録④_DKIMとDMARCについて

## DKIMとは
DKIM（DomainKeys Identified Mail）
DKIMは、電子メールの送信者を認証するための技術。メールに電子署名を付与し、受信者がその署名を検証することで、送信者が正当であることを確認する。これにより、なりすましメールやフィッシング攻撃を防ぐことができる。

〇主な特徴
送信者の認証: メールの送信者が正当であることを確認できる
改ざん検出: メールが送信後に改ざんされていないかを検証できる。
スパム対策: 正当なメールとスパムメールを区別しやすくなる。

### たとえば・・・
郵便に例えると、送信者が手紙に自分のサインをして、受信者がそのサインを確認することで、手紙が本当にその人から送られてきたことを確認するようなもの。
もしサインが偽物だったり、手紙の内容が書き換えられていたら、受信者はそれを見破ることができる。

〇使用例
企業のメールシステム: 企業が顧客に送るメールの信頼性を高めるために使用する。
メールマーケティング: メールがスパムフォルダに入らないようにするために使用される。
個人のメールアカウント: 個人がなりすましメールを防ぐために使用する。

## DKIMの仕組み
①送信ドメインの管理者は、秘密鍵と公開鍵のペアを生成する。秘密鍵はメールサーバーに登録する。公開鍵はDNSサーバーに登録する。

②メールを送信する際、送信サーバーはメールのヘッダーと本文の一部に対してハッシュ値を計算し、そのハッシュ値を秘密鍵で署名する。この署名がメールのヘッダーに追加される。（DKIM-Signatureが付与される）
③送信ドメインのDNSに、公開鍵を含むTXTレコードが追加されます。これにより、受信サーバーは公開鍵を取得できるようになる。
④受信サーバーは、メールのヘッダーに含まれるDKIM署名を確認する。次に、送信ドメインのDNSから公開鍵を取得し、その公開鍵を使って署名を検証する。

具体的には、受信サーバーはメールのヘッダーと本文の一部からハッシュ値を再計算し、そのハッシュ値と署名から得られたハッシュ値を比較する。これが一致すれば、メールが改ざんされていないことが確認できる。

##  二つの署名方法
### 〇作成者署名
メールの送信元のドメインが署名する。
送信者自身のドメインがメールに対してDKIM署名を付けることで、メールがその送信者（ドメイン）から正当に送信されたものであることを証明します。
#### 仕組み
メール送信者のドメインが所有する秘密鍵で署名される。
受信側は送信者のドメインのDNSに公開されている公開鍵を使って署名を検証する。
これにより、「このメールは送信者のドメインから改ざんされずに送られてきた」という保証が得られる。


### 第三者署名 (Third-Party Signature)
メールが正当に配信されたことを、第三者（通常は信頼されている送信サービス）が保証する。配信インフラを持たない送信者が簡単にDKIM署名を利用可能
#### 仕組み
メールを配信するサービスプロバイダー（例: メールマーケティングサービス、クラウドベースのメール配信サービス）が、独自のドメインでDKIM署名を付ける。
受信側はその第三者のドメインのDNSに公開されている公開鍵で検証する。

## 設定前の前提条件
### 送信メールサーバーの対応の確認
メールサーバーまたはメールサービス（例：Google Workspace、Microsoft 365、Amazon SESなど）がDKIMに対応している必要があるため確認する。

### ドメインのDNS管理権限
ドメインのDNS設定にアクセスできる必要があるのでここに公開鍵（TXTレコード）を追加する。

### ドメインに関連付ける署名鍵ペア
・公開鍵：DNSに登録する。
・秘密鍵：メールサーバーが署名用に使用する（外部に公開しない）

### 設定手順
#### 1. メールサーバーでDKIM署名を有効化
利用しているメールサービスまたはサーバーの管理画面で、DKIM署名を有効にする。

サービスごとの設定例：
Google Workspace：「Admin Console」→「アプリ」→「Google Workspace」→「Gmail」→「認証」→「DKIM署名を設定」
Microsoft 365：「Exchange管理センター」→「認証」→「DKIMの有効化」

#### 2. 公開鍵（DNSレコード）を取得
メールサーバーでDKIM設定を有効化すると、公開鍵が生成される。
公開鍵は通常、TXT形式で指定され、次のようになる。：
v=DKIM1; k=rsa; p=公開鍵文字列

#### 3. ドメインのDNSに公開鍵を追加
ドメインのDNS設定で、新しいTXTレコードを作成する：
ホスト名（例）：default._domainkey.example.com
値（例）：v=DKIM1; k=rsa; p=公開鍵文字列
注意：ホスト名はメールサービスによって異なることがある（例：selector1._domainkey）。
4. 設定を検証
メール送信後、受信メールサーバーが署名を検証できるよう、以下の方法でDKIMが正しく設定されているか確認する：
メールヘッダーを確認（Authentication-Resultsにdkim=passが表示される）。
dkim=failやdkim=neutralが表示される場合、DKIM署名が正しく設定されていないか、DNSに問題がある可能性がある。
DKIM検証ツール（例：dkimcore.orgやPostmark）を使用してDNSレコードをテスト。

#### メールヘッダーの確認方法（Outlook）
該当メールを開く。
メニューから「ファイル」→「プロパティ」を選択。
「インターネットヘッダー」セクションでメールのヘッダー情報が表示される。
Authentication-Resultsというフィールドがあるのでdkimがpassになっているか確認する。

## DMARCとは
DMARC（Domain-based Message Authentication, Reporting, and Conformance）は、電子メールのなりすましやフィッシング詐欺を防ぐためのメール認証プロトコル。送信者のドメインに対するSPF（送信ポリシーフレームワーク）やDKIM（ドメイン鍵識別メール）の設定と連携し、受信者にメールが信頼できるかどうかを伝える。最後にレポートを送信する。

### たとえば・・・
DMARCは学校の門番、受付の事務員的な存在である。DKIMは生徒手帳、SPFは通学証（決められた通学のルート）のようなもの。これを確認してその学校の生徒なのかを確認する。

### DMARCは門番の役割をしている。
校長先生がドメイン管理者的な存在。校長先生が門番にルールを渡す。これがDMARCポリシーになる。

##### none（記録だけ）：怪しい人がいても、「一応記録しておこう」と何も行動しない。
##### quarantine（要注意人物としてマーク）：怪しい人は教頭先生に報告し、校内に入らず別の場所で待機（迷惑メールフォルダ行き）
##### reject（追い返す）：怪しい人は学校に絶対に入れない（メール受信拒否）。

レポートを校長に提出する。門番は毎日、誰が来て、誰が追い返されたかを記録して校長先生に報告する。これがDMARCの「レポート機能」です。

## DMARC設定前にやっておくこと
### SPF（Sender Policy Framework）の設定
目的：メールを送信するサーバーのIPアドレスを指定し、受信者に正当な送信元かを確認させる。
・ドメインのDNSにSPFレコードを追加（例：v=spf1 include:example.com -all）。
・送信元のIPやメールサービスプロバイダ（例：Google Workspace、Microsoft 365）の情報をリストに含める。

### DKIM（DomainKeys Identified Mail）の設定
目的：送信するメールにデジタル署名を付与し、改ざんされていないことを確認する。
・メールサーバーでDKIMを有効化。
・ドメインのDNSにDKIMの公開鍵（TXTレコード）を追加。
　（例：v=DKIM1; k=rsa; p=公開鍵）

### DMARCポリシーの設定
目的：SPFやDKIMの結果を元に、受信側がどのようにメールを扱うかを指示する。
・ドメインのDNSにDMARCレコードを追加（TXTレコード）。
```
v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-failure@example.com
```

## 設定例
DMARCポリシーの構文
```
v=DMARC1; p=ポリシー; rua=レポート送信先; ruf=詳細レポート送信先; sp=サブドメインポリシー; pct=適用割合
```
最初にDMARCを導入する際、設定をテストするために使用する構文
メールを認証できなくても受信をブロックしない
```
v=DMARC1; p=none; rua=mailto:dmarc-aggregate@example.com; ruf=mailto:dmarc-failure@example.com; pct=100
```
#### v=DMARC1：DMARCレコードのバージョン。
#### p=ポリシー：none（ログのみ）、quarantine（隔離）、reject（拒否）のいずれか指定。
#### rua：認証結果レポートの送信先メールアドレス。
#### ruf：失敗したメールの詳細レポートの送信先メールアドレス。

## こんな記事も書いています！

https://qiita.com/mmurm/items/26c8dfe2f93068941b16

https://qiita.com/mmurm/items/abf390def0ae6dbd1950

https://qiita.com/mmurm/items/8f421f00a23c8a4fda00


## 参考にしたドキュメント
https://baremail.jp/blog/2021/03/02/1070/

https://www.proofpoint.com/jp/threat-reference/dkim

https://baremail.jp/blog/2023/11/28/3595/

https://ent.iij.ad.jp/articles/172/