CentOS7 : OpenDKIM 2.11.0 + Postfix 2.10.1 で DKIM の実装

### 新しいメール送信者のガイドライン

```
2024 年 2 月 1 日以降、Gmail アカウントにメールを送信するすべての送信者は、このセクションに示す要件を満たしている必要があります。

重要: Gmail アカウントに 1 日あたり 5,000 件を超えるメールを送信する場合は、1 日あたり 5,000 件以上のメールを送信する場合の要件を満たす必要があります。

送信元ドメインに SPF または DKIM メール認証を設定します。
送信元のドメインまたは IP に、有効なフォワードおよびリバース DNS レコード（PTR レコードとも呼ばれます）があることを確認します。詳細
メールの送信に TLS 接続を使用します。Google Workspace で TLS を設定する手順については、メールのセキュアな接続を必須にする手順についてのヘルプ記事をご覧ください。
Postmaster Tools で報告される迷惑メール率を 0.3% 未満に維持します。詳しくは、迷惑メール率の詳細をご覧ください。
Internet Message Format 標準（RFC 5322）に準拠する形式でメールを作成します。
Gmail の From: ヘッダーのなりすましはしないでください。Gmail では、DMARC の quarantine（検疫）適用ポリシーの使用が開始されます。Gmail の From: ヘッダーのなりすましをした場合、メール配信に影響する可能性があります。
メーリング リストや受信ゲートウェイなどの転送サービスを管理する場合は、送信メールに ARC ヘッダーを追加します。ARC ヘッダーによって、メールが転送されたことが示され、送信者が転送者と見なされます。メーリング リストの送信者は、メーリング リストを指定する List-id: ヘッダーも送信メールに追加する必要があります。
```

## <a name="step1"></a> Step1: 現在の環境の確認

既にPostfixを使ったメールサーバが構築されていることを前提に進めます。メールサーバはローカルドメインや仮想ドメインのどちらでも構いません。

この手順は、CentOS6やUbuntuでもほとんど変わりません。

## <a name="step2"></a> Step2: 必要なソフトのインストール

### <a name="step2-1"></a> yum リポジトリの追加

まず、EPELリポジトリをインストールします。
```bash
sudo yum install -y epel-release
```

### <a name="step2-2"></a> OpenDKIM のインストール

EPELリポジトリを利用してOpenDKIMをインストールします。
```bash
sudo yum install -y --enablerepo=epel opendkim
```

## <a name="step3"></a> Step3: 秘密鍵と公開鍵の作成

### <a name="step3-1"></a> 鍵の保存ディレクトリの作成

複数のドメインを運用している場合、ドメイン毎にディレクトリを作成することをお勧めします。
```bash
sudo mkdir /etc/opendkim/keys/hogehoge.net
sudo mkdir /etc/opendkim/keys/fugafuga.net
```

### <a name="step3-2"></a> 鍵の作成

opendkim-genkeyコマンドを使って鍵を作成します。
```bash
sudo opendkim-genkey -D /etc/opendkim/keys/hogehoge.net -b 2048 -d hogehoge.net -s 20241011
sudo opendkim-genkey -D /etc/opendkim/keys/fugafuga.net -b 2048 -d fugafuga.net -s 20241011
```

#### オプション説明
- **-b オプション**: 鍵の長さを指定します。2048ビットを推奨します。
- **-d オプション**: メールアドレスのドメイン部分を指定します。
- **-s オプション**: 鍵のセレクタを指定します。任意の管理しやすい文字列を使用します。

### <a name="step3-3"></a> 鍵のパーミッションの設定

生成した鍵のパーミッションを設定します。
```bash
sudo chmod 700 /etc/opendkim/keys/*
sudo chmod 600 /etc/opendkim/keys/*/*
```
また、所有者をopendkimユーザーに変更します。
```bash
sudo chown opendkim. -R /etc/opendkim/keys/*
```

## <a name="step4"></a> Step4: OpenDKIM の設定

### <a name="step4-1"></a> 設定ファイルの編集

OpenDKIMの設定ファイルを編集します。
```bash
sudo vi /etc/opendkim.conf
```
送信時の署名を有効にするために、`Mode`を`s`または`sv`に変更します。
```bash
Mode sv
```

### <a name="step4-2"></a> 使用する鍵の設定

キーテーブルと署名テーブルを指定します。
```bash
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
```

キーテーブルを作成し、鍵の情報を追加します。
```bash
sudo vi /etc/opendkim/KeyTable
```
```bash
20241011._domainkey.hogehoge.net hogehoge.net:20241011:/etc/opendkim/keys/hogehoge.net/20241011.private
20241011._domainkey.fugafuga.net fugafuga.net:20241011:/etc/opendkim/keys/fugafuga.net/20241011.private
```

署名テーブルも編集します。
```bash
sudo vi /etc/opendkim/SigningTable
```
```bash
*@hogehoge.net 20241011._domainkey.hogehoge.net
*@fugafuga.net 20241011._domainkey.fugafuga.net
```

### <a name="step4-3"></a> OpenDKIM の起動

設定が完了したら、OpenDKIMを起動し、自動起動を有効にします。
```bash
sudo systemctl start opendkim
sudo systemctl enable opendkim
```

## <a name="step5"></a> Step5: Postfix の設定

PostfixにOpenDKIMを関連付けます。Postfixの設定ファイル`/etc/postfix/main.cf`を編集し、以下の設定を追加します。
```bash
smtpd_milters = inet:localhost:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
```
設定後、Postfixをリロードします。

## <a name="step6"></a> Step6: DNS レコードの設定

### <a name="step6-1"></a> DKIM 公開鍵レコードの設定

公開鍵をDNSに設定します。以下のコマンドで生成された公開鍵を確認し、DNSのTXTレコードとして登録します。
```bash
sudo cat /etc/opendkim/keys/*/*.txt
```

公開鍵ファイルには次のような内容が含まれています。
```txt
20241011._domainkey     IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdz4AEc0L7y+8pGcnUeX3aF/O5ZvcgtmUs2245D+VLCdn6wr/EA5zvWzSZHf1Pr9c/62EbtY0qangUP5GE+jfwFZLbVOm3r04leyzapQ0h04R+qKT3mgoGgDlQHWi2id3uDqhvVpmWTcLMtyYSmmM1cj954MpeWBCYFYRthVk+3wIDAQAB" )  ; ----- DKIM key 20241011 for hogehoge.net
```
この公開鍵をDNSにTXTレコードとして登録します。TXTレコードの形式は以下の通りです。

- セレクタ名：`20241011._domainkey`
- ドメイン名：`hogehoge.net`
- 公開鍵の内容：`v=DKIM1; k=rsa; p=公開鍵データ`

公開鍵データが長い場合、255文字以下に分割して登録する必要があります。

また、DNSサービスプロバイダによっては、適切に自動で分割してくれることもあります。

### <a name="step6-2"></a> ADSP レコードの設定

ADSPレコードも設定し、メールの署名ポリシーをDNSに登録します。
```bash
_adsp._domainkey.hogehoge.net. IN TXT "dkim=unknown"
_adsp._domainkey.fugafuga.net. IN TXT "dkim=unknown"
```

### <a name="step6-3"></a> DNS 設定の確認

設定が反映されたことを確認します。
```bash
dig 20241011._domainkey.hogehoge.net txt
dig 20241011._domainkey.fugafuga.net txt
```

## <a name="step7"></a> Step7: 追加の設定

### <a name="step7-1"></a> 署名が二重にされる場合

amavisd-newをインストールしている場合、DKIMの署名が二重になることがあります。この場合、Postfixの`master.cf`に以下の設定を追加します。
```bash
-o receive_override_options=no_address_mappings,no_milters
```

### <a name="step7-2"></a> セキュリティ設定

OpenDKIMはroot権限で実行する必要はありません。追加のセキュリティ設定を行うことをお勧めします。

### <a name="step7-3"></a> 参考情報

- [CentOS7 : OpenDKIM 2.11.0 + Postfix 2.10.1 で DKIM の実装 : えび天サーバ](https://www.abten.net/2018/03/1576/)

## おわりに

これでCentOS7上でOpenDKIMとPostfixを使ってDKIMの実装が完了しました。この設定により、送信するメールにDKIM署名を付与し、受信側での認証が行えるようになります。メールの信頼性を向上させるため、ぜひDKIMの実装を検討してみてください。