postfix とdovecot (SMTP Auth) でvirtual その6(postfixとDKIM)

DKIMの導入

DKIM(DomainKeys Identified Mail)はJPNICに詳しい説明があるので説明を省くとして、要はDNSと公開鍵署名を組み合わせたものなので、postfixで送信するときに秘密鍵にて署名。DNSで公開鍵を取得できるから、鍵が合致しないものは成りすましているのでは?と疑える技術だと思っている。

とりあえず、メールサーバとして受取先に信用してもらうため、、MXレコードの追加、IPアドレスの逆引き設定、SPFレコードの設定と続けてきて、このDKIMを導入したのちに、DMARCを設定するという作業を行っている。

多分こちらのサイトを確認したほうがよりよくまとまっていると思うので…ぜひ参考に。(こっちを参考にしたらよかったと、作った後で後悔するぐらい。)
OpenDKIM で迷惑メール判定を回避する

OpenDKIMのインストール

# dnf install opendkim

設定ファイル、秘密鍵などのディレクトリを確認する。/etc/opendkim.confがあること、/etc/opendkim/keys/があることなど。

署名用の鍵を作成する。

# mkdir /etc/opendkim/keys/redalarm.jp

※今回は自社ドメインなので、ここは各メインドメインを入れるといいと思う。

# opendkim-genkey -D /etc/opendkim/keys/redalarm.jp/ -d redalarm.jp -s s20210501
# chown -R opendkim:opendkim /etc/opendkim/keys

鍵をつくるコマンド。-sのところは任意の文字列らしい。先頭に数字は使えないようなので、sを付けた後に日付を入力した。

作成されたものを確認する。

# cat /etc/opendkim/keys/redalarm.jp/s20210501.private
# cat /etc/opendkim/keys/redalarm.jp/s20210501.txt

-s で指定したセレクター名「s20210501」がファイル名として利用されていることに注意。.privateは秘密鍵なので、不特定多数の人が取得できるようなところに貼り付けない。メールで送らないなどの慎重な行動が求められる。.txtはDNSで指定するときに必要な情報。
※セレクターは複数ドメインを扱わないなら指定しなくてもよかったなーと思ったりしている。

s20210501._domainkey IN TXT ( “v=DKIM1; k=rsa; “
“p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+DbKQR9EFnsHlb1tL4JQZJG9yfjSSIdMjn+/K6SyDaHGTJzQEoULSk7xCaoaC84HCn9Hc/OhIDAaQGyeY2v3nzFrUVxkAU9bAKhVDgqMXVRanU6ltrAbl2lwwE/atrU5wKNupWlYRQP7MhpFvh14GGilXdoVXzhNzpoycx7jo0wIDAQAB” ) ; —– DKIM key s20210501 for redalarm.jp

これをDNSに登録。TXTで引けることを確かめる。

/etc/opendkim.confを送信時署名ができるかというテストに

追記や変更部分は赤字。Mode は初期値がv で受信時のチェックに利用するというもの。sだけだと送信時。svで送受信って参考サイトにあった。

# egrep -v ‘^$|^#’ /etc/opendkim.conf
PidFile /run/opendkim/opendkim.pid
Mode s
Syslog yes
SyslogSuccess yes
LogWhy yes
UserID opendkim:opendkim
Socket inet:8891@localhost
Umask 002
SendReports yes
SoftwareHeader yes
Canonicalization relaxed/relaxed
Selector default
MinimumKeyBits 1024

## Gives the location of a private key to be used for signing ALL messages. This
## directive is ignored if KeyTable is enabled.
#KeyFile /etc/opendkim/keys/default.private

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


OversignHeaders From

KeyTable

# cat /etc/opendkim/KeyTable
s20210501._domainkey.redalarm.jp redalarm.jp:s20210501:/etc/opendkim/keys/redalarm.jp/s20210501.private

DKIM用のFQDNとメインドメイン、セレクター名、秘密鍵を一気に紐づける。

SigningTable

# egrep -v ‘^$|^#’ /etc/opendkim/SigningTable
*@redalarm.jp s20210501._domainkey.redalarm.jp

複数ドメインを扱わないなら不要っていうのを見ていればなぁ…まあ、mantisやZabbixで複数テーブルを利用したので良しとしないとかな…

TrustedHosts

# cat /etc/opendkim/TrustedHosts
127.0.0.1
::1

初期値にした。内部ネットワークなどは無いので。

自動起動設定

# systemctl enable opendkim.service
Created symlink /etc/systemd/system/multi-user.target.wants/opendkim.service → /usr/lib/systemd/system/opendkim.service.

/etc/postfix/main.cf に追記

# cat /etc/postfix/main.cf
# DKIM利用
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:localhost:8891
milter_default_action = accept

自分の作業記録では上記の部分をvimで変更していたけれど、postconfを使えばこうなると思う。

postconf -e smtpd_milters=inet:127.0.0.1:8891
postconf -e non_smtpd_milters=inet:localhost:8891
postconf -e milter_default_action=accept

最終的なopendkim.conf

# egrep -v ‘^#|^$’ /etc/opendkim.conf
PidFile /run/opendkim/opendkim.pid
Mode sv
Syslog yes
SyslogSuccess yes
LogWhy yes
UserID opendkim:opendkim
Socket inet:8891@localhost
Umask 002
SendReports yes
SoftwareHeader yes
Canonicalization relaxed/relaxed
Selector default
MinimumKeyBits 1024
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
OversignHeaders From