Linux

CentOS Stream 8 に OpenDKIM を導入する

投稿日:2022年9月13日 更新日:

1. はじめに

CentOS Stream 8OpenDKIM を導入する手順を紹介します。

既に Postfix は導入済みです。

設定するドメインは、example.com であるとします。

2. OpenDKIM の導入

2-1. OpenDKIM をインストールします

(1) opendkim パッケージをインストールします。

sudo dnf install opendkim 
  • (注意)本記事では、必要と感じた場合にのみコマンドの先頭に「$」を付けます。

実行例

$ sudo dnf install opendkim 
(省略)
==========================================================================================
パッケージ                   アーキテクチャー  バージョン          リポジトリー       サイズ
==========================================================================================
インストール: 
 opendkim                     x86_64        2.11.0-0.28.el8       epel            244 k 
依存関係のインストール: 
 libbsd                       x86_64        0.9.1-4.el8           epel            106 k 
 libmemcached-libs            x86_64        1.0.18-17.el8         appstream       137 k 
 libopendkim                  x86_64        2.11.0-0.28.el8       epel             83 k 
 opendbx                      x86_64        1.4.6-21.el8          epel             56 k 
 sendmail-milter              x86_64        8.15.2-34.el8         appstream        82 k

(省略)

インストール済み: 
  libbsd-0.9.1-4.el8.x86_64                    libmemcached-libs-1.0.18-17.el8.x86_64 
  libopendkim-2.11.0-0.28.el8.x86_64           opendbx-1.4.6-21.el8.x86_64 
  opendkim-2.11.0-0.28.el8.x86_64              sendmail-milter-8.15.2-34.el8.x86_64 
完了しました!

opendkim パッケージには、設定方法について説明している以下のファイルが含まれています。

  • /usr/share/doc/opendkim/README
  • /usr/share/doc/opendkim/README.fedora

この2つと、「man opendkim」や「man opendkim.conf」コマンドで見られるマニュアルページを参考に設定を行いますが、これらがちゃんとメンテナンスされているという保証はないので、「変更されてるところもあるだろうな」と常に意識して読みます。

README は以下のリンク先でも見ることができます(今回インストールした opendkim パッケージに含まれる README とは内容が少し違っています)。

マニュアルページは、こちらでも見られます。

(2) opendkim-tools パッケージもインストールします。

sudo dnf install opendkim-tools
  • 鍵ファイルを作成する opendkim-genkey コマンドは、こちらに入っています。

Tips

パッケージに含まれるファイルの一覧は以下のコマンドで表示できます。

rpm -ql パッケージ名

2-2. OpenDKIMを設定します

OpenDKIM では使用する鍵ファイル毎に、SELECTOR と呼ばれる文字列を決めるのですが、今回はデフォルト (“default“) のまま設定します。

(1) 最初の時点の /etc/opendkim.conf ファイルをコピーしておきます。

sudo cp -p /etc/opendkim.conf /etc/opendkim.conf.orig
  • この後、/etc/opendkim.conf を編集しますが、このコピーと比較することでどこを変更したか分かります。

(2) /etc/opendkim.conf ファイルに以下の行を記述します。

Mode  sv
Domain        example.com
KeyFile       /etc/opendkim/keys/example.com/default.private

これらの行は、もともと記述されています。コメントアウトされている行は先頭の「#」を外すだけでよいです。

Domain には自分のドメインを指定します。

KeyFile には keys ディレクトリの下に、ドメイン名用のディレクトリ example.com を追加してあります。これは、後から別ドメインの設定を追加することになった場合に、ドメイン毎にディレクトリを分けておくと管理しやすいからです。

設定項目 説明
Mode 動作モード。s (sign), v (verify)。
verify は受信メールのヘッダにあるDKIMの署名を検証します。
sign は送信メールにDKIMの署名を追加します。
Domain ここで指定したドメインから送信したメールに署名を行います。ここで指定したドメイン以外からのメールには署名は行わず、署名の検証が行われます。SigningTable を使う場合、この設定項目は必要ありません。
KeyFile メッセージの署名に使用される秘密鍵ファイルのパスを指定します。
KeyTable を使う場合、この設定項目は無視されます。
KeyTable DNSのTXTレコードに登録するホスト名と、それに対して使用する秘密鍵ファイルを紐づけるファイルを指定します。
SigningTable の設定が必要です。
SigningTable メール送信元のドメインと、そのドメインに対して問い合わせるDNSのTXTレコードを持つホスト名を紐づけたファイルを指定します。
KeyTable の設定が必要です。
ExternalIgnoreList このサーバーを通してメール送信が行われる外部のホストを指定します。そのホストから送信されたメールには署名が行われます。
InternalHosts ここで指定したホストから送信されたメールには署名が行われます(署名の検証は行われません)。

2-3. 鍵ファイルを作成します

(1) example.com 用の鍵ファイルを配置するディレクトリを作成しておきます。

sudo mkdir /etc/opendkim/keys/example.com

先程も書きましたが、後から別ドメインの設定を追加することになった場合に備えて、ドメイン毎にディレクトリを分けます。

(2) 鍵ファイルを生成します。

sudo opendkim-genkey -d example.com -D /etc/opendkim/keys/example.com -v

このコマンドでは、パスフレーズは聞かれません。

オプションの意味は以下です。

  • -d:ドメイン名を指定します。
  • -D:鍵ファイルを保存するディレクトリパスを指定します。
  • -v:詳細を表示します。

このコマンドによって、2つのファイルが作成されます。

  • /etc/opendkim/keys/example.com/default.private:秘密鍵ファイル
  • /etc/opendkim/keys/example.com/default.txt:DNSのTXTレコードに記述する内容(公開鍵含む)

作成したディレクトリとファイルの所有者とパーミッションを変更します。

$ sudo chown opendkim:opendkim -R /etc/opendkim/keys/example.com
$ sudo chmod 600 /etc/opendkim/keys/example.com/default.private
$ sudo chmod 644 /etc/opendkim/keys/example.com/default.txt

2-4. Postfix を設定します(OpenDKIM と連携させます)

このサーバー上からメールを送信するのは Postfix の役割なのですが、そのメール送信時にOpenDKIMで署名するよう設定します。

/etc/postfix/main.cf ファイルに下記を追記します(末尾でよいです)。

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

Postfix は Milter というフィルターアプリケーションのインタフェースを利用しているために、設定項目の名前に milter という文字が入っているようです(mail と filter とをくっつけて、milter という名前になったのでしょうか?)。OpenDKIM は このインタフェースを実装していて、Postfix のフィルターアプリケーションとして動作するということのようです。

  • milter_default_action:Milter に問題があった場合の動作です。accept は、Milter が存在しない場合の動作を行います。
  • smtpd_milters:届いたメールを渡すフィルターアプリケーションを指定します。inet:127.0.0.1:8891 は OpenDKIM のことを指しています。
  • non_smtpd_milters:Postfix の smtpd プログラムを通さずに届いたメールを渡すフィルターアプリケーションを指定します。上と同じく OpenDKIM を指定しています。

Postfix の設定ファイルやディレクトリに問題がないかチェックします。

sudo postfix check

Postfix の設定を再読み込みします。

sudo systemctl reload postfix

先程の設定項目が反映されているか確認します。

postconf -n | grep milter
  • -n:main.cf で明示的に設定されている項目だけを出力します。

2-5. OpenDKIM の起動設定を行います

$ sudo systemctl start opendkim 
$ sudo systemctl enable opendkim
  • 1行目:opendkim のサービスを開始する。
  • 2行目:システム起動時の自動起動設定を有効にする。

opendkim サービスの状態を確認します。

systemctl status opendkim

2-6. DNS レコードを追加します

OpenDKIMの公開鍵を TXTレコードに設定します。

これには、/etc/opendkim/keys/example.com/default.txt ファイルを参考にするのですが、このファイルの内容はこんな感じになっています。

$ cat /etc/opendkim/keys/example.com/default.txt
default._domainkey      IN      TXT     ( "v=DKIM1; k=rsa; " 
   "p=XXXXXXXXXXXXXXXXXXXXXX" )  ; ----- DKIM key default for example.com

この場合であれば、DNSのTXTレコードには以下のように記述します。

  • ホスト名 →「default._domainky」
  • 内容 →「v=DKIM1; k=rsa; p=XXXXXXXXXXXXXXXXXXXXXX」

Cloudflare のDNSレコード追加画面

メモ

以前、DKIM とセットで設定していた Author Domain Signing Practice (ADSP) という設定(TXTレコードを使います)は、2013年の時点で非推奨(ステータスが Historic)になっています。
🔗 Change the status of ADSP (RFC 5617) to Historic

3. OpenDKIM の動作検証

3-1. 鍵ファイルとDNSのTXTレコードをチェックします (opendkim-testkey コマンド)

以下のコマンドを実行します。

sudo /usr/sbin/opendkim-testkey -d example.com -k /etc/opendkim/keys/example.com/default.private -vv
  • 鍵ファイルのパーミッションや、DNSのTXTレコードがチェックされます。
  • エラーがあれば直します。

実行例

$ sudo /usr/sbin/opendkim-testkey -d example.com -k /etc/opendkim/keys/example.com/default.private -vv
opendkim-testkey: using default configfile /etc/opendkim.conf 
opendkim-testkey: record 0 for 'default._domainkey.example.com' retrieved 
opendkim-testkey: checking key 'default._domainkey.example.com' 
opendkim-testkey: key default._domainkey.example.com not secure 
opendkim-testkey: 1 key checked; 1 pass, 0 fail
  • DNSSEC が有効になっていない場合、上記のように「key default._domainkey.example.com not secure」と指摘されます。DNSSEC を使用しないのであれば、このままで問題ありません。

3-2. DNSのTXTレコードを確認します (dig コマンド)

まず、example.com の DNSサーバーを調べます。

dig -t ns example.com +noall +answer

複数のサーバーホスト名が表示されると思いますので、そのうち1つを選びます。ここでは、ns.example.com を選んだとします。

選んだDNSサーバーに対して、example.com のTXTレコードを問い合わせます。

dig -t txt default._domainkey.example.com @ns.example.com +noall +answer

先程追加したTXTレコードが表示されるか確認します。

実行例

$ dig -t txt default._domainkey.example.com @ns.example.com +noall +answer
default._domainkey.example.com. 0 IN TXT     "v=DKIM1; k=rsa; p=XXXXXXXXXXXXXXXXXXXXXX"

3-3. DNSのTXTレコードを確認します (外部サービス利用)

以下のサービスで、DKIM の TXTレコードをチェックすることができます。

DKIM Check- DomainKeys Identified Mail (DKIM) Record Lookup – MxToolBox

Domain Name にドメイン名、Selector に “default” をセットして、[DKIM Lookup] ボタンを押します。

結果が緑色で表示されれば、問題ありません。

DKIM Check の結果画面(問題なし)

3-4. メールを送って、DKIM が正常に動作しているか確認します

Postfix が持っている sendmail コマンドを使って、自分のメールアドレスなどにメールを送信してみます。

echo -e 'Subject: Test\n\nHello!' | sendmail -f root@example.com dummy@example.net
  • 送信元のアドレス:root@example.com
  • 送信先のアドレス:dummy@example.net

送信先に Gmail のアドレスを指定した場合に、受け取ったメールの「メッセージのソースを表示」したのが以下の画面です。

Gmail でメールを受け取り、「メッセージのソースを表示」したところ

DKIM のところが「PASS」になっており、正常に設定できていることが確認できました。

4. 別のドメインを追加設定する手順

ここから別のドメイン(foo.example.jp とします)を追加設定する手順を紹介します。

1つ1つの操作は先程と同じなので、細かいところは省きます。

※ こちらの SELECTOR もデフォルト (“default“) のまま設定します。

(1) このドメイン用の鍵ファイルを配置するディレクトリを作成します。

sudo mkdir /etc/opendkim/keys/foo.example.jp

(2) このドメイン用の鍵ファイルを生成します。

sudo opendkim-genkey -d foo.example.jp -D /etc/opendkim/keys/foo.example.jp -v

生成されたファイルの所有者とパーミッションを変更します。

$ sudo chown opendkim:opendkim -R /etc/opendkim/keys/foo.example.jp
$ sudo chmod 750 /etc/opendkim/keys/foo.example.jp
$ sudo chmod 600 /etc/opendkim/keys/foo.example.jp/default.private
$ sudo chmod 644 /etc/opendkim/keys/foo.example.jp/default.txt

(3) /etc/opendkim/KeyTable を編集します。

以下の行を追記します。

default._domainkey.foo.example.jp foo.example.jp:default:/etc/opendkim/keys/foo.example.jp/default.private

(4) /etc/opendkim/SigningTable を編集します。

以下の行を追記します。

*@foo.example.jp default._domainkey.foo.example.jp

(5) /etc/opendkim.conf を編集します。

以下の行を追記します。

KeyTable        /etc/opendkim/KeyTable
SigningTable    refile:/etc/opendkim/SigningTable
  • KeyTable が有効になると、KeyFile は無視されます。

(6) DNS の TXTレコードを設定します。

まず、foo.example.jp 用 TXTレコード(SPF用)を設定します。これを適切に設定しないとメールが正常に送信できない場合があります。この設定内容はサーバーによって異なるので、ここでは省略します。

次に、default._domainkey.foo.example.jp 用 TXTレコード(DKIM用)を設定します。

これには、/etc/opendkim/keys/misc.pupha.net/default.txt を参考にします。

TXTレコードの値には、以下のような文字列を設定することになるでしょう。

v=DKIM1;k=rsa;p=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

設定したら、このドメインのネームサーバーに対して、TXTレコードが反映されたかチェックします。

dig -t txt +noall +answer default._domainkey.foo.example.jp @{{ネームサーバー}}

自分の環境から利用されるDNSキャッシュサーバーに、これらのTXTレコードが反映されるのを待ちます。

以下のコマンドで、反映されたかチェックできます。

dig -t txt +noall +answer foo.example.jp 
dig -t txt +noall +answer default._domainkey.foo.example.jp

(7) OpenDKIM を再起動する。

sudo systemctl restart opendkim

(8) OpenDKIM のテストコマンドを実行します。

sudo opendkim-testkey -d foo.example.jp -k /etc/opendkim/keys/foo.example.jp/default.private -vv

(9) サーバー上からメール送信してみます。

echo -e 'Subject: Test\n\nHello!' | sendmail -f root@foo.example.jp dummy@example.net

受信側で、DKIM が PASS になっているか確認します。Gmail に送ると簡単に確認できます。

5. 参考

📂-Linux

執筆者:labo


comment

メールアドレスが公開されることはありません。

関連記事

CentOS

CentOS Stream release 8 で「Configuration: OptionBinding with id “failovermethod” does not exist」というエラーが表示される

CentOS Stream release 8 で「Configuration: OptionBinding with id “failovermethod” does not exist」というエラーが表示される場合の対応についてです。

Linux

コマンドに対してデフォルトで指定されているオプションを調べる

Linux などの UNIX系OS環境では、コマンドを入力して実行する機会が多いと思いますが、それぞれの環境によって、いくつかのコマンドオプションがデフォルトで指定されている場合があります。 ※ ログ …

Linux

dig コマンドの出力内容を最小限にするオプション

dig コマンドの出力を最小限にするオプションについて書いています。

Vim

Vim でファイルを編集した後、sudo でそのファイルを保存する

目次1. 困った状況2. 対応方法3. ~/.vimrc にキーマップを登録する4. 参考 1. 困った状況 Vim でファイルを編集した後に、sudo で開いていないことに気付いた場合の対処法です。 …

Linux

標準エラー出力を標準出力に向けるコマンド

Linux のターミナルにおいて、標準エラー出力を標準出力に向けるコマンドの記述方法を紹介します。