備忘録

Postfixで迷惑メールに判定されないようDKIMとSPFを設定

DKIM公開鍵情報・DKIM認証のためのポリシー(ADSP)・SPFレコードを設定して迷惑メールに判定されないようにした時のメモ

DKIMとは、DomainKeys Identified Mailの略で、メールを送信する際に電子署名を行ない、 受信時に検証することで正当なメールか判断することができる技術です。

SPFとは、Sender Policy Frameworkの略で、送信元アドレスを元にドメインが正当か判断することができる技術です。

EPELリポジトリの追加

OpenDKIMをインストールするのにEPELリポジトリを使います。

# yum install epel-release

EPELリポジトリの無効化

EPELリポジトリは、インストールすると有効化の状態になっています。必要な時だけEPELリポジトリを使いたいので無効化にします。

/etc/yum.repos.d/epel.repo

enabled=1
↓
enabled=0

EPELリポジトリを無効化にしたので、使用する時は「--enablerepo=epel」といったように明示的に実行します。

OpenDKIMインストール

# yum --enablerepo=epel install opendkim

インストールが完了したらバージョンを確認

# opendkim -V

opendkim: OpenDKIM Filter v2.11.0
        Compiled with OpenSSL 1.0.1e-fips 11 Feb 2013
        SMFI_VERSION 0x1000001
        libmilter version 1.0.1
        Supported signing algorithms:
                rsa-sha1
                rsa-sha256
        Supported canonicalization algorithms:
                relaxed
                simple
        Active code options:
                QUERY_CACHE
                USE_DB
                USE_LDAP
                USE_ODBX
        libopendkim 2.11.0: query_cache

DKIM署名用の秘密鍵と公開鍵の作成

ドメイン毎にディレクトリを作成
# mkdir /etc/opendkim/keys/example.com/

opendkim-genkey -D [出力先] -d [ドメイン名] -s [セレクタ名]

# opendkim-genkey -D /etc/opendkim/keys/example.com -d example.com -s _selector2019

2つのファイル(秘密鍵と公開鍵)が作成されます
_selector2019.private
_selector2019.txt

パーミッション・所有者を変更

# chmod 400 /etc/opendkim/keys/example.com/*
# chown -R opendkim:opendkim /etc/opendkim/keys/example.com/*

OpenDKIMの設定

/etc/opendkim.conf

変更前にバックアップ

# cp -p /etc/opendkim.conf /etc/opendkim.conf_`date "+%Y%m%d%H%M%S"`
Mode    v
 ↓
Mode    sv
 
#SoftwareHeader  yes
 ↓
SoftwareHeader  no

KeyFile /etc/opendkim/keys/default.private
 ↓
#KeyFile /etc/opendkim/keys/default.private
 
#KeyTable   /etc/opendkim/KeyTable
 ↓
KeyTable        /etc/opendkim/KeyTable
 
#SigningTable   refile:/etc/opendkim/SigningTable
 ↓
SigningTable   refile:/etc/opendkim/SigningTable
 
#ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
 ↓
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
 
#InternalHosts  refile:/etc/opendkim/TrustedHosts
 ↓
InternalHosts  refile:/etc/opendkim/TrustedHosts

/etc/opendkim/KeyTable

変更前にバックアップ

# cp -p /etc/opendkim/KeyTable /etc/opendkim/KeyTable_`date "+%Y%m%d%H%M%S"`
※最終行に追記
[セレクタ名]._domainkey.[ドメイン名] [ドメイン名]:[セレクタ名]:[秘密鍵へのパス]

_selector2019._domainkey.example.com example.com:_selector2019:/etc/opendkim/keys/example.com/_selector2019.private

/etc/opendkim/SigningTable

変更前にバックアップ

# cp -p /etc/opendkim/SigningTable /etc/opendkim/SigningTable_`date "+%Y%m%d%H%M%S"`
※最終行に追記
*@[ドメイン名] [セレクタ名]._domainkey.[ドメイン名]

*@example.com _selector2019._domainkey.example.com

OpenDKIMを起動

# systemctl start opendkim.service

OpenDKIMの自動起動の設定

# systemctl enable opendkim.service

Postfixの設定

/etc/postfix/main.cf

変更前にバックアップ

# cp -p /etc/postfix/main.cf /etc/postfix/main.cf_`date "+%Y%m%d%H%M%S"`
※最終行に追記
# DKIM設定
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

Postfixを再起動

# systemctl restart postfix.service

DNSの設定

〇DKIM公開鍵情報の設定

公開鍵の情報をDNSへ登録

# cat /etc/opendkim/keys/example.com/_selector2019.txt
_selector2019._domainkey    IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvByFpWc1Xvv...省略" )  ; ----- DKIM key _selector2019 for example.com
ホスト名 TYPE TTL VALUE
_selector2019._domainkey.example.com TXT 3600 v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvByFpWc1Xvv...省略

v:バージョン
k:鍵のアルゴリズム
p:公開鍵データ

〇DKIM認証のためのポリシー(ADSP)設定

ホスト名 TYPE TTL VALUE
_adsp._domainkey.example.com TXT 3600 dkim=unknown

unknown:このドメインから送信されるメールにDKIM署名が与えられるが、DKIM署名が与えられられない場合もある。
all:このドメインから送信される全てのメールにDKIM署名が与えられる。
discardable:このドメインから送信される全てのメールにDKIM署名が与えられる。DKIM署名が得られない場合はそのメールを破棄することが望まれる。

〇SPFレコードの設定

ホスト名 TYPE TTL VALUE
example.com TXT 3600 v=spf1 +ip4:999.999.999.999 ~all

+ip4:[メール送信元のIPアドレス]
送信元のIPアドレスが複数ある場合はの設定
「v=spf1 +ip4:999.999.999.999 +ip4:888.888.888.888 ~all」又は、「v=spf1 +ip4:999.999.999.999/24~all」

受信メールのヘッダを確認

dkim=pass
spf=pass 又は Received-SPF: pass
それぞれ、passとなっていればOKです。

OpenDKIMの主なコマンド

状態確認
# systemctl status opendkim.service

起動
# systemctl start opendkim.service

停止
# systemctl stop opendkim.service

再起動
# systemctl restart opendkim.service

自動起動設定状態の確認
# systemctl is-enabled opendkim.service

自動起動設定
# systemctl enable opendkim.service

自動起動解除
# systemctl disable opendkim.service