昔のRisumailのいたずらから学ぶ！Ubuntu ServerでSPF、DKIM、DMARCを実装してメールを守ろう

## はじめに
以前は職場のメールソフトとしてオープンソースの「Risumail」が採用れていました。
このRisumailは、設定からヘッダーを簡単に変更する事が出来て、友達のメールアドレスから友達にメールを送ってみたり。自分のアリバイ作りに使ったりしていました。勿論メールヘッダーを確認したら直ぐにバレるのですが、そんな事を知っている人は少なく自分の知識が乏しい中で遊んでいた良い思い出であります。しかし、今ではSPF、DKIM、DMARCといった技術が普及し、こうした「なりすまし」はほぼ通用しなくなっています。

---

## 1. SPF、DKIM、DMARCとは？

### (1) SPF（Sender Policy Framework）
SPFは、メールの送信元IPアドレスが正当であるかを確認する技術です。

仕組み
ドメイン所有者がDNSにSPFレコードを設定： SPFレコードには、そのドメインでメールを送信する許可を持つサーバーのIPアドレスやドメインを定義します。
``` makefile
v=spf1 ip4:203.0.113.1 include:_spf.google.com -all
```

ip4:203.0.113.1: 特定のIPアドレスを許可。
include:_spf.google.com: 他の送信サーバー（Googleなど）を許可。
-all: それ以外の送信元を拒否。
メール受信サーバーがSPFレコードを確認： メールを受け取ったサーバーは、送信元のIPがSPFレコードに一致するかどうかを検証します。

:::note infoメリット
シンプルで導入しやすい。
正当な送信元を特定できる。
:::

:::note alert
デメリット
メールが転送されると失敗することがある。
:::

### (2) DKIM（DomainKeys Identified Mail）
DKIMは、メールにデジタル署名を付与して、メールが改ざんされていないことを保証する技術です。

仕組み
送信サーバーがメールに署名を付与：

メールの一部（本文や重要なヘッダー）をハッシュ化し、秘密鍵で署名を作成します。
署名はDKIM-Signatureヘッダーとしてメールに付与されます。
受信サーバーが署名を検証：

受信サーバーは、送信者ドメインのDNSに登録された公開鍵を使用して署名を検証します。
メールが改ざんされていなければ、署名が一致します。

:::note info
メリット
メールの改ざん防止。
メール転送の影響を受けにくい。
:::

:::note alert
デメリット
秘密鍵・公開鍵の管理が必要。
SPFより導入が少し複雑。
:::

### (3) DMARC（Domain-based Message Authentication, Reporting & Conformance）
DMARCは、SPFとDKIMを統合し、メール認証の結果に基づいたポリシーを適用する技術です。

仕組み
ドメイン所有者がDMARCポリシーを設定： DMARCポリシーには、SPFとDKIMの認証結果が失敗した場合の処理（拒否、迷惑メールフォルダに振り分けるなど）を定義します。

例:
``` css
v=DMARC1; p=reject; rua=mailto:dmarc-report@example.com
```
p=reject: 認証失敗メールを拒否。
rua: レポートを送るアドレス。
受信サーバーがポリシーを適用： SPFやDKIMの結果を検証し、DMARCポリシーに基づいて処理します。

:::note info
メリット
SPFとDKIMを補完し、高精度な認証を実現。
認証結果のレポートを確認可能。
:::

:::note alert
デメリット
SPFやDKIMが正しく設定されていないと正常に動作しない。
設定が少し複雑。
3つの技術の連携
SPF、DKIM、DMARCを組み合わせることで、以下を実現できます：
:::

SPF: 送信元のIPアドレスを確認。
DKIM: メールが改ざんされていないことを保証。
DMARC: SPFとDKIMの結果を統合して最終的なポリシーを適用。


## 3. 構築の準備
必要なもの
Ubuntu Server（20.04以降推奨）
ドメイン（DNS設定が可能であること）
メールサーバー（Postfixを使用）
ターミナルへのアクセス

### 4. Ubuntu Serverでのインストールと設定
### (1) 必要なパッケージのインストール
まず、メールサーバーと認証用ツールをインストールします。

```bash
sudo apt update
sudo apt install postfix opendkim opendkim-tools bind9-utils
```

Postfixの基本設定
インストール中に以下の設定を行います：

メールサーバーのタイプ：インターネットサイト
システムメール名：あなたのドメイン（例: example.com）
設定ファイルは後ほど詳細に編集します。

### (2) SPFの設定
DNSにSPFレコードを追加
DNS管理画面で以下をTXTレコードとして追加します：

```arduino
example.com. IN TXT "v=spf1 ip4:192.168.1.1 -all"
```
SPF検証ツールで確認
設定後に以下のコマンドを実行：

```bash
dig +short TXT example.com
```

### (3) DKIMの設定
秘密鍵と公開鍵の生成

```bash
sudo mkdir -p /etc/opendkim/keys
sudo opendkim-genkey -t -s default -d example.com
sudo mv default.private /etc/opendkim/keys/
sudo mv default.txt /etc/opendkim/keys/
```

公開鍵をDNSに登録 公開鍵情報をDNSに追加します。default.txtの内容をDNSのTXTレコードにコピーします。

arduino
コードをコピーする
default._domainkey.example.com IN TXT "v=DKIM1; k=rsa; p=公開鍵"
OpenDKIMの設定 /etc/opendkim.confを編集：

```arduino
Domain example.com
KeyFile /etc/opendkim/keys/default.private
```
Postfixとの連携を設定：

```bash
echo "milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891" | sudo tee -a /etc/postfix/main.cf
sudo systemctl restart postfix opendkim
```

### (4) DMARCの設定
DNSにDMARCポリシーを追加

```perl
_dmarc.example.com IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc-report@example.com"
```

ポリシーの種類

p=none: レポートのみ。
p=quarantine: 迷惑メールフォルダへ。
p=reject: 完全拒否。
5. 実装のテスト方法
SPFの確認:

```bash
dig +short TXT example.com
```
DKIM署名の確認: テストメールを送信してヘッダーにDKIM-Signatureが含まれるか確認。
DMARCの確認: DMARCレポートサービスを使用。

## 6. トラブルシューティング
SPF設定ミス → TXTレコードの内容を再確認。
DKIM署名エラー → 鍵のパスや権限を再確認。
DMARCの拒否ポリシー → 一時的にp=noneに変更して検証。

## 7. まとめ
かつてRisumailでジョークメールを作って遊んでいた時代と比べ、現在のメールセキュリティは非常に堅牢です。今回の設定を通して、なりすましメール対策の基本を学びながら、自分のドメインを守るスキルを身につけましょう。