迷惑メールと判断されない為のDKIMの設定をLinuxサーバで実施する方法

2024年2月にgmailでセキュリティ対策が強化され、DKIMの設定がされていないと迷惑メールとして判断される可能性が高まります。SPFの設定は実施していても、DKIMの設定までは実施していないサーバも多いと思われます。ここではpostfixでopendkimを使用して対応する手順を紹介します。

またgoogle(gmail)でセキュリティが強化されるのですね。

そのようです。今回は5000通/日を超えるメールをgmail宛てに送付する場合、DKIMが設定されていないと、ブロックされる可能性が高まります。とはいえ、今後は必須になってくるでしょうから、早めに対応しておくのが良いですね。

DKIM(opendikim)のパッケージをインストール

ここではすでにpostfixでメール配送しており、追加でDKIMを導入するという前提で進めます。またLinuxサーバ環境は、AlmaLinux8の環境で動作を確認しています。

まず、下記のとおり、必要なパッケージであるopendkimとopendkim-tools パッケージをインストールします。

特にエラー等が無ければ、インストールは完了です。もしopendkimのパッケージが見つからなければ、EPELリポジトリが必要ですので、下記のコマンドであらかじめ追加ください。

<2024年9月20日追記>
AlmaLinux9の環境で、opendkimをインストールしようとしたところ、以下のエラーメッセージが表示されました。

# dnf install opendkim opendkim-tools
Extra Packages for Enterprise Linux 9 - x86_64                                                         4.8 MB/s |  23 MB     00:04
Last metadata expiration check: 0:00:08 ago on Thu Sep 19 09:56:15 2024.
Error:
 Problem 1: conflicting requests
  - nothing provides libmilter.so.1.0()(64bit) needed by opendkim-2.11.0-0.36.el9.x86_64 from epel
  - nothing provides libmemcached.so.11()(64bit) needed by opendkim-2.11.0-0.36.el9.x86_64 from epel
 Problem 2: conflicting requests
  - nothing provides libmemcached.so.11()(64bit) needed by opendkim-tools-2.11.0-0.36.el9.x86_64 from epel
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

crbのリポジトリに必要なパッケージが含まれるようなので、以下のようにオプションを付与して、コマンドを実行すると問題なくインストールできました。

DKIMで使用する秘密鍵と公開鍵を作成

まず、今回作成する鍵を保存する領域(dassyi)を作成します。

次に opendkim-genkey コマンドを使用して、鍵を作成します。出来た鍵の所有者とグループをopendkimに変更しておきます。

具体的なオプションの内容は以下の表の通りです。

オプション指定するパラメータの詳細
-b作成するキーのビット数です。デフォルトは1024なので、ここでは2048を指定します。
-Dキーファイルの保存領域のパスです。ここでは上記で作成したディレクトリにします。
-dドメイン名です。今回は dassyi.com を指定します。
-sセレクタ名です。なんでも良いのですが、ここでは日付とホスト名を指定します。
opendkim-genkeyオプション一覧

作成したディレクトリには、20240105-vhost01.private と 20240105-vhost01.txt のファイルが出来上がっています。

DNSサーバへTXTレコードを登録する

先ほど出来上がった、後者の20240105-vhost01.txt のファイルを開いて、この内容をdassyi.comを管理しているDNSサーバのTXTレコードに登録します。

ファイルの中身は、

# more dassyi/20240105-vhost01.txt
20240105-vhost01._domainkey     IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1JgzxPSKYkqvfSEsxK9cBm7j+cxfss3/NnQmeePV1gWe+y3FsXU1L3fka2z7N+YN2u40HnqK6PKO9RzOcn56muJ9mi+OfgFyQqlaUZdOa
Nzl+708uuEBvPG8dX5SDlpvC2IhW86DZN7QTD91ps9fQAsBByl9dBkOhybkNz5iMzGu2tQuaIEMdLsCYOMIw6shTNL0fwJRMHjLkP"
          "Sd1MAbcomSeUL80qguA7rpB4S87MpuVwTPZghmrhxQK9EfzE3ArOS+CunPD6vxsg8TXOxGI3HbQFGc4dAAKFV7KqoKlVdyIIkWn5PZFo8XyjdlkYwIPnKJOF/OOVKThK7SDBdJIwIDAQAB" )  ; --
--- DKIM key 20240105-vhost01 for dassyi.com

のような感じですが、DNSには、ホストを、20240105-vhost01._domainkey とし、TXTレコードの中身は、”v=DKIM1; k=rsa; ” “p=MII~” と記述します。2048ビットのカギを作成していると長くなるので、途中の ” ” も漏れなく記載するようにします。(上記の例ですと、~DAQAB” まで記載する)

なお、DKIM署名が有効でないメールの扱いを設定するためのADSPレコードを登録するように紹介されているサイトもありますが、もはや誰も見ていないとの事で、特に登録する必要はありません。

DNSサーバ(bind)については、こちらで詳しく記載していますので、もしよろしければ参照ください。

opendkimの設定(opendkim.conf)

設定ファイルは、/etc/opendkim.conf になります。まずはバックアップを取得して、以下の点を修正していきます。

具体的な編集内容とその意味は下記になります。

Mode  s     →動作モードです。今回は送信メールにDKIMの署名を追加します
Socket  inet:8891@localhost  →ローカルの8891番ポートを使用します
#Socket local:/run/opendkim/opendkim.sock  →こちらはコメント化
SoftwareHeader        no  →セキュリティの観点からソフトウェアのバージョンを非表示
#KeyFile  /etc/opendkim/keys/default.private  →KeyTableファイルを使用するためコメント化
KeyTable      /etc/opendkim/KeyTable  →ドメイン名と秘密鍵ファイルを紐づけるファイルを指定
SigningTable  refile:/etc/opendkim/SigningTable →送信元のドメインとホスト名を紐づけるファイルを指定
ExternalIgnoreList    refile:/etc/opendkim/TrustedHosts →メール送信が行われる外部のホストを指定
InternalHosts refile:/etc/opendkim/TrustedHosts → 署名されるホストを指定

KeyTableファイルの設定

ここでは、ドメイン名と秘密鍵ファイルを紐づける設定を実施します。
まず、ファイルのバックアップを取得して設定を追記します。

ファイルの中身には、
<セレクタ名>._domainkey.<ドメイン名> <ドメイン名>:<セレクタ名>:<秘密鍵ファイルへのフルパス>
を記載します。このサイトでの具体的な内容としましては、以下の一行を追記します。

20240105-vhost01._domainkey.dassyi.com dassyi.com:20240105-vhost01:/etc/opendkim/keys/dassyi/20240105-vhost01.private

SigningTableファイルの設定

ここでは、送信元のドメインとホスト名を紐づけします。
こちらもまず、ファイルのバックアップを取得して設定を追記します。

ファイルの中身には、
*@<ドメイン名> <セレクタ名>._domainkey.<ドメイン名>
を記載します。このサイトでの具体的な内容としましては、以下の一行を追記します。

*@dassyi.com 20240105-vhost01._domainkey.dassyi.com

TrustedHostsファイルの設定

ここでは、メールの送信を行うpostfixサーバのIPアドレスを指定します。今回は同じサーバ内でpostfixを稼働させるので、ループバックアップドレス(127.0.0.1)を指定します。(デフォルトで指定されています)

opendkimのサービス稼働

ここまで設定が完了しましたら、opendkimのサービスの稼働と自動起動を有効にします。

特にエラー等が出ない事を確認します。

Postfix側のDKIMに対応するための設定追加

postfixの設定ファイルである、/etc/postfix/mail.cfに以下を追記します。

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

設定が完了しましたら、postfixのサービスを再起動しておきます。

送信メールにDKIMの署名が付与されているか動作確認

設定したサーバからメールを送付してみましょう。一番手っ取り早いのは、gmail宛てに送付することです。gmailに届いたメールのヘッダ情報を確認して、DKIM Pass となっていればOKです。

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dassyi.com;
s=20240105-vhost01; t=1704548989;
(以下、割愛)
といったシグネチャ情報がメールヘッダに追加されているはずです。

もしサーバ側で確認するには、 /var/logmaillog を確認しましょう。

DKIM-Signature field added (s=20240105-vhost01, d=dassyi.com)

といったログが残っていれば、署名されています。

googleの新しいセキュリティポリシーに対応するためのSTARTTLSの設定

今回参考情報として、postfixでSTARTTLSに対応する為の手順を記載します。こちらも2023年12月にgoogleから提示されたメール送信する際の新しいセキュリティポリシーに含まれています。

設定自体は簡単です。以下の3行をpostfixの/etc/postfix/main.cfに追加ください。

smtp_tls_CAfile = /etc/pki/tls/cert.pem  
smtp_tls_security_level = may
smtp_tls_loglevel = 1

設定が終了しましたら、サービスの再起動を行い、反映させます。

動作確認は、/var/log/maillogを確認して、SSL/TLSで通信したログの記録を確認します。

今回はここまです。最後までお読みいただきありがとうございました。