SPF、DKIM、DMARCを導入し迷惑メール化を回避する

どんどん進化するメーラーのスパムメールフィルタに変に引っかからないように、しっかりとした身元証明をもってメールを配信するようにしておきます。SPF、DKIM、DMARC、それぞれがどんなものかを超ざっくり、超簡単にまとめますが、詳しく知りたい方はググってくださいね。

SPFって?

DNSを用いて、そのメールが配信されるIPアドレスを宣言する仕組みです。この宣言されたIPアドレス以外のサーバから配信されている場合は、怪しいメールになります。

DKIMって??

公開鍵と電子署名を用いてメールが正しく配信されているかを調べる仕組みです。サーバ内で保持する秘密鍵をもとに行った電子署名をメールに付与し、DNSに記載した公開鍵をもって承認など、うんちゃらかんちゃらと書くと、どんどん深みにハマっていきそうな気がする(笑)

DMARC????

これまでのあがった、SPFとDKIM、それぞれの補足的なもので、それぞれのルールでNGとなったメールをどう処理するかといったルールをDNSに記載する仕組みです。

とはいえ、いずれもDNSを用いますので、DNSが編集できることを前提として考えてください。

では早速、SPFの設定します。

これは超簡単。

DNSに、SPFレコードを一行を追加するだけです。

v=spf1 a mx ip4:IPアドレス -all

Google Workspace からも配信する場合はこんな感じ。

v=spf1 a mx ip4:IPアドレス include:_spf.google.com -all

様々なサイトで書かれているSPFレコード。
一部が、-all だったり ~all だったりと違うことがあるのですが、その理由はあまり触れられていないです。

ハイフンの場合は、厳格にこのIPアドレス以外からの配信はないですよ。それ以外は fail っす。と明確宣言するのに対し、チルダの場合は、それ以外からの配信もあるかもね。といったものになっています。そのため、記載のIPアドレス以外からの配信は、softfail となんとも日本人っぽい曖昧な認証失敗に(笑)

可能であれば、ハイフンを使って厳格に宣言したほうが良いと思うmonmonでした。

次にDKIMです。

OpenDKIMを使っていきます。
インストールは簡単です。

sudo apt install opendkim opendkim-tools

マルチドメインでのサーバ運用も視野に入れるため、ちょっと設定が複雑化しています。

/etc/opendkim が見つからない。

/etc/opendkim ディレクトリが見つからず、代わりに、/etc/dkimkeys が見つかったので、こちらで作業することにする。(なんでだろ、Debian系だから?)

とはいえ、ひとまず、やることは同じで、ドメイン単位に証明書を格納するディレクトリを作成します。

sudo mkdir /etc/dkimkeys/monmon.jp

selectorは指定ぜず、defaultのまま証明書を作成します。

sudo opendkim-genkey --directory=/etc/dkimkeys/monmon.jp --domain=monmon.jp --bits=2048

以下、2ファイルが作成されました。

default.private
default.txt

オーナーをopendkimユーザーに変更しておきます。

sudo chown -R opendkim:opendkim /etc/dkimkeys/monmon.jp

OpenDKIMの設定。

設定ファイルはこちら。

sudo vi /etc/opendkim.conf

修正箇所。

Socket                  inet:8892@localhost
#Socket                 local:/run/opendkim/opendkim.sock

#Mode                    sv
Mode                    sv

末尾に追加。

KeyTable    /etc/dkimkeys/KeyTable
SigningTable    refile:/etc/dkimkeys/SigningTable
ExternalIgnoreList    refile:/etc/dkimkeys/TrustedHosts
InternalHosts    refile:/etc/dkimkeys/TrustedHosts

設定ファイルに追記した各ファイルを作成していきます。

KeyTable

sudo vi /etc/dkimkeys/KeyTable

内容は、ドメインキーと秘密鍵との紐付けですね。

default._domainkey.monmon.jp monmon.jp:default:/etc/dkimkeys/monmon.jp/default.private

SigningTable

sudo vi /etc/dkimkeys/SigningTable

こちらの内容は、ドメインキーとメールユーザーとの紐付けですね。

*@monmon.jp   default._domainkey.monmon.jp

TrustedHosts

sudo vi /etc/dkimkeys/TrustedHosts

信頼できるホストの指定ですね。ローカルサーバのみですので。

127.0.0.1
::1

起動

sudo systemctl status opendkim
● opendkim.service - OpenDKIM DomainKeys Identified Mail (DKIM) Milter
     Loaded: loaded (/lib/systemd/system/opendkim.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-03-02 19:40:21 JST; 25s ago
       Docs: man:opendkim(8)
             man:opendkim.conf(5)
             man:opendkim-genkey(8)
             man:opendkim-genzone(8)
             man:opendkim-testadsp(8)
             man:opendkim-testkey
             http://www.opendkim.org/docs.html
    Process: 87650 ExecStart=/usr/sbin/opendkim -x /etc/opendkim.conf (code=exited, status=0/SUCCESS)
   Main PID: 87661 (opendkim)
      Tasks: 6 (limit: 1160)
     Memory: 2.3M
     CGroup: /system.slice/opendkim.service
             └─87661 /usr/sbin/opendkim -x /etc/opendkim.conf

aptでのインストール後、やはりすでに動いている(笑)

なので再起動だけ。

sudo systemctl restart opendkim

PostfixにもDKIMの設定を。

設定ファイルはこれ。

sudo vi /etc/postfix/main.cf

フィルタ設定などを末尾に追加します。

milter_default_action = accept
smtpd_milters = inet:127.0.0.1:8892
non_smtpd_milters = $smtpd_milters

Postfixをリロード。

sudo systemctl reload postfix

Postfixリロード後、不安なので(笑)OpenDKIMも再起動。

sudo systemctl restart opendkim

公開鍵などをDNSに登録。

sudo cat /etc/dkimkeys/monmon.jp/default.txt

上記の内容を、

default._domainkey

TXTレコード、

v=DKIM1; h=sha256; k=rsa; p=MIIBIjA ... 省略 ... IDAQAB

こんな感じで追加します。

ADSPレコードも追加。

_adsp._domainkey

TXTレコード、

dkim=unknown

を追加。DKIM認証のポリシーなので、すべてのメールがDKIM認証されている!そんな確固たる自信があるあなたはallでもいいかもですが、IPアドレスと違って確固たる自信はないので(笑)unknownに。特段これで問題はありません。

最後に、最低限のDMARCも追加。

_dmarc

TXTレコード、

v=DMARC1; p=none

を追加します。

もろもろ設定が完了し、DNSが反映されると……

送ったメールのすべての認証がパスされているのを確認できました。マルチドメインの場合は、証明書を作成する手順から同じように別ドメインのものを作成していく感じですね。

メール周りもこれで完了です。だいぶサーバらしくなってきましたね。