![[サーバ構築編#11] Ubuntuでメールサーバ構築-SPF・DKIM・DMARCの設定](/_next/image?url=%2Farticles%2Fserver%2Fdkim%2Fhero.jpg&w=3840&q=75)
サーバ構築編#11Ubuntuでメールサーバ構築-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.com
とhogehoge.com
の2つのドメインで運用することを想定します。またPostfix の送信ホスト名が example.com
でマルチドメイン対応の DKIM構成(ドメインごとに鍵を用意) にする前提にします。○ディレクトリ構成(鍵格納)
各ドメインごとに鍵ペアを生成して、それぞれ /etc/opendkim/keys/ドメイン名 に配置するのがベストです。 まずはディレクトリを用意します。
各ドメインごとに鍵ペアを生成して、それぞれ /etc/opendkim/keys/ドメイン名 に配置するのがベストです。 まずはディレクトリを用意します。
bash
1sudo mkdir -p /etc/opendkim/keys/example.com
2sudo mkdir -p /etc/opendkim/keys/hogehoge.com
○DKIM鍵の生成(各ドメインごと)
用意したディレクトリで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.private
とmail.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署名しちゃった」ってことになって問題になるを防ぐために、署名を限定する設定です。
もし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 に以下を追記:
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._domainkey | TXT | "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=
で指定する厳密さ指定の違い値 | 効果 | 認証条件 | 例 | 説明 |
---|---|---|---|---|
r | relaxed(ゆるい) | 親子関係でもOK | Fromが sub.example.com、SPFが example.com → OK | デフォルト。現実的に使いやすい |
s | strict(厳格) | 完全一致のみOK | Fromが 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プロバイダによって、少し設定方法は違ってくると思います。
私の環境では下記のようにしています。
エントリ名 | タイプ | データ |
---|---|---|
_dmarc | TXT | "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を学んで少しずつできることが広がりつつあります。その実践記録をできるだけ共有していければと思っています。
▼ 関連記事
[サーバ構築編#2] さくらクラウドでPostgreSQLのアプライアンスDBを作る
運用が楽々なアプライアンス「データベース」でPostgreSQL環境を作成
2025/6/20公開
![[サーバ構築編#2] さくらクラウドでPostgreSQLのアプライアンスDBを作るのイメージ](/_next/image?url=%2Farticles%2Fserver%2Fsakura-cloud-db%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#3] Ubuntu初期設定-ユーザ作成とSSH接続の強化
SSHでサーバへ接続して、Ubuntu Server 24.04.1LTSの主にユーザ作成とSSH接続の強化
2025/6/20公開
![[サーバ構築編#3] Ubuntu初期設定-ユーザ作成とSSH接続の強化のイメージ](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-user-ssh%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#4] Ubuntu初期設定-日本語化
Ubuntu Server 24.04.1LTSの言語設定の日本語化とシステム時間の日本時間ゾーン設定
2025/6/20公開
![[サーバ構築編#4] Ubuntu初期設定-日本語化のイメージ](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-locale%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#5] Ubuntu初期設定-アプライアンスDB(PostgreSQL 13)との接続設定
Webサーバのイーサネット設定を行いローカルスイッチとアプライアンスDBのPostgreSQL 13へのアクセスを可能に
2025/6/20公開
![[サーバ構築編#5] Ubuntu初期設定-アプライアンスDB(PostgreSQL 13)との接続設定のイメージ](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-ethernets%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#1] さくらクラウドでUbuntuサーバのインスタンスを作る
コントロールパネルからサクッとUbuntuサーバのインスタンスを作成
2025/6/20公開
![[サーバ構築編#1] さくらクラウドでUbuntuサーバのインスタンスを作るのイメージ](/_next/image?url=%2Farticles%2Fserver%2Fsakura-cloud-server%2Fhero-thumbnail.jpg&w=1200&q=75)