独自ドメイン メールサーバー構築 SPF DKIM DMARC設定

Server

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などに送っても迷惑メール扱いにならないようになると思います

コメント