DELOGs
[サーバ構築編#11] Ubuntuでメールサーバ構築-SPF・DKIM・DMARCの設定

サーバ構築編#11
Ubuntuでメールサーバ構築-SPF・DKIM・DMARCの設定

SPF・DKIM・DMARCの設定を行って外部ドメインへメール送信を可能に

初回公開日

最終更新日

サーバ構築編第11回は、Ubuntu 24.04 LTSでのメールサーバ構築の続きです。 前回で、内部ドメイン間でのメール送受信、外部ドメインからのメール受信は完了しました。
前回の確認はこちら...
今回は、SPFやDKIM設定・DMARCの設定を行って外部ドメインへのメール送信を可能にします。 これらはスパム判定回避やドメイン詐称対策にメールサーバ構築では不可欠となっています。

1.SPF(Sender Policy Framework)の設定

自分のドメイン(example.com)から送信されるメールが、正当なIPアドレス(あなたのサーバ)から送られたことを証明するDNSレコードです。
DNSで example.com に以下のような TXTレコード を追加:
dns
1example.com. IN TXT "v=spf1 mx ip4:xxx.xxx.xxx.xxx -all"
  • mx → ドメインのMXレコードに記載されているIPからの送信は許可
  • ip4:xxx.xxx.xxx.xxx → あなたのメールサーバのグローバルIPv4アドレスに置き換えてください
  • -all → それ以外は全て拒否(強いポリシー)

2.DKIM(DomainKeys Identified Mail)の設定

送信するメールに署名をつけて、メールが改ざんされていないこと、かつ送信元がそのドメインであることを保証するための仕組みです。 Dovecotでは署名できないので、opendkim を使います。

opendkimのインストール

bash
1sudo apt install opendkim opendkim-tools

DKIMの生成

example.comhogehoge.comの2つのドメインで運用することを想定します。またPostfix の送信ホスト名が example.comでマルチドメイン対応の DKIM構成(ドメインごとに鍵を用意) にする前提にします。
○ディレクトリ構成(鍵格納)
各ドメインごとに鍵ペアを生成して、それぞれ /etc/opendkim/keys/ドメイン名 に配置するのがベストです。 まずはディレクトリを用意します。
bash
1sudo mkdir -p /etc/opendkim/keys/example.com 2sudo mkdir -p /etc/opendkim/keys/hogehoge.com
○DKIM鍵の生成(各ドメインごと)
用意したディレクトリでDKIM鍵を作成します。
bash
1# example.com の鍵生成 2cd /etc/opendkim/keys/example.com 3sudo opendkim-genkey -s mail -d example.com 4sudo chown opendkim:opendkim mail.private 5 6# hogehoge.com の鍵生成 7cd /etc/opendkim/keys/hogehoge.com 8sudo opendkim-genkey -s mail -d hogehoge.com 9sudo chown opendkim:opendkim mail.private
  • それぞれmail.privatemail.txtが出力されます。
  • mail.private が秘密鍵、mail.txt がDNSに登録する公開鍵です。

DKIMの設定

生成した鍵を認識してもらう設定を行っていきます。
○KeyTableの設定(ドメインごとの鍵指定)
使用ドメインが何で、そのドメインの対応する鍵の場所をこれです、という設定をします。
bash
1sudo vi /etc/opendkim/KeyTable
bash : KeyTable
1mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private 2mail._domainkey.hogehoge.com hogehoge.com:mail:/etc/opendkim/keys/hogehoge.com/mail.private
bash
1sudo chown opendkim:opendkim /etc/opendkim/KeyTable 2sudo chmod 640 /etc/opendkim/KeyTable
○SigningTableの設定(送信元に応じた鍵の指定)
送信元がこのドメインの時は、このドメイン鍵を利用してという設定をします。
bash
1sudo vi /etc/opendkim/SigningTable
bash : SigningTable
1*@example.com mail._domainkey.example.com 2*@hogehoge.com mail._domainkey.hogehoge.com
bash
1sudo chown opendkim:opendkim /etc/opendkim/SigningTable 2sudo chmod 640 /etc/opendkim/SigningTable
○TrustedHostsの設定(信頼できる送信元)
もしPostfixが 他のサーバからリレーでメールを預かって送る構成(例:社内のメールサーバから受け取ってインターネットへ)になっている場合、全部に署名してしまうと「本来の送信者じゃないのにDKIM署名しちゃった」ってことになって問題になるを防ぐために、署名を限定する設定です。
bash
1sudo vi /etc/opendkim/TrustedHosts
bash : TrustedHosts
1127.0.0.1 2::1 3localhost 4192.168.0.0/16
  • ループバックとローカルIP内のサーバからの送信のみに限定
bash
1sudo chown opendkim:opendkim /etc/opendkim/TrustedHosts 2sudo chmod 640 /etc/opendkim/TrustedHosts
○opendkim.conf の編集
bash
1sudo vi /etc/opendkim.conf
下記のように一部変更・追記します。
bash : opendkim.conf
1# ログ設定 2Syslog yes 3SyslogSuccess yes 4LogWhy yes # DKIM署名やらない理由のログ出力(トラブル時に役立つ) 5 6# 署名方法 7Canonicalization relaxed/simple 8OversignHeaders From 9 10# ユーザーとパーミッション 11UserID opendkim:opendkim 12UMask 002 13 14# ソケット(Postfixと連携する用) 15Socket inet:12301@localhost 16 17PidFile /run/opendkim/opendkim.pid 18 19# 鍵とドメインの対応ファイル(マルチドメイン対応) 20KeyTable /etc/opendkim/KeyTable 21SigningTable refile:/etc/opendkim/SigningTable 22InternalHosts /etc/opendkim/TrustedHosts 23 24TrustAnchorFile /usr/share/dns/root.key
○Postfixとの連携設定
main.cf に以下を追記:
bash
1sudo vi /etc/postfix/main.cf
bash : main.cf
1# DKIM 2milter_default_action = accept 3milter_protocol = 2 4smtpd_milters = inet:localhost:12301 5non_smtpd_milters = inet:localhost:12301

サービスの再起動

bash
1sudo systemctl restart opendkim 2sudo systemctl restart postfix

3.DNSへ公開鍵を登録

無事に再起動が完了したら、DNSへ生成した公開鍵を登録していきます。

DNSへの登録

鍵を作成したときに下記のファイルが出力されています
  • /etc/opendkim/keys/example.com/mail.txt
  • /etc/opendkim/keys/hogehoge.com/mail.txt
中身を確認:
bash
1sudo cat /etc/opendkim/keys/example.com/mail.txt
bash : mail.txt
1mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; " 2 "p=・・・省略・・・) ; ----- DKIM key mail for example.com
これを使って設定します。ただ、DNSプロバイダによって設定方法が違うかもしれません。
私の環境ではDNSもさくらインターネットを利用しています。この場合は下記のようにしています。
エントリ名タイプデータ
mail._domainkeyTXT"v=DKIM1; h=sha256; k=rsa; " "p=M・・・" "・・・"
  • エントリ名:mail._domainkey
  • タイプ:TXT
  • データ:カッコ内のデータを全部貼り付け"v=DKIM1;・・・"
  • データのところはダブルクオートが何回か登場しますが、mail.txtの()内のテキストを全部データとして設定してください。改行しないように1行で。
これを各ドメイン毎に行います。完了したら、DNSの反映まで少し待ちます(環境によりますが1時間ほど?)。

チェック

bash
1sudo opendkim-testkey -d example.com -s mail -vvv
上記のコマンドを実行して、
bash
1opendkim-testkey: using default configfile /etc/opendkim.conf 2opendkim-testkey: checking key 'mail._domainkey.example.com' 3opendkim-testkey: key not secure 4opendkim-testkey: key OK
と最終行がkey OKとなればOKです。
あとは実際にクライアントツールなどからgmailへメールを送信して、そのソースを確認します。
mailsource
1Authentication-Results: mx.google.com; 2 dkim=pass header.・・・ 3#↑dkim=pass でDKIM署名が 正しく検証された証拠 4 5DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=・・・ 6s=mail; t=...; 7 bh=...; 8 h=Date:To:From:Subject:From; 9 b=LR7tJbG・・・ 10# ↑実際の署名もあり 11 12spf=pass (google.com: domain of・・・ 13# ↑SPFもパスしている
以上でDKIMの設定は完了です。

4.DMARC(Domain-based Message Authentication, Reporting and Conformance)の設定

DMARC(ディーマーク)はSPF・DKIM を使った 送信ドメイン認証を強化するための仕組みです。
DNSに設定するだけなので、設定作業自体は簡単です。 内容をしっかり把握しておくことが重要です。
機能効果
認証ポリシー設定なりすまし送信の防止(詐欺メールなど)
レポート収集自分のドメインを使った不正送信の把握
送信信頼性の向上GmailやOutlookで迷惑メールにされにくくなる

DMARCの基本構成(TXTレコード)

DNSへ設定する際の項目は下記のようになります。
bash
1_dmarc.example.com. IN TXT "v=DMARC1; p=none; sp=none; aspf=r; adkim=r; rua=mailto:dmarc@example.com"
パラメータ説明
v=DMARC1バージョン固定
p=noneポリシー(none / quarantine / reject)
sp=noneサブドメインに対するポリシー(none / quarantine / reject) 、省略時は p= の設定が継承される
aspf=SPF認証の厳密さを設定(r / s)
adkim=DKIM認証の厳密さを設定(r / s)
rua=集計レポートの送信先メールアドレス
ruf=詳細レポート(フォレンジック)※任意
pct=ポリシー適用率(省略時100%)
p=sp=で指定するポリシーの違い
効果
noneレポートのみ。まずはコレからスタート
quarantine失敗メールを迷惑フォルダなどへ送る
reject失敗メールは完全拒否

まずは `p=none` で様子見 → ちゃんとSPF・DKIMが通るのを確認してから、` p=quarantine` や `p=reject` に引き上げるように運用すると良いかと思います。 サブドメインについては、別のポリシーを利用する場合は指定します。省略すると`p=`のポリシーがサブドメインにも適用されます。
aspf=adkim=で指定する厳密さ指定の違い
効果認証条件説明
rrelaxed(ゆるい)親子関係でもOKFromが sub.example.com、SPFが example.com → OKデフォルト。現実的に使いやすい
sstrict(厳格)完全一致のみOKFromが example.com で、SPFも example.com → OK、Fromが sub.example.com → NGドメイン一致を厳密に求める

通常は `r `が無難です。なりすまし対策をかなり厳しくしたい場合は、誤判定リスクもあるのでDMARCレポート見ながら慎重に`s`を利用を検討してください。
**rua=**で指定するレポートを受け取るためのアドレスも重要です。SPFやDKIMの状況を受信してなりすましの痕跡や外部サービス経由の正当メールまでがこのレポートから見えてきます。ここで指定するアドレスは、設定するドメインと同一のドメインのアドレスだと設定が楽です。 もし、異なるドメインのメールアドレスへ送信したい場合、そのドメイン側でreport._dmarc.some-service.com. IN TXT "v=DMARC1"のようなDNS設定が別途必要になります。
**rua=**に指定するメールアドレスの作成が完了して、各パラメータをどうするか決めたら、DNSへ設定を行います。

DNS設定

前述の通り、私の環境ではDNSもさくらインターネットを利用しています。DNSプロバイダによって、少し設定方法は違ってくると思います。
私の環境では下記のようにしています。
エントリ名タイプデータ
_dmarcTXT"v=DMARC1; p=none; sp=none; aspf=r; adkim=r; rua=mailto:dmarc@example.com"
これを各ドメイン毎に行います。完了したら、DNSの反映まで少し待ちます(環境によりますが1時間ほど?)。

チェック

チェックは下記のようにdigコマンドでやっても設定内容が出てくるだけです。
bash
1dig +short TXT _dmarc.example.com
ですので、オンラインツールでチェックするのがおすすめです。
チェックツールでDMARC Policy Not Enabledのところだけ注意マークが出ると思いますが、まだp=noneの状態なので、他がOKマークが出ていれば大丈夫です。
以上で、メールサーバの構築は完了です。
次回は最後の仕上げでfail2banについてみていきます。
続きはこちら...
前回の確認はこちら...
この記事の執筆・編集担当
DE

松本 孝太郎

DELOGs編集部/中年新米プログラマー

ここ数年はReact&MUIのフロントエンドエンジニアって感じでしたが、Next.jsを学んで少しずつできることが広がりつつあります。その実践記録をできるだけ共有していければと思っています。