シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

RockyLinux9.3でのDKIM署名設定

こんにちは、技術部ネットワーク課の上曽山です。

先日DKIMの設定を行う機会があったので、RockyLinux9.3でDKIM署名するための設定内容をまとめました。
サーバーの構築手順を全部書くと長くなるため、メールサーバーは構築済みの前提で、DKIMの設定を追加する部分だけピックアップしています。

サービスの構成

メールサーバーのMTAはpostfixです。
postfix自身にはDKIM署名する機能が無いので、Milter(Mail filter)であるopendkimと連携させます。

opendkimインストール

  • リポジトリ追加

opendkimのパッケージは標準リポジトリには置いていないため、必要なリポジトリを追加します。

dnf config-manager --enable crb
dnf install epel-release
  • パッケージインストール

リポジトリを追加したらopendkim、opendkim-toolsをインストールします。

dnf install opendkim opendkim-tools

秘密鍵の作成

  • 秘密鍵作成準備

秘密鍵作成の前にDKIMレコード作成で必要になる、ドメイン名とセレクタ(識別子)を決めます。
ドメイン名はメールサーバーのドメイン。セレクタは任意の文字列となりますが、秘密鍵を更新する時に区別がつくものが良いでしょう。

設定内容
ドメイン名 example.com
セレクタ 240301
  • 秘密鍵作成

opendkim-toolsには秘密鍵を作成するためのユーティリティが含まれているので、これを使うとDKIMレコードのサンプルも作成してくれて便利です。

秘密鍵は「<セレクタ>.private」という名前で指定したディレクトリに作成されます。
秘密鍵のファイルオーナーはコマンドを実行したユーザーになっているので、opendkimがファイルを読み取れるよう忘れずに変更しておきましょう。

opendkim-genkey --directory=/etc/opendkim/keys/ \
                --domain=example.com \
                --selector=240301 \
                --bits=2048 \
                --append-domain
chown opendkim:opendkim /etc/opendkim/keys/*
  • DKIMレコードの確認

秘密鍵と同時に「<セレクタ>.txt」という名前でDKIMレコードのサンプルが作成されます。
末尾のコメントを除き、そのままDNSサーバーのゾーンファイルに貼り付けて使う事が出来るので、先にDNSに設定しておきましょう。
※これはダミーデータです。

[root@localhost ~]# cat /etc/opendkim/keys/240301.txt
240301._domainkey.example.com.        IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=VBJxOJSSIXjwvunsZeEvrqfkqwXhzhEyMZMmsptOQylNsJYHXVtJQnRODlltsIbGrwOXcXzmyxnoDTIPGdeoVruyGSdfSiYiqfVlUJED+iqEopaUXsyLqTSqwVSTrEKeORxBRsIWGUWqRVxRjxcOJUsiKQpNmtL+RKrErLuxwKKgxhcvJDLgjqvwZSMOKLjEyfbGTUOk+yYOiyd/LwbMADPBEhWBFSacbJ/LKwDpOmMktwUHcjhTnzyxMt"
          "BQRIYfYk/rFQzbhPghvqvlhvVYYwnFf+cj/KPsWDdRajRRfc+GY+rDewpwBaPOaWltEnuvqhpTMNOHVQizrbtMgrfAgARHFJwbFdJdRpSH+NzJHXOTIofZQbetvQwwPTJesnQLUWo+IG+p" )  ; ----- DKIM key 240301 for example.com

/etc/opendkim.confの設定

  • Mode

動作モードに「s(検証)」を追加します。

Mode   v
 ↓
Mode   sv
  • KeyTable

KeyTableを使用するためコメントを外します。

# KeyTable     /etc/opendkim/KeyTable
 ↓
KeyTable       /etc/opendkim/KeyTable
  • SigningTable

SigningTableを使用するためコメントを外します。
設定ファイル名の前に「refile:」と付けてあるとファイルの内容が正規表現で扱われるようになります。

# SigningTable refile:/etc/opendkim/SigningTable
 ↓
SigningTable   refile:/etc/opendkim/SigningTable

KeyTableの設定

  • 書式

KeyTableではDKIM署名を行う際の「ドメイン名」「セレクタ」「秘密鍵」のセットを定義します。

<データセット名> <ドメイン名>:<セレクタ>:<秘密鍵ファイルのパス>
  • 設定例

データセット名はドメイン名、セレクタが判別出来るようDKIMレコード名を使っています。

240301._domainkey.example.com example.com:240301:/etc/opendkim/keys/240301.private

SigningTableの設定

  • 書式

SigningTableはメールアドレスが使用する署名のデータセットを定義します。
メールアドレス毎にデータセットを変える事も出来ますし、ワイルドカードを使ってすべてのメールアドレスに同じデータセットを使う事も出来ます。
ここで参照するメールアドレスは、メールヘッダーに記載されたFromアドレスになります。

また、メールアドレスとデータセットの組み合わせを複数書く場合、上から評価して最初にマッチしたものが適用される点に注意が必要です。

<メールアドレス> <データセット名>
  • 設定例

ここでは同じドメインで2パターンの設定を追加してあります。
 ①すべてのメールアドレス(*@example.com) にマッチする設定
 ②任意のメールアドレス(mailtest@example.com) にマッチする設定

先述の通り先にマッチした組み合わせが適用されるので、②の設定が使用される事はありません。

*@example.com 240301._domainkey.example.com
mailtest@example.com 19980701._domainkey.example.com

設定反映

以上でopendkimの設定は完了です。
サービスの自動起動も有効にすると同時にopendkimを起動します。

systemctl enable --now opendkim.service

postfixの設定

  • ソケットの確認

opendkimとの通信に使うソケットを確認します。

[root@localhost ~]# grep "^Socket" /etc/opendkim.conf
Socket local:/run/opendkim/opendkim.sock
  • UNIXドメインソケットを使う時の注意点

設定を変更する前に、postfixがソケットファイルにアクセス出来るか確認しておきましょう。

[root@localhost ~]# sudo -u postfix ls -l /run/opendkim/opendkim.sock
ls: cannot access '/run/opendkim/opendkim.sock': Permission denied
  • group設定変更

通常は一時ディレクトリである/run/opendkimがopendkimしかアクセス出来ないようになっているためファイルにアクセス出来ません。
opendkimグループにpostfixを追加してアクセス権を得ます。

usermod -aG opendkim postfix
  • アクセス権の確認

postfix権限でファイルの情報を表示出来ればOKです。

[root@localhost ~]# sudo -u postfix ls -l /run/opendkim/opendkim.sock
srwxrwxr-x 1 opendkim opendkim 0 Feb 21 17:48 /run/opendkim/opendkim.sock
  • 一時ディレクトリの初期値確認

サーバー起動時の/run/opendkimのパーミッションは/usr/lib/tmpfiles.d/opendkim.confで設定してあります。念のため確認しておきましょう。
「0750」や「0770」のようにグループのアクセス権が付与されていればOKです。

[root@localhost ~]# cat /usr/lib/tmpfiles.d/opendkim.conf
D /run/opendkim 0750 opendkim opendkim -
  • /etc/postfix/main.cfの設定

postfixのmain.cf末尾に以下の設定を追加します。
「smtpd_milters」には1つ前の手順で確認したソケットを設定してください。

smtpd_milters = local:/run/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
  • サービス再起動

設定を変更したらpostfixを再起動します。

systemctl restart postfix.service

ログの出力例

以上でメールにDKIM署名を行う設定は完了です。
最後にopendkimのログ出力例をいくつか記載します。
ログはメールログに出力されます。postfixのキューIDも追加されるので、どのセッションに対するログなのか判別するのも容易です。

  • 正常動作

DKIMシグネチャを追加したログが出力されていれば正常に動作しています。

Mar  1 20:17:53 localhost opendkim[1148]: 6541C11803: DKIM-Signature field added (s=240301, d=example.com)
  • opendkimと通信出来ない時

opendkimが停止している時のログ。

Mar  1 20:22:08 localhost postfix/smtpd[8514]: warning: connect to Milter service local:/run/opendkim/opendkim.sock: No such file or directory

ソケットファイルや一時ディレクトリのアクセス権が正しくない時のログ。

Mar  1 20:24:32 localhost postfix/smtpd[8672]: warning: connect to Milter service local:/run/opendkim/opendkim.sock: Permission denied
  • 署名対象のメールアドレスではない時

SigningTableで定義していないアドレスでメールを送信した時のログ。

Mar  1 21:39:07 localhost opendkim[5578]: 7FF97113F8: no signing table match for 'hogehoge@example.org'
Mar  1 21:39:07 localhost opendkim[5578]: 7FF97113F8: no signature data
  • 秘密鍵ファイルが読み込めない時

秘密鍵ファイルが読み込めないとメールが送信出来ないので、ファイル名やパーミッションに間違いがないか、十分確認しましょう。
ファイルが存在しない時のログ。

Mar  1 21:49:20 localhost opendkim[5605]: can't load key from /etc/opendkim/keys/240301.private: No such file or directory
Mar  1 21:49:20 localhost opendkim[5605]: 8A8E8113F8: error loading key '240301._domainkey.example.com'

opendkimが秘密鍵にアクセス出来ない時のログ。

Mar  1 21:52:05 localhost opendkim[5605]: can't load key from /etc/opendkim/keys/240301.private: Permission denied
Mar  1 21:52:05 localhost opendkim[5605]: 4670B113F8: error loading key '240301._domainkey.example.com'

ファイルオーナー以外がファイルにアクセス可能な時のログ。

Mar  1 21:55:27 localhost opendkim[5605]: 240301._domainkey.example.com: key data is not secure: /etc/opendkim/keys/240301.private can be read or written by other users
Mar  1 21:55:27 localhost opendkim[5605]: 46D32113F8: error loading key '240301._domainkey.example.com'

最後に

DKIM署名だけなら割と簡単に出来るので、メールサーバーを運用されている方には設定をオススメします。
この記事がメール送信時のドメイン認証で困っている方の一助になれば幸いです。