Ubuntu 22.04 上の Postfix で SPF / DKIM / DMARC を使う。

メールをちゃんと受け取ってもらえるよう、自分のドメイン(netarium.jp ではない)で SPF と DKIM を設定した。DMARK も設定したい。

SPF

SPF は Sender Policy Framework の略。DNS を使って送信元メールアドレスを検証する仕組み。

メールが到着したときに送信元が正しいかどうか調べる。例えば、ホスト hoge.domain.com から差出人が fuga@domain.com のメールが来たとする。
DNS で差出人のドメイン domain.com の TXT レコードを調べると "v=spf1 mx ~all" だった。これはドメイン domain.com からのメールはそのドメインの MX (Mail eXchange) から発信されるということを表している(ちなみに ~all~ は、それ以外のホストから来ても受け取ってくれという意味)。本当なら -all でそれ以外のホストから来たものは受け取らないようにしても良かったかも。メールの送信元が MX レコードにあれば、このメールは正しいということになる。このあたり、インターネット協会の Web ページを読んで勉強した。

具体的にはネームサーバのゾーンファイルに hoge.com. IN TXT "v=spf1 mx ~all" という行を足して反映させた。送信メールに関してはこれで終わり。

受信メールの設定は、/etc/postfix/master.cf に以下を追加。

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

/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

設定が終わったら、systemctl restart postfix で Postfix を再起動する。
Gmail からメールを送信して、ヘッダを確認。Received-SPF: Pass... のような行が追加されているはず。

DKIM

DKIM は Domainkeys Identified Mail の略。送信側メールサーバで電子署名を付加、受信メールサーバで検証する。検証に使う公開鍵は DNS で得る。

電子署名の作成時には、メールヘッダとメールボディから署名を作成する。中継されるサーバ等でヘッダが追加されることがあるので(ウイルスチェックとか SPAM チェック)、どのヘッダを署名対象にしたか等もヘッダに入れている。これもインターネット協会の Web ページを読んで勉強した。

具体的には OpenDKIM を入れていろいろやった。まずは sudo apt install -y opendkim opendkim-tools で OpenDKIM 関連のモノを入れる。Postfix が OpenDKIM の諸々のファイルをいじれるように、ユーザ postfix をグループ opendkim に追加。
続いて /etc/opendkim.conf を修正。Canonicalization simpleCanonicalization relaxed/simple に修正。最初の simple はメールヘッダ・ボディの改変を許容しないという意味。relaxed/simple はヘッダは多少は許すけど、ボディは許さないということ。もしかしたら ModeSubDomains の行も最初コメントアウトされていたかも。
そして、最後の 4 行を追加する。

# Canonicalization        simple
# Mode                    sv
# SubDomains              no
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

前記の設定ファイルであったディレクトリ・ファイルをつくる。/etcopendkim ディレクトリを作成し、その中に keys ディレクトリをつくる。keys ディレクトリの中にはドメイン名のディレクトリ(例えば netarium.jp)をつくる。sudo chown -R opendkim:opendkim /etc/opendkim で owner と group を変えて、sudo chmod 700 /etc/opendkim/keys で他のユーザがアクセスできないようにする。

/etc/opendkim/signing.table を作成する。

*@domain.com      default._domainkey.domain.com

/etc/opendkim/key.table を作成する。

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

/etc/opendkim/trusted.hosts を作成する。最終行の *.domain.com が効くのかは未確認。

127.0.0.1
localhost

*.domain.com

以下のコマンドで鍵を作成する。

$ sudo opendkim-genkey -b 2048 -d ドメイン -D /etc/opendkim/keys/domain.com -s default -v
$ sudo chown opendkim:opendkim /etc/opendkim/keys/domain.com/default.txt /etc/opendkim/keys/domain.com/default.private
$ sudo chmod 600 /etc/opendkim/keys/domain.com/default.private

生成された /etc/opendkim/keys/domain.com/default.txt をネームサーバに登録する。

登録後に確認してみる。

$ sudo opendkim-testkey -d domain.com -s default -vvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'default._domainkey.domain.com'
opendkim-testkey: key not secure
opendkim-testkey: key OK
$ 

上記のような出力があれば良い。key not secure は DNSSEC についてのものなので、これで良い。

受信メールチェックの設定は、下記の 4 行を /etc/postfix/main.cf に追加。

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

OpenDKIM と Postfix を再起動して、メール送信。DKIM-Signature ヘッダを確認する。

DMARC

まだ理解しきれていない。要調査。

コメント

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