DKIMおよびDMARC導入
これまで長らくSPFのみでメールサーバーを運用してきたが、最近になってYahooメールなど一部のメールサービスで到達性に不安を感じる場面が増えてきた。
そこで、送信ドメイン認証を強化するため、DKIMおよびDMARCを追加導入することにした。
これにより、SPF・DKIM・DMARCの主要なメール認証方式が揃い、なりすまし対策やメールの信頼性向上が期待できる。
以下、その導入手順を備忘録としてまとめておく。
- 必要なパッケージのインストール
まず、OpenDKIM本体と鍵生成ツールをインストールします。
sudo apt update
sudo apt install opendkim opendkim-tools
- 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
- 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
- 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
- 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に記載されている長い文字列)
- テスト
DNSの反映後、Gmailなどの外部アドレスへメールをテスト送信し、受信したメールの「メッセージのソース」を表示し、ヘッダーに以下のような記述があれば、設定はすべて完了!
Authentication-Results: mx.google.com;
dkim=pass header.i=@sky.0t0.jp header.s=dkim260605 …
- 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 への移行も検討したい。