SPF、DKIM、DMARCは、メールのなりすまし(スパムやフィッシング)を防ぐためのドメイン認証技術です
それぞれの概要と設定方法を簡潔に説明します
以前までの記事はこちらです
・環境
ConoHa VPS Ubuntu 20.04
独自ドメイン名 go-pro-world.netとしています
【1】SPF(Sender Policy Framework)
目的:
送信元IPがそのドメインからメールを送る許可があるかを確認します
設定方法:
ドメインのDNSにTXTレコードを追加します
例(メール送信に使用しているサーバーのIPが 192.0.2.1 の場合):
- タイプ:TXT
- 名称:@
- TTL:3600
- 値:v=spf1 ip4:192.0.2.1 -all
ちゃんと設定されているか確認するコマンド
dig +short TXT go-pro-world.net
正常なら以下のように表示されます
"v=spf1 ip4:192.0.2.1 -all"
【2】DKIM(DomainKeys Identified Mail)
目的:
メール本文やヘッダーが送信途中で改ざんされていないことを検証します
仕組み:
秘密鍵で署名して、公開鍵をDNSに登録。受信側が公開鍵で検証
Postfix + Dovecot + opendkim を使った DKIM の設定手順を説明します
【1】opendkimのインストール(Ubuntuの場合)
sudo apt update
sudo apt install opendkim opendkim-tools
【2】ディレクトリと鍵の作成
鍵保存用ディレクトリを作成
go-pro-world.netは自分のドメイン名に変えてください
sudo mkdir -p /etc/opendkim/keys/go-pro-world.net
sudo chown -R opendkim:opendkim /etc/opendkim
秘密鍵と公開鍵の生成(defaultはセレクタ名)
鍵を入れるディレクトリを作成します
sudo mkdir -p /etc/opendkim/keys/go-pro-world.net
# ディレクトリへ移動
cd /etc/opendkim/keys/go-pro-world.net
秘密鍵(private)と公開鍵(public)を生成
sudo opendkim-genkey -s default -d go-pro-world.net
# 権限を付与
sudo chown opendkim:opendkim default.private
sudo chmod 600 default.private
- default.private → 秘密鍵(サーバー側で使う)
- default.txt → 公開鍵(DNSに登録)
【3】公開鍵をDNSに登録
以下のコマンドでdefault.txt の中身を確認します
sudo cat /etc/opendkim/keys/go-pro-world.net/default.txt
以下のように公開鍵の内容が表示されます
default._domainkey IN TXT ("v=DKIM1; k=rsa; p=MIIBIjANBgkq...省略...")
→ DNSのTXTレコードに登録(※途中で改行やスペースが入らないよう注意)
- タイプ:TXT
- 名称:default._domainkey
- TTL:3600
- 値:v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBg…
ちゃんと設定されているか確認するコマンド
dig +short TXT default._domainkey.go-pro-world.net
DNSレコードの値が表示されます
"v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQE..."
【4】opendkim設定ファイルの編集
設定ファイルの編集
sudo nano /etc/opendkim.conf
以下のように変更(または追記)
Syslog yes
SyslogSuccess yes
LogWhy yes
Canonicalization relaxed/simple
OversignHeaders From
Domain go-pro-world.net
Selector mail
KeyFile /etc/opendkim/keys/go-pro-world.net/mail.private
UserID opendkim
UMask 007
Socket inet:8891@localhost
PidFile /var/run/opendkim/opendkim.pid
TrustAnchorFile /usr/share/dns/root.key
# DKIMの鍵を格納する場所
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
【5】その他設定ファイルを用意
・ドメインと秘密鍵の対応付け
sudo nano /etc/opendkim/KeyTable
以下のように記入
default._domainkey.go-pro-world.net go-pro-world.net:default:/etc/opendkim/keys/go-pro-world.net/default.private
・どの送信者にどの鍵を使うか定義
sudo nano /etc/opendkim/SigningTable
以下のように記入
空白部分はスペースでなくタブキーで空けます
*@go-pro-world.net default._domainkey.go-pro-world.net
・DKIM署名を許可する送信元のリスト
sudo nano /etc/opendkim/TrustedHosts
以下のように入力します
127.0.0.1
localhost
go-pro-world.net
mail.go-pro-world.net
【6】Postfixとの連携
postfixのメイン設定ファイルを編集します
sudo nano /etc/postfix/main.cf
DKIM関連の設定を追加しています
myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 3.6
smtputf8_enable = no
# SASL認証
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_tls_auth_only = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
# TLS関連
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/go-pro-world.net/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/go-pro-world.net/privkey.pem
smtpd_tls_security_level = may
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# TLSセキュリティ強化
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_ciphers = medium
tls_high_cipherlist = @SECLEVEL=2
# SMTP中継・配送制限
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
# 一般情報
myhostname = go-pro-world.net
mydomain = go-pro-world.net
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
home_mailbox = Maildir/
# DKIM関連
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
次にサブミッションの設定ファイルを編集します
sudo nano /etc/postfix/master.cf
以下のような部分がなければ追加、編集してください
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_tls_auth_only=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
dovecotの設定ファイルも確認します
sudo nano /etc/dovecot/conf.d/10-master.conf
以下のような部分を確認、なければ追加します
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
【7】サービス再起動
sudo systemctl restart opendkim
sudo systemctl restart postfix
【8】動作確認
以下のコマンドでキーのテストをします
sudo opendkim-testkey -d go-pro-world.net -s default -k /etc/opendkim/keys/go-pro-world.net/default.private -vvv
認証ができていれば以下のような表示がでます
opendkim-testkey: key OK
【鍵の保管の注意点】
- default.private(秘密鍵)は opendkim のみ読み取り可能にする
- バックアップを取る場合も、外部に漏れないよう注意(暗号化ストレージなど推奨)
chmod 600 default.private
chown opendkim:opendkim default.private
【3】DMARC(Domain-based Message Authentication, Reporting & Conformance)
目的:
SPFとDKIMの検証結果に基づき、受信側にメールをどう扱うか指示する
設定方法:
DNSにTXTレコードを追加
例(検出時は隔離し、レポート送信):
- タイプ:TXT
- 名称:_dmarc
- TTL:3600
- 値:v=DMARC1; p=reject; rua=mailto:hisao@go-pro-world.net; pct=100
値の内容:
- v=DMARC1:使用しているDMARCのバージョン。現在は常に DMARC1
- p=reject:ポリシーの指定。「認証に失敗したメールは拒否する」という指示
(他に none(何もしない), quarantine(隔離)がある) - rua=mailto:hisao@go-pro-world.net:DMARCレポートの送信先アドレス
受信側のメールサーバーは、認証失敗メールの統計レポートをこのアドレスに送る - pct=100:ポリシーの適用割合
100%のメールにこのポリシー(reject)を適用するという意味
レコードが正しく設定できているか確認するコマンドはこちら
dig +short TXT _dmarc.go-pro-world.net
注意点:
- DNS設定反映には数時間〜最大48時間かかることがあります
- SPFとDKIMが通っていても、DMARCの設定がないとメールは保護されません
すべてが完了したらメールテスターなどのスパム判定サイトを使ってThunderbirdなどからメールを送信してみて結果を確認してみてください
以上で各レコードの設定が終わり、メールの信頼性が上がりました
Gmailなどに送っても迷惑メール扱いにならないようになると思います
コメント