DKIMおよびDMARC導入

これまで長らくSPFのみでメールサーバーを運用してきたが、最近になってYahooメールなど一部のメールサービスで到達性に不安を感じる場面が増えてきた。
そこで、送信ドメイン認証を強化するため、DKIMおよびDMARCを追加導入することにした。

これにより、SPF・DKIM・DMARCの主要なメール認証方式が揃い、なりすまし対策やメールの信頼性向上が期待できる。

以下、その導入手順を備忘録としてまとめておく。

  1. 必要なパッケージのインストール

まず、OpenDKIM本体と鍵生成ツールをインストールします。

sudo apt update
sudo apt install opendkim opendkim-tools

  1. OpenDKIMの設定

/etc/opendkim.conf の編集
設定ファイルを開き、以下の項目を変更または追記します。
今回は確実でパーミッション問題の起きない TCPソケット(ポート8891) でSendmailと通信させます。

● ログ出力の設定
Syslog yes
SyslogSuccess yes

● 動作モード(s = 署名、v = 検証)
Mode sv

● 鍵やドメインのマッピング設定
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts

● Sendmailと通信するためのTCPソケット設定
Socket inet:8891@localhost

関連ファイルの作成

設定用のディレクトリを作成。

sudo mkdir -p /etc/opendkim/keys

① /etc/opendkim/TrustedHosts の作成

信頼する送信元(自分自身)を指定。

127.0.0.1
localhost
::1
sky.0t0.jp

② /etc/opendkim/KeyTable の作成

使用する鍵のセレクタ名(今回は dkim260605)と、ドメイン、秘密鍵のパスを紐付け。

dkim260605._domainkey.sky.0t0.jp sky.0t0.jp:dkim260605:/etc/opendkim/keys/sky.0t0.jp/dkim260605.private

③ /etc/opendkim/SigningTable

*@sky.0t0.jp dkim260605._domainkey.sky.0t0.jp

  1. DKIM鍵の生成

sky.0t0.jp 専用の鍵を生成し、所有権を OpenDKIM に変更。

● ディレクトリ作成と移動
sudo mkdir -p /etc/opendkim/keys/sky.0t0.jp
cd /etc/opendkim/keys/sky.0t0.jp

● 鍵の生成(セレクタ名: dkim260605、ドメイン: sky.0t0.jp)
sudo opendkim-genkey -s dkim260605 -d sky.0t0.jp

● 権限をopendkimユーザーに変更
sudo chown -R opendkim:opendkim /etc/opendkim

これで、以下の2つのファイルが生成される。

・dkim260605.private: サーバー内部で使う 秘密鍵

・dkim260605.txt: DNSに登録する 公開鍵(TXTレコード)

設定を反映させるために、OpenDKIMを起動(再起動)する。

sudo systemctl restart opendkim
sudo systemctl enable opendkim

  1. Sendmailの設定(Milter連携)

Sendmailがメールを送信する際、OpenDKIM(ポート8891)を経由するように設定。

/etc/mail/sendmail.mc を開き、最下部あたりにある MAILER 定義よりも 上 に以下の2行を追記。

define(`_FFR_MILTER', `1')dnl
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost, F=T, T=S:4m;R:4m')dnl

マクロファイルを再生成し、Sendmailを再起動。

sudo make -C /etc/mail
sudo systemctl restart sendmail

  1. DNSへの公開鍵(TXTレコード)の登録

外部のDNSサーバー(お使いのDNSお名前ドメインやCloudflareなど)に、生成された公開鍵を登録。
登録する内容は、サーバー上の dkim260605.txt で確認できます。

cat /etc/opendkim/keys/sky.0t0.jp/dkim260605.txt

表示された内容をもとに、DNSレコードを以下のように登録する。

レコードタイプ ホスト名(名前) 値(テキスト/コンテンツ)

TXT dkim260605._domainkey v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BA…(dkim260605.txtに記載されている長い文字列)

  1. テスト

DNSの反映後、Gmailなどの外部アドレスへメールをテスト送信し、受信したメールの「メッセージのソース」を表示し、ヘッダーに以下のような記述があれば、設定はすべて完了!

Authentication-Results: mx.google.com;
dkim=pass header.i=@sky.0t0.jp header.s=dkim260605 …

  1. DMARC

DMARCは、SPFおよびDKIMの認証結果に加え、送信者アドレス(From)のドメインとの整合性を確認する仕組みである。
そのため、SPFまたはDKIMのいずれかが成功しているだけでなく、送信ドメインとの一致も重要となる。

DMARCはサーバー内でのパッケージインストールや設定ファイルの編集は一切不要で、DNSサーバーにTXTレコードを1行追加するだけで完了。

① DMARCレコードの作成

DNSに登録する値(文字列)を作成。
まずは最も安全な「監視モード(none)」から始めるのが鉄則。

推奨する登録内容

レコードタイプ: TXT

ホスト名(名前): _dmarc.sky.0t0.jp (または _dmarc)

値(テキスト): v=DMARC1; p=none; pct=100; rua=mailto:postmaster@sky.0t0.jp

注意: mailto: の後ろのメールアドレス(上記例では postmaster@sky.0t0.jp)は、実際に存在する(受信できる)アドレスとすること。
ここにGoogleやYahooから統計レポート(XML形式)が定期的に届くようになる。

各タグの意味

v=DMARC1: DMARCのバージョン(必須)

p=none: ポリシー(挙動)の設定。 none は「認証に失敗しても拒否せず、そのまま相手に届けてレポートだけ送って」という監視モード。
運用が安定したら、将来的に p=quarantine(迷惑メールフォルダに隔離)や p=reject(受信拒否)に引き上げてセキュリティを強化する。

pct=100: DMARCを適用するメールの割合(100%)。

rua=mailto:…: 統計レポートの送付先アドレス。

② DNSへの登録

以下のようにDNSレコードを追加。

種別 (Type) ホスト名 (Name) 値 (Value / Text)
TXT _dmarc v=DMARC1; p=none; pct=100; rua=mailto:postmaster@sky.0t0.jp

③ 前提条件のチェック(SPFレコードについて)

尚、DMARCを正しく機能させるには、DKIMだけでなくSPFレコードも登録されている必要があるが、ここでは割愛する。

④ 動作確認

DNSが反映されたら、再度Gmailなどにメールを送信してヘッダー(メッセージのソース)を確認する。

Authentication-Results: mx.google.com;
dkim=pass header.i=@sky.0t0.jp header.s=dkim260605;
spf=pass (google.com: domain of user@sky.0t0.jp designates [送信元サーバーIP] as permitted sender) …;
dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sky.0t0.jp

上記のように dmarc=pass と表示されていれば、設定はすべて成功!

これで個人運用のメールサーバーとしては、現在推奨される送信ドメイン認証の基本構成が一通り整った。

今後しばらくはDMARCを監視モード(p=none)で運用し、問題がないことを確認したうえで、必要に応じて quarantine や reject への移行も検討したい。