こんにちは、技術部ネットワーク課の上曽山です。
先日DKIMの設定を行う機会があったので、RockyLinux9.3でDKIM署名するための設定内容をまとめました。
サーバーの構築手順を全部書くと長くなるため、メールサーバーは構築済みの前提で、DKIMの設定を追加する部分だけピックアップしています。
- サービスの構成
- opendkimインストール
- 秘密鍵の作成
- /etc/opendkim.confの設定
- KeyTableの設定
- SigningTableの設定
- 設定反映
- postfixの設定
- ログの出力例
- 最後に
サービスの構成
メールサーバーの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署名だけなら割と簡単に出来るので、メールサーバーを運用されている方には設定をオススメします。
この記事がメール送信時のドメイン認証で困っている方の一助になれば幸いです。