Ubuntu22.04のPostfixにspf,DKIM,DMARCを組み込む

スポンサーリンク
PC関連
スポンサーリンク
スポンサーリンク

Gmailの方針変更に伴う当サーバーの信頼性向上

googleはメール送信者のガイドラインを改定しようとしています。期限は2024年02月からという事で複数のメールを送信するにはこのガイドラインに沿ったサーバを構築しておく必要性があります。

当方のメールサーバは送信、受信と別々に構築してありますが基本は一緒です。以下の設定を順に行う事で各機能を有効化することが可能となります。

今回私が契約している「さくらのVPS」及びドメイン管理「value-domain」上でどのように設定するのかを披露していこうと思います。

さくらのVPSの構成

私の契約ではコア2、メモリ1GB、SSD100GB、初期OSはubuntu22.04を選択しております。ですのでこれ以降の説明ではubuntu22.04をベースに解説しています。almalinuxや他のOSでも似たような設定にはなりますが追加モジュールの方法が違いますのでその辺りはご勉強して頂きたく思います。

ここにこのWordpress、データベース、メール及びfail2banを組み込みをしてある所から話を進めようかと思います。またドメイン管理にはvalue-domainを利用しております。

ですので上記モジュールは既に出来上がっているものとして編集をして行こうかと思っております。

SPF (Sender Policy Framework)とDKIM (Domainkeys Identified Mail)

SPFとDKIMはいずれも送信ドメイン認証の仕組みであり、IETFによってSPFは RFC4408 、DKIMは RFC4871 および RFC5672 にて仕様が定められています。

簡略に言うと、メール送信時「このメールは『〇〇ドメイン』から正規に発出されましたよ」というお墨付きを付けて配送先に渡す仕組みです。

相手はその情報をもとに「これは正規メールか否か」を判断する材料にするのです。

SPF

SPFはDNSのSPFレコードを利用し送信ドメインを認証します。SPFに対応しているメール受信サーバは、メール受信時に送信元ドメインのDNSサーバのSPFレコードを参照し、送信元のサーバがSPFレコード中で許可されていない場合には送信ドメインの詐称が行われたと判断して、受信を拒否する等の処理をおこないます。

では設定を行っていきましょう。

ドメインサーバの設定

と言ってもまずはDNSの設定が必要です。なぜならどんなDNSサービスを受けていても全世界に反映されるには時間がかかるからです。後述するDKIM,DMARCもそれぞれ時間がかかるのでゆっくりやっていきましょう。

今回はvalue-domainという事で以下の設定を追加します。

txt hogehoge.com v=spf1 +ip4:XXX.XXX.XXX.XXX ~all

この意味ですがtxtから始まるのはTXTのリソースですよという意味です。

また次のhogehoge.comですがvalue-domainの仕組み上TXT項目の名前になります。後述するのも最初にどの項目なのか明示的に示してあげる必要性があります。

v=spf1ですがこれはspfの規格を示しているようです。(この部分は調べきれませんでした)

次の+ip4:XXX.XXX.XXX.XXXはアドレスを示しています。

アドレスは伏せましたが皆さんが利用するメールサーバのアドレスです。

そして最後の~ALLですがドメイン名+IPアドレスの構成『以外』は偽物ですよと明示しています。

それぞれをかみ砕いて言うと

「IPXXX.XXX.XXX.XXXというメールが飛んできた場合、メールヘッダに送信者がhogehoge.comでなければ偽物ですよ」という形になります。

まずはここまででドメイン情報を一旦保存しましょう。

SPFレコードが正しく記述されているか確認する方法

インターネット上で無料公開されている、SPFレコードチェックツールなどを利用することが可能です。

SPF Record Testing Tools

spfのメールサーバの設定

今度は受信側の設定を行っていきます。

受信側では受け取ったメールヘッダを見て送信時ipと送信ドメインをチェックします。このため以下のモジュールを追加する事から進めます。

sudo apt update
sudo apt install -y postfix-policyd-spf-python

次に設定ファイルを変更していきます。

Postfix設定変更

/etc/postfix/master.cfを変更します。まだ設定されていない方は以下の一文を追加します。

policyd-spf  unix  -       n       n       -       0       spawn    user=policyd-spf argv=/usr/bin/policyd-spf

wordpressの仕様で2行に見えますが全て一行で書き込みます。

また/etc/postfix/main.cfを変更します。多分この辺りは追加されている可能性もあるので注意して追加してください。

policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf

check_policy_service unix:private/policyd-spfですね。master.cfで受信した物を振り分ける機能になります。最後に入れてあるのは上記を通りきらなかったメールを最終的にチェックする事になります。

Postfix再起動

設定を反映するため、Postfixを再起動します

sudo systemctl restart postfix

テストメール受信

SPFレコードが適切に設定されたドメインからのメールを受信すると、メールヘッダに以下が追加されます。もっともここ最近のメールサーバでは後述するDKIM,DMARCによっては付かない可能性もあります。

Received-SPF: Pass

続いてDKIM行ってみましょう。

DKIM

との事で送信ドメイン認証の追加版といった所でしょうか。これがあるとspfと同時に厳正チェックをしてくれます。早速設定を行っていきましょう。

今回はまず必要なモジュールをインストールする所から始めます。

sudo apt install opendkim opendkim-tools
sudo gpasswd -a postfix opendkim
sudo cp /etc/opendkim.conf /etc/opendkim.conf.org
sudo vi /etc/opendkim.conf

としてconfファイルを変更します。

変更箇所は三つ

Canonicalization        relaxed/simple
Mode                    sv
SubDomains              no

そして追加部分が以下です。

KeyTable            refile:/etc/opendkim/key.table
SigningTable        refile:/etc/opendkim/signing.table
ExternalIgnoreList  /etc/opendkim/trusted.hosts
InternalHosts       /etc/opendkim/trusted.hosts

そしてそれぞれのファイルが入るフォルダを作って行きます。

sudo mkdir -p /etc/opendkim/keys/hogehoge.com
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod 700 /etc/opendkim/keys

/etc/opendkim/signing.tableを新規作成します。

*@hogehoge.com      default._domainkey.hogehoge.com

/etc/opendkim/key.tableを新規作成します。

default._domainkey.hogehoge.com     hogehoge.com:default:/etc/opendkim/keys/hogehoge.com/default.private

/etc/opendkim/trusted.hostsを新規作成します。

127.0.0.1
locahost

*.hogehoge.com

それぞれhogehoge.comは自分のドメインに変更して下さいね。

秘密鍵/公開鍵のキーペア作成

DKIMでは送信メールへの署名とメッセージの受信検証のために、署名のためのプライベートキーとリモートの確認者のためにパブリックキーを作成します。

パブリックキーは後程DNSを使って公開します。

sudo opendkim-genkey -b 2048 -d hogehoge.com -D /etc/opendkim/keys/hogehoge.com -s default -v
sudo chown opendkim:opendkim /etc/opendkim/keys/hogehoge.com/default.*
sudo cat /etc/opendkim/keys/hogehoge.com/default.txt

表示されたパブリックキーは改行やダブルクオーテーションなどで区切られていますが必要なのはp=から始まるキーです。その部分をコピーしておいてDNSに反映させます。例えば

default._domainkey      IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwndjVvUhESSAm9ARmA9hh4GBPdf+yjSxTJ+2gsdTVUr0aYykMT9GWST0FlmGHd0Myq/+8TaqoDiEsAWrvHu8fsc0zvw6Svf7JbBRocxxxxxxxxxOA3duQ+JyU8Yw70sXxRn4d8ODheqaCFaALVUNnndL9O+N15kVQ38OAt3u3FZFm3ZlrHlc8xxppxGwV4JrOyeYJPjpFmXG3"
          "HZu7S29W8gwpBhnjYeOk43LH1OctZzjab8L3A3VAoMkhKHfwuxGqewptXV1SqWZtae2fU+dvUnf9WTMng6dilVzB18Ns39O4eSu/xui9KDEq5gv+nlUFnUeYLBr9W7hPHAuzb5xQIDAQAB" )  ;

となっていた場合value-domainに追加する文字としては

txt _adsp._domainkey.hogehoge.com dkim=unknown
txt default._domainkey.hogehoge.com v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwwndjVvUhESSAm9ARmA9hh4GBPdf+yjSxTJ+2gsdTVUr0aYykMT9GWST0FlmGHd0Myq/+8TaqoDiEsAWrvHu8fsc0zvw6Svf7JbBRocxxxxxxxxxOA3duQ+JyU8Yw70sXxRn4d8ODheqaCFaALVUNnndL9O+N15kVQ38OAt3u3FZFm3ZlrHlc8xxppxGwV4JrOyeYJPjpFmXG3HZu7S29W8gwpBhnjYeOk43LH1OctZzjab8L3A3VAoMkhKHfwuxGqewptXV1SqWZtae2fU+dvUnf9WTMng6dilVzB18Ns39O4eSu/xui9KDEq5gv+nlUFnUeYLBr9W7hPHAuzb5xQIDAQAB

という感じで追加します。一行ですね。ここを間違えるとDKIMがPASSできません。気を付けて登録して下さい。

確認

opendkim-testkeyコマンドを使って今登録したキーが反映及びPASSするか確認します。

sudo opendkim-testkey -d hogehoge.com -s default -vvv

すると

opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key ‘default._domainkey.hogehoge.com’
opendkim-testkey: key not secure
opendkim-testkey: key OK

となれば成功です。太字で示したkey not secureですがさくらのVPNとvalue-domainとの連携でDNSSECという機構を利用できなかったのでこれでOKとしました。

PostfixとOpenDKIMの連携

今度はPostfixとの連携です。以下の通りとしました。

sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
sudo vi /etc/opendkim.conf

として再びファイルを開いてSocket部分を修正します。

Socket    local:/var/spool/postfix/opendkim/opendkim.sock

/etc/default/opendkimも同様に変更します。

SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

/etc/postfix/main.cfを加筆します。

milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

smtpd_miltersは後程DMARCで修正します。まずはDKIMのみ設定します。

終わったらpostfixとopendkimの再起動を行います。

sudo systemctl restart postfix opendkim

これでDKIMが働き始めます。試してみましょう。

一番簡単なチェック方法としては自ホストからgmailに送信してみる事です。

送信されたメールの詳細をgmail上でチェックするとDKIMの項目が増えているはずです。

そこがPASSとなっていればDKIMは正常に働いています。

続いてDMARCに移りましょう。

DMARC

ということでDMARCの設定を行っていこうと思います。

DNSに設定

まずは追加項目を見て下さい。

txt _dmarc v=DMARC1; p=none; pct=100; fo=1; rua=mailto:dmarc-reports@hogehoge.com; ruf=mailto:dmarc-reports@hogehoge.com;

各項目の詳細は今回説明すると長くなりますので、このような物として扱ってくれると助かります。詳細は先ほどの説明に載っております。重要なのはruaとrufのメールアドレスを自身のアドレスに変更して下さい。このアドレスに対して成功、失敗のメールが飛んできます。実在するアドレスで飛んできても良いアドレスにしてください。

OpenDMARCのインストール

次はモジュールを追加します。

sudo apt install -y opendmarc

そしてDNSに登録したDMARCの情報が拾えるかテストします。

sudo opendmarc-check hogehoge.com

すると以下のような項目が表示されます。

DMARC record for hogehoge.com:
        Sample percentage: 100
        DKIM alignment: relaxed
        SPF alignment: relaxed
        Domain policy: none
        Subdomain policy: unspecified
        Aggregate report URIs:
                mailto:dmarc-reports@hogehoge.com
        Failure report URIs:
                mailto:dmarc-reports@hogehoge.com

DNSに設定された情報をもとに表示されます。これが出ない場合DNSへの登録が失敗しています。修正してください。

次に/etc/opendmarc.confを変更加筆します。

変更部分は以下です。

AuthservID OpenDMARC
TrustedAuthservIDs FQDN
RejectFailures true
Socket local:/var/spool/postfix/opendmarc/opendmarc.sock

FQDNは自ホストのフルアドレスを記載してください。

追加する部分は以下です。

IgnoreHosts /etc/opendmarc/ignore.hosts
IgnoreAuthenticatedClients true
RequiredHeaders true
SPFSelfValidate true

加筆修正が終わったらIgnoreHosts用のフォルダを作成してignore.hostsを追加します。

sudo mkdir /etc/opendmarc
sudo touch /etc/opendmarc/ignore.hosts

/etc/opendmarc/ignore.hostsの中身は以下のようにします。

127.0.0.1

次にsocket関連を修正します。

まずはフォルダを作成等を行います。

sudo mkdir -p /var/spool/postfix/opendmarc
sudo chown -R opendmarc:opendmarc /var/spool/postfix/opendmarc
sudo chmod 750 -R /var/spool/postfix/opendmarc
sudo gpasswd -a postfix opendmarc

/etc/postfix/main.cfを変更します。先ほどDKIMで修正しますと言ったところを加筆します。

smtpd_milters = local:opendkim/opendkim.sock,local:opendmarc/opendmarc.sock

最後にpostfixとopendmarcを再起動します。

sudo systemctl restart postfix opendmarc

最終確認

全て終わるとspf,dkim,dmarcの設定が完了されたメールが送受信できるようになります。

まずは自ホストからgmailに送信してみてください。また項目が増えてSPF,DKIM,DMARCのそれぞれがPASSとなっていれば成功です。

逆にgmailから自ホスト宛にメールを送信してメールのソースを確認して下さい。

Authentication-Results: OpenDMARC; dmarc=pass (p=none dis=none) header.from=gmail.com
Authentication-Results: OpenDMARC; spf=pass smtp.mailfrom=gmail.com
Authentication-Results: mail.hogehoge.com;
	dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=K3ZOAA6m;
	dkim-atps=neutral

こんな感じでdmarc経由でSPFなどを調べたりその後DKIMでチェックされたりと色々とチェックしてくれます。

総括

色々と端折り過ぎた所もありますが各種チェックが正常になりました。これで2月を迎えられそうです。

設定自体は大したことはありませんのでぜひ設定してセキュアなメール送受信を行うようにしましょう。

そしてこれの良い所はDNSの設定を多少弄るだけで迷惑メール対策もできるようになります。

コメント

タイトルとURLをコピーしました