1. はじめに
CentOS Stream 8 に OpenDKIM を導入する手順を紹介します。
既に 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 とは内容が少し違っています)。
- Documentation | OpenDKIM の最初にある以下の2つのページ
マニュアルページは、こちらでも見られます。
(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」
メモ
以前、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] ボタンを押します。
結果が緑色で表示されれば、問題ありません。
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 のアドレスを指定した場合に、受け取ったメールの「メッセージのソースを表示」したのが以下の画面です。
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 に送ると簡単に確認できます。