Postfixに送信ドメイン認証技術の一つであるDKIMを設定しました。
Summary
- 当方のAlmaLinuxで稼働しているメールサーバーPostfixに送信ドメイン認証技術の一つであるDKIM(Domain Keys Identified Mail)を設定しました
- DKIMは送信サーバーが秘密鍵を使ってメールに電子署名を付与し、受信サーバーが公開鍵を用いてメールに添付された署名を検証する技術です
- 後述のとおり、Xserver VPSのDNS設定でミスを犯し四苦八苦しました
Reference
- ベアメール | DKIMとは? 仕組みから導入方法までわかる入門ガイド
- DKIMの仕組みが初心者のわたしくしでも解りやすく説明されています
- ベアメール | OpenDKIM×Postfixを使ってDKIMを設定する
- 解りやすい説明で、今回の設定にあたって上記ページでご説明いただいている手順に倣いました
- ベアメール | DKIMレコードの書き方は? 設定・確認方法や失敗例も解説
- 設定の失敗例など非常に参考になりました
- 吉祥寺北口システム | AlmaLinux9でPostfix+DKIMの設定
- 設定の目的など学習させていただきました
- Google Workspace管理者ヘルプ | メール送信者のガイドライン
- 2023年10月にGoogleが発表した個人用Gmailアカウントへのメール送信者に対応を要請したガイドラインです
- メール送信者側で適切な対策をとらない場合、個人用Gmailアカウントへのメールが不達となるようになります
- その対策の一つがDKIMになります
- 2024年2月移行に運用開始となりました
- わたくしが運用サーバーへのOpenDKIMの導入に至ったのは、Postfix設定後のテストメール送信でGmai宛メールがl不達となり、SPF, DKIM, DMARCの必要性を知ったことが切っ掛けです
- OpenDKIM
Steps
Term
- DKIMレコード
- DNS上でDKIMの公開鍵を登録する際のDNSレコードです.DNSのレコードタイプをTXTレコードで指定します
- DKIMレコード名
- DNS上でDKIMの公開鍵を登録する際のDNSレコードの名前です
フォーマット: セレクタ.固定プレフィックス[_domainkey].ドメイン名 - セレクタ
- メール送信時に使用される公開鍵を区別する識別子です
Summary of steps
- DKIMの設定手順の概要は次のとおりです
- OpenDKIMパッケージのインストール
- キーペア(秘密鍵と公開鍵)の作成
- DKIMの設定
- opendkim.confの設定
- SigningTableleの設定
- KeyTableの設定
- OpenDKIM起動とPostfix再起動
- Postfixの設定
- SELinuxの設定
- DNSの設定
Installing OpenDKIM
- OpenDKIMパッケージをインストールします
- 参照Dのご説明に倣い、サードパーティリポジトリの一つであるCRBを有効化します
- なお、EPELレポジトリはAlmaLinuxインストール後の初期設定にてインストール済・有効化状態です
# リポジトリCRBの状態確認: disabled
$ dnf repolist crb
repo id repo name status
crb AlmaLinux 9 - CRB disabled
# リポジトリCRB有効化
$ sudo dnf config-manager --set-enabled crb
# リポジトリCRBの状態確認: enabled
$ dnf repolist crb
repo id repo name status
crb AlmaLinux 9 - CRB enabled
# OpenDKIMインストール
$ sudo dnf install -y opendkim opendkim-tools
---
Installed:
libbsd-0.12.2-1.el9.x86_64 libmd-1.1.0-1.el9.x86_64 libopendkim-2.11.0-0.36.el9.x86_64 opendbx-1.4.6-38.el9.x86_64
opendkim-2.11.0-0.36.el9.x86_64 opendkim-tools-2.11.0-0.36.el9.x86_64 sendmail-milter-8.16.1-11.el9.x86_64
Complete!
Generate DKIM Key Pair
- 秘密鍵と公開鍵を作成します
- コマンドはopendkim-genkeyです
- キーの長さは一般的に推奨されている2048bitを指定しています
- ドメイン名は適宜修正してください
- メール送信時に使用される公開鍵を区別する識別子であるセレクタはドメイン名+[ドット]+年月日としました
# opendkimインストール直後のディレクトリ確認
$ sudo ls -l /etc/opendkim
total 12
drwxr-x---. 2 root opendkim 6 Nov 28 2023 keys
-rw-r-----. 1 opendkim opendkim 339 Nov 28 2023 KeyTable
-rw-r-----. 1 opendkim opendkim 1221 Nov 28 2023 SigningTable
-rw-r-----. 1 opendkim opendkim 378 Nov 28 2023 TrustedHosts
# 秘密鍵と公開鍵の作成
# -b 鍵の長さ: 2048
# -D 出力ディレクトリ: /etc/opendkim/keys/
# -d ドメイン名: f-labs.jp
# -s セレクタ: f-labs.jp.yyyymmdd
$ sudo opendkim-genkey -b 2048 -D /etc/opendkim/keys/ -d f-labs.jp -s f-labs.jp.20250701
# 秘密鍵と公開鍵の確認
$ sudo ls -laZ /etc/opendkim/keys/
total 16
drwxr-x---. 2 opendkim opendkim system_u:object_r:etc_t:s0 134 Jul 1 08:06 .
drwxr-xr-x. 3 root opendkim system_u:object_r:etc_t:s0 74 Jun 30 07:59 ..
-rw-------. 1 root root unconfined_u:object_r:etc_t:s0 1704 Jul 1 08:06 f-labs.jp.20250701.private
-rw-------. 1 root root unconfined_u:object_r:etc_t:s0 517 Jul 1 08:06 f-labs.jp.20250701.txt
# 所有者・所有グループとSELinuxコンテキストの変更
# 所有者: opendkim
# 所有グループ: opendkim
# SELinuxコンテキスト ユーザー: system_u
$ sudo chown -R opendkim:opendkim /etc/opendkim/keys/
$ sudo chcon -u system_u /etc/opendkim/keys/f-labs.jp.20250701.private
$ sudo chcon -u system_u /etc/opendkim/keys/f-labs.jp.20250701.txt
# 変更後の秘密鍵と公開鍵の確認
$ sudo ls -laZ /etc/opendkim/keys/
total 16
drwxr-x---. 2 opendkim opendkim system_u:object_r:etc_t:s0 134 Jul 1 08:06 .
drwxr-xr-x. 3 root opendkim system_u:object_r:etc_t:s0 74 Jun 30 07:59 ..
# 秘密鍵
-rw-------. 1 opendkim opendkim system_u:object_r:etc_t:s0 1704 Jul 1 08:06 f-labs.jp.20250701.private
# 公開鍵
-rw-------. 1 opendkim opendkim system_u:object_r:etc_t:s0 517 Jul 1 08:06 f-labs.jp.20250701.txt
Modifying opendkim.conf
- OpenDKIMの設定ファイルopendkim.confを修正します
- Line 39: 動作モード[Mode]はデフォルトのv(受信)からsv(送受信)に変更しました
- s: signer (直訳: 署名者) 送信
- v: verifier (直訳: 検証者) 受信
- Line 56, 57: MTAであるPostfixがOpenDKIMと行うソケット接続はPostfixに合わせて、TCP(network)socketとし、UNIX domain(filesystem)socketは無効化します
- Line 104: KeyTableのファイルパス指定です.コメントを解除します
- Line 109: SigningTableのファイルパス指定です.コメントを解除します
$ sudo nano /etc/opendkim.conf
# Postfixのネットワーク通信のデフォルトがTCP socketであることに合わせてコメントを解除して有効化します
56 Socket inet:8891@localhost
# OpenDKIMデフォルトのUNIX domain socketはコメントして無効化します
57 #Socket local:/run/opendkim/opendkim.sock
# KeyTablele コメントを解除して有効化します
104 KeyTable /etc/opendkim/KeyTable
# SigningTablele コメントを解除して有効化します
109 SigningTable refile:/etc/opendkim/SigningTable
Modifying SigningTablele
- 当該ドメインのメールアドレス(ワイルドカードで指定)とDKIMレコードを関連付けます
- ファイルの最終行に*@[ドメイン名] [セレクタ]._domainkey.[ドメイン名]のフォーマットで追記します
$ sudo nano /etc/opendkim/SigningTable
# フォーマット: *@[ドメイン名] [セレクタ]._domainkey.[ドメイン名]
26 *@f-labs.jp f-labs.jp.20250701._domainkey.f-labs.jp
Modifying KeyTable
- DKIMレコードと秘密鍵を関連付けます
- ファイルの最終行に[セレクタ名]._domainkey.[ドメイン名] [ドメイン名]:[セレクタ名]:[秘密鍵へのパス]のフォーマットで追記します
$ sudo nano /etc/opendkim/KeyTable
# フォーマット: [セレクタ名]._domainkey.[ドメイン名] [ドメイン名]:[セレクタ名]:[秘密鍵へのパス]
7 f-labs.jp.20250701._domainkey.f-labs.jp f-labs.jp:f-labs.jp.20250701:/etc/opendkim/keys/f-labs.jp.20250701.private
Postfix configuration
- PostfixにOpenDKIMを連携する設定をします
- [smtpd_milters]はopendkim.confの行番号56[Socket inet:8891@localhost]としたTCP socket設定に合わせます
$ sudo nano /etc/postfix/main.cf
764 # DKIMを連携 (行番号は当方環境.最終行に追加)
765 smtpd_milters = inet:127.0.0.1:8891
766 non_smtpd_milters = $smtpd_milters
767 milter_default_action = accept
Starting OpenDKIM and restarting Postfix
- OpenDKIMのサービス自動起動設定を有効にして起動し、Postfixを再起動します
$ sudo systemctl enable --now opendkim.service
$ sudo systemctl restart postfix
SElinux port configuration
- OpenDKIMでソケット接続にTCP socketを選択したため、当該ポート(8891)が許可されている必要があります
# SELinuxの許可ポート確認: ポート8891許可
$ sudo semanage port -l|grep 8891
milter_port_t tcp 8890, 8891, 8893
- もし許可されていない場合の指定は次のとおりです
$ sudo semanage port -a -t milter_port_t -p tcp 8891
DNS configuration
- 当方の環境ではXServerのDNSを使用しています
- XServer VPSのVPSアカウントからDNSの設定をします
Verifying the public key
- opendkim-genkeyコマンドで作成した公開鍵を確認します
- 下記コマンドで確認した括弧内が公開鍵、すなわちDKIMレコードになります
- v=DKIM1; k=rsa; p=MIIBI...
- v=DKIM1: DKIMプロトコルのバージョンを指定します
- k=rsa: 公開鍵の種類を示します。RSAが一般的に使用されます
- p=MIIB.....: これは公開鍵そのものであり、送信メールのデジタル署名を検証するために使用される長い文字列です
- v, k, pのタグについては、次のページに詳細な説明がございます
- Qiita | DKIMについて調べたよ
$ sudo cat /etc/opendkim/keys/f-labs.jp.20250701.txt
f-labs.jp.20250701._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5DzKiW9gFCVT3yIQ+NBAOvHYoPOEp72JB3QB9YMNzR60ixV2sb8zNfTIEFy0FWl1Am/Z3rQzgWZfjQTwRDzFdLHRFuL9LTIVy0PeQfv
afFqUmPL0VIUwJfGGmJXwAQXtWzfUHSgjjxSytcsCYciEf6L5LC4xXQ1oT5Z138z8oKLh5LOSz8kILf+Swat9hMfeIWf/+NB4ItSLFn"
"9yopSuH8wN+mLVoHWgkuTX9xOulhmcYvyXjqJeSMPkRJldUihnRgeY2ggYDgB5Y3cNWvQiJX0nAiewO3AQkyDWv7kWAMlpVnP0LaA2QZ40SRPGgvt1ycS3CqukXLS/TS4vyPQunQIDAQAB" ) ;
----- DKIM key f-labs.jp.20250701 for f-labs.jp
Registering DKIM records in DNS
- 上記にて確認したDKIMレコードを当方が利用しているXServer VPSのDNSに登録します
- ここで、トラブルを経験しています
Trouble
2,048 ビットの DKIM 鍵を使用している場合、その鍵を 255 文字の制限がある DNS レコードに 1 つのテキスト文字列として入力することはできません。その場合は次の手順を実施してください。
1. 鍵の文字を複数のテキスト文字列に分割します。
2. 各文字列を引用符で囲みます。
3. ドメイン プロバイダの TXT レコードの値欄に、文字列を 1 つずつ入力します。Google Workspace管理者ヘルプ | ドメインプロバイダのTXTレコードの文字数制限を確認する
- DNSの使用でTXTレコード(上記括弧内の文字列)は文字数255字以内の制限があります
- 2048bitのDKIM鍵の場合、その制限を超える文字列となり、当方の公開鍵も引用符で3分割されています
- 多くのDKIM関連のサイトでも目にする情報ですので、XServer VPSのDNS設定の際、TXTレコードを入力する内容(Value)欄に引用符を含み貼付けを行いました
- すると、「内容の記述が正しくありません。」のアラートが表示されてしまい、先に進むことができません

- 当初は原因をつかめず、DKIMキーの作成からやり直したり、SELinuxの設定を疑ったり、引用符の区切り方を変えてみたりと混乱していたのですが、解決のポイントは単純なものでした
- それは、「XServer VPSのDNS設定のTXTレコード入力欄(内容欄)は、文字数制限は気にすることなく、引用符を使用せず、連続した文字列を入力する」でした
- 恐らく、XServer VPS側でご親切に分割してくれているのでは、と推察します
- 他社のレンタルサーバーやレンタルVPSでは、引用符が必須である可能性もありますのでXServer VPS以外の方は各自ご確認ください
Setting DNS records in the DNS settings of XServer VPS
- 当方が利用しているXServer VPSのDNSにDNSレコード(DKIMレコード)を設定します
- ホスト名: f-labs.jp.20250701._domainkey.f-labs.jp
- DKIMレコード名([クラス名]._domainkey.[ドメイン名])を指定します
- 実際には入力欄の右側に[.f-labs.jp]とあるので[f-labs.jp.20250701._domainkey]と入力します
- 種別: TXT
- TXTタイプを指定します
- 内容:
v=DKIM1;k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5DzKiW9gFCVT3yIQ+NBAOvHYoPOEp72JB3QB9YMNzR60ixV2sb8zNfTIEFy0FWl1Am/Z3rQzgWZfjQTwRDzFdLHRFuL9LTIVy0PeQfvafFqUmPL0VIUwJfGGmJXwAQXtWzfUHSgjjxSytcsCYciEf6L5LC4xXQ1oT5Z138z8oKLh5LOSz8kILf+Swat9hMfeIWf/+NB4ItSLFn9yopSuH8wN+mLVoHWgkuTX9xOulhmcYvyXjqJeSMPkRJldUihnRgeY2ggYDgB5Y3cNWvQiJX0nAiewO3AQkyDWv7kWAMlpVnP0LaA2QZ40SRPGgvt1ycS3CqukXLS/TS4vyPQunQIDAQAB- 引用符で分割しません
- 登録後の確認画面上も特に分割された表示になりません(そのためどのように分割されたか確認できません)
- v, k, pのタグはセミコロンで区切ります
- 引用符で分割しません
- TTL: 3600
- TTL(Time To Live)とはDNSレコードがキャッシュに保持される時間で一般的に3600秒が推奨されているそうです
- 優先度: 空欄
Check using online tools
- DKIMレコードのオンラインチェックツールを使用して設定に問題ないか確認します
- MX TOOLBOX | DKIM Record Lookup

