CentOS Postfix

CentOSのPostfixで迷惑メール判定されないようDKIMを設定する

2018年11月1日

centos-postfix-dkim-top

構築したメールサーバーから送信したメールが迷惑メールとして識別されたことはありませんか?
このような場合は、送信したメールが経由するメールサーバーのなりすましメール対策に引っかかっている場合が殆どです。(まれに迷惑メールのブラックリストに登録されていることもあります)
前回までの記事で安全なメールサーバーの構築手順を紹介してきましたが、メールを受信側で送ったメールが迷惑メールと判定される可能性があります。

Open Source
centos-postfix-dovecot-ssl-top
CentOSのPostfixとDovecotにSSLを設定して安全に通信を行う

前回の記事ではメールサーバーとしての基本的な機能である送信(SMTP)と受信(POP3/IMAP)を行うことが出来るように設定を行いました。 この状態でも運用には問題ありませんが、メールサーバーとクラ ...

メールサーバー構築の基礎 4回目になる本記事では、送信したメールが迷惑メールとして識別されないように、送信時にメールサーバーで電子署名を行う方法を紹介します。

メールサーバー 構築の基礎 全4回

centos-postfix-setting-top1

CentOS Postfix

CentOSとPostfixを使って送信専用のメールサーバーを構築する方法

最近ではクラウドでのSaaSによるメールサービス(GoogleのG SuiteやMicrosoftのOffice365など)が一般的になり、以前ほどメールサーバーを構築する機会も少なりましたが、この辺 ...

mail-postfix-top2

CentOS Dovecot Postfix

CentOSのPostfixとDovecotで送受信ができるメールサーバーを構築

前回の記事ではCentOSにインストールしたPostfixでメールを送信できるようにするところまでの設定手順を紹介しました。今回は同じ環境を使ってメールの送信と受信ができるところまでの設定手順を紹介し ...

centos-postfix-dovecot-ssl-top3

CentOS Dovecot Postfix

CentOSのPostfixとDovecotにSSLを設定して安全に通信を行う

前回の記事ではメールサーバーとしての基本的な機能である送信(SMTP)と受信(POP3/IMAP)を行うことが出来るように設定を行いました。 この状態でも運用には問題ありませんが、メールサーバーとクラ ...

centos-postfix-dkim-top4

CentOS Postfix

CentOSのPostfixで迷惑メール判定されないようDKIMを設定する

構築したメールサーバーから送信したメールが迷惑メールとして識別されたことはありませんか? このような場合は、送信したメールが経由するメールサーバーのなりすましメール対策に引っかかっている場合が殆どです ...

1. メールサーバーでの電子署名について

なりすましメール対策としてポピュラーなものは、以前の記事で紹介したSPF (Sender Policy Framework)がありますが、GoogleのGMailなどではSPFだけ設定しても迷惑メールとして識別されてしまいます。

参考 SPFの設定方法を紹介している記事

Open Source
mail-postfix-top
CentOSのPostfixとDovecotで送受信ができるメールサーバーを構築

前回の記事ではCentOSにインストールしたPostfixでメールを送信できるようにするところまでの設定手順を紹介しました。今回は同じ環境を使ってメールの送信と受信ができるところまでの設定手順を紹介し ...

GMail等のなりすましチェックが厳しいメールシステムに迷惑メールとして識別されないようにするには送信するメールに電子署名を行い、そのメールが正しいサーバーから送信されたことを、受信するメールサーバー側で確認する技術、DKIM(ディーキム)の設定が必要となります。
DKIMはDomain Keys Identified Mailの略で、以下のように動作します。

dkim-kousei

DKIMを設定した場合の認証と署名フロー

  1. ドメインを管理するDNSサーバーに公開鍵の情報を登録
  2. 送信者がメールを送信時にドメインのメールサーバーがメールに電子署名を設定
  3. SMTPプロトコルで送信先のメールサーバーへ接続
  4. 送信先のメールサーバーが電子署名の検証を行うためDNSサーバーに公開鍵を要求
  5. 公開鍵を利用して電子署名が正しいものかを送信先メールサーバーが検証

メールの電子署名を検証するため、そのメールが正しいメールサーバーから配信されているかを確認できます。このDKIMをCentOSとPostfixで動作するように設定する手順を紹介します。

1. DKIMを設定するメールサーバーの環境

DKIMの設定を行う環境は、メールサーバーを設定した前回の記事を踏襲しています。

Open Source
mail-postfix-top
CentOSのPostfixとDovecotで送受信ができるメールサーバーを構築

前回の記事ではCentOSにインストールしたPostfixでメールを送信できるようにするところまでの設定手順を紹介しました。今回は同じ環境を使ってメールの送信と受信ができるところまでの設定手順を紹介し ...

前回の記事では以下の前提条件を元に設定を行いました。確認の意味で再度、記載しておきます。

SMTPS-img2

メールシステム構成

DKIMを設定するメールサーバーの環境

  • サーバーにはグローバルの固定IPが割り当てられています
  • ドメインはtestdom.comを利用します
  • ホスト名にはmailを設定しています(mail.testdom.com)
  • SMTPにはPostfixを利用して、迷惑メール対策としてSMTP-AUTHを設定
  • POP3/IMAPにはdovecotを利用
  • Let's Encryptで取得したサーバー証明書を利用してSMTPS/IMAPS/POP3Sを設定

この環境にDKIMを設定していきます。

2. epelレポジトリのインストール(未インストールの場合のみ)

DKIMを利用するためのソフトウェアはEPELレポジトリに含まれています。もし本ブログのメールサーバー構築に関する記事を順番にご覧いただいている場合は、既にEPELレポジトリは導入済みかと思います。念のため、ここではインストールの導入手順のみ紹介します。
yumコマンドでEPELレポジトリをインストールします。EPELレポジトリは”epel-release”パッケージ名になります。以下のようにインストールを行います。

 command
# yum -y install epel-release

エラーの出力がなく「完了しました!」と表示されれば、EPELレポジトリは正常にインストールされています。

3. opendkimのインストール

DKIMを利用するためにはopendkim("オープンディーキム"と読みます)パッケージのインストールが必要になります。本章ではopendkimパッケージの導入について説明します。

3-1. opendkimパッケージの確認

EPELレポジトリに含まれるopendkimパッケージを確認します。”yum search”コマンドを実行します。

 command
$ yum search opendkim
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: ftp.iij.ad.jp
* epel-debuginfo: ftp.iij.ad.jp
* epel-source: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
======== N/S matched: opendkim ==========
libopendkim-devel.x86_64 : Development files for libopendkim
opendkim-debuginfo.x86_64 : Debug information for package opendkim
libopendkim.x86_64 : An open source DKIM library
opendkim.x86_64 : A DomainKeys Identified Mail (DKIM) milter to sign and/or verify mail Name and summary matches only, use "search all" for everything.

opendkimには複数のパッケージがあります。この中でDKIMを設定する為に必要なパッケージは

opendkim.x86_64 : A DomainKeys Identified Mail (DKIM) milter to sign and/or verify mail

になります。インストール前にopendkimパッケージの詳細を確認します。”yum info”コマンドを実行します。

 command
$ yum info opendkim
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: ftp.iij.ad.jp
* epel-debuginfo: ftp.iij.ad.jp
* epel-source: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
利用可能なパッケージ
名前 : opendkim
アーキテクチャー : x86_64
バージョン : 2.11.0
リリース : 0.1.el7
容量 : 222 k
リポジトリー : epel/x86_64
要約 : A DomainKeys Identified Mail (DKIM) milter to sign and/or
: verify mail
URL : http://opendkim.org/
ライセンス : BSD and Sendmail
説明 : OpenDKIM allows signing and/or verification of email
: through an open source library that implements the DKIM
: service, plus a milter-based filter application that can
: plug in to any milter-aware MTA, including sendmail,
: Postfix, or any other MTA that supports the milter
: protocol.

説明にメールに電子署名を行うためのパッケージであることが記載されています。これでパッケージの詳細が確認できましたので、インストールを実施します。

3-2. opendkimパッケージのインストール

"yum install"コマンドでopendkimパッケージをインストールします。

 command
# yum -y install opendkim

コマンドを実行すると、インストールの状況が出力されます。

 log
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
【略】
---> パッケージ opendbx.x86_64 0:1.4.6-6.el7 を インストール
---> パッケージ sendmail-milter.x86_64 0:8.14.7-5.el7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ libevent.x86_64 0:2.0.21-4.el7 を インストール
--> 依存性解決を終了しました。 依存性を解決しました インストール中:
opendkim x86_64 2.11.0-0.1.el7 epel 222 k
依存性関連でのインストールをします:
libbsd x86_64 0.8.3-1.el7 epel 85 k
libevent x86_64 2.0.21-4.el7 base 214 k
libmemcached x86_64 1.0.16-5.el7 base 237 k
libopendkim x86_64 2.11.0-0.1.el7 epel 75 k
opendbx x86_64 1.4.6-6.el7 epel 46 k
sendmail-milter x86_64 8.14.7-5.el7 base 71 k トランザクションの要約
Transaction test succeeded
Running transaction
インストール中 : libbsd-0.8.3-1.el7.x86_64 [ ] 1/7
インストール:
opendkim.x86_64 0:2.11.0-0.1.el7 依存性関連をインストールしました:
libbsd.x86_64 0:0.8.3-1.el7 libevent.x86_64 0:2.0.21-4.el7
libmemcached.x86_64 0:1.0.16-5.el7 libopendkim.x86_64 0:2.11.0-0.1.el7
opendbx.x86_64 0:1.4.6-6.el7 sendmail-milter.x86_64 0:8.14.7-5.el7 完了しました!

エラーの出力がなく「完了しました!」と表示されれば、opendkimパッケージは正常にインストールされています。

3-3. opendkimインストール後の確認

opendkimがインストールされたことを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、opendkimパッケージがインストールされていることを確認します。

 command
$ yum list installed | grep opendkim
libopendkim.x86_64 2.11.0-0.1.el7 @epel
opendkim.x86_64 2.11.0-0.1.el7 @epel

上記のように「libopendkim」「opendkim」が表示されればパッケージはインストールされています。

4. opendkim 秘密鍵の作成

本章ではインストールしたopendkimを利用してキーペア(秘密鍵/公開鍵)を作成する手順を紹介します。

4-1. キーペア保存用のフォルダ作成

opendkimは標準で”/etc/opendkim/keys”以下にキーペア(秘密鍵/公開鍵)の情報が記載されたファイルを作成します。
複数のドメインを運用するマルチドメインでは、ドメイン事にフォルダを作成して保存するようにした方が、管理しやすいと思います。
本記事の環境はマルチドメインではありませんが、testdom.comドメイン用にフォルダを作成します。

 command
# mkdir /etc/opendkim/keys/testdom.com

これでキーペア保存用フォルダの作成は完了です。(作成するフォルダ名は運用するドメインに合わせて下さい)

4-2. キーペア(秘密鍵/公開鍵)の作成

"opendkim-genkey"コマンドを利用して電子署名用のキーペアを作成します。以下のような形で実行します。

opendkim-genkey -D [ファイルの保存パス] -d [ドメイン名] -s [セレクタ名]

"-s"のセレクタ名ですが、電子署名ヘッダーに表示されるラベルになります。任意のものを指定します。セレクタ名はファイルの作成日を利用するパターンが多いため本記事でも日付を指定します。以下のように実行を行いました。

 command
# opendkim-genkey -D /etc/opendkim/keys/testdom.com/ -d testdom.com -s 181026

エラーの出力が無ければ、コマンドは正常に実行されています。念のため、キーペアファイルの確認をしてみます。

 command
# ls -al /etc/opendkim/keys/testdom.com/
合計 16
drwxr-xr-x 2 root root 4096 10月 26 10:09 .
drwxr-x--- 3 opendkim opendkim 4096 10月 26 10:08 ..
-rw------- 1 root root 891 10月 26 10:09 181026.private
-rw------- 1 root root 333 10月 26 10:09 181026.txt

鍵ファイルである”181026.private”と公開鍵の情報が記載された”181026.txt”が作成されていることが確認できました。

4-3. キーペア(秘密鍵/公開鍵)ファイルの所有者変更

opendkimサービスからファイルにアクセスできるようにファイルの所有者を変更します。chownコマンドを以下のように実行します。

 command
# chown -R opendkim:opendkim /etc/opendkim/keys/testdom.com/

コマンド実行後に所有者を確認します。

 command
# ls -al /etc/opendkim/keys/testdom.com/
合計 16
drwxr-xr-x 2 opendkim opendkim 4096 10月 26 10:09 .
drwxr-x--- 3 opendkim opendkim 4096 10月 26 10:08 ..
-rw------- 1 opendkim opendkim 891 10月 26 10:09 181026.private
-rw------- 1 opendkim opendkim 333 10月 26 10:09 181026.txt

opendkimユーザーに所有者が変更されていることが確認できます。ここまでの手順でキーペア(秘密鍵/公開鍵)ファイルの作成は完了です。

5. DNSの設定

本章では作成した公開鍵ファイルに記載されている情報をドメインのTXTレコードに設定する手順を紹介します。

5-1. 公開鍵の確認

DNSサーバーへ登録する公開鍵の情報は”181026.txt”に記載されています。先ずはこのファイルの内容を確認します。

 command
# cat /etc/opendkim/keys/testdom.com/181026.txt
181026._domainkey IN TXT ( "v=DKIM1; k=rsa;
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFOu6xDK9rSuttAbMNY9Cs2cmOWxUV48kMvalmFo0trkL6zoncBvYyCZ7z4o9F79cWPQCLSNLuviCRbS9k5LsZEr9M8nM+k+zqYQKh8ttTWMt5odvpcz6C4miQMJ/Cc2gfcpRQDFWWSqm2O6BhALV7p1tzUmbchLxtBRtjcMXXTQIDAQAB" ) ; ----- DKIM key 181026 for testdom.com

この情報を元にDNSへのレコード設定を追加します。
公開鍵ファイルに含まれる情報についての詳細は以下のようになります。

v=DKIM1keyレコードのバージョン番号(指定する場合はDKIM1)
k=rsa電子署名の作成に利用できる鍵の形式、DKIMではRSAのみサポート
p=....公開鍵データ

5-2. DNSサーバーへの公開鍵設定

公開鍵をDNSサーバーへ設定します。本記事ではDNSサーバーとしてお名前ドットコムのサーバーを利用している場合の手順を紹介します。BINDなど自前のDNSサーバーを運用している場合の手順は割愛しています。
設定が必要となるのは以下の2レコードです。

公開鍵用レコードキーペアの公開鍵を登録する
DKIMポリシー用レコードADSP(Author Domain Signing Practice)DKIM署名が有効ではないメールの扱いを設定する

この2つのレコードについて、設定手順を紹介していきます。

5-2-1. DNSサーバーへの公開鍵登録

DNSサーバーへ公開鍵を設定します。お名前ドットコムでは、DNSのレコード追加として以下のようにエントリを追加します。

dkim-postfi04-5-2-1-1

各設定は公開鍵の情報を元に追加します。

ホスト名181026._domainkey.(testdom.com)
TYPETXT
TTL500
VALUEv=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFOu6xDK9r
SuttAbMNY9Cs2cmOWxUV48kMvalmFo0trkL6zoncBvYyCZ7z4o9F79cWPQCLSNLuvi
CRbS9k5LsZEr9M8nM+k+zqYQKh8ttTWMt5odvpcz6C4miQMJ/Cc2gfcpRQDFWWSqm2
O6BhALV7p1tzUmbchLxtBRtjcMXXTQIDAQAB

TTLはデフォルトで3600になっています。3600のままでも良いのですが、間違って登録を行った時に修正に時間がかかるため、500に変更しています。
VALUEについては、公開鍵ファイルに記載されている内容を一行で””(ダブルクォーテーション)を外して設定します。

5-2-2. DNSサーバーへのADSPレコードの登録

次にDKIM署名が有効でないメールの扱いを設定するためのADSPレコードを登録します。ADSPレコードは設定値として”all””unknown””discardable”の何れかを指定します。本記事ではADSPレコードとして、電子署名がないメール(認証に失敗したメール)でも配信できる”unknown”を設定します。お名前ドットコムでは、DNSのレコード追加として以下のようにエントリを追加します。

ホスト名_adsp._domainkey.(testdom.com)
TYPETXT
TTL500
VALUEdkim=unknown

VALUEは""(ダブルクォーテーション)を付けずに登録します。実際の設定画面は以下のようになります。

dkim-postfix04-5-2-2

これでADSPレコードの設定は完了です。

5-2-3. DNSサーバー DKIM用レコードの確認

両レコードが追加されると以下のようになります。

dkim-postfix04-5-2-2-1

問題なければ、設定を完了します。

5-3. 設定の確認

TXTレコードの設定が完了したところで、レコードの確認を行います。digコマンドを使って、登録したTXTレコードが表示されることを確認します。

5-3-1. 公開鍵の確認

先ずは公開鍵から確認を行います。公開鍵はTXTレコードとして登録されていますのでdigコマンドを以下のように実行します。

 command
$ dig 181026._domainkey.testdom.com txt

以下のように応答があれば、正常に設定が完了しています。

 log
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> 181026._domainkey.testdom.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39057
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;181026._domainkey.testdom.com. IN TXT ;; ANSWER SECTION:
181026._domainkey.testdom.com. 500 IN TXT "v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFOu6xDK9rSuttAbMNY9Cs2cmOWxUV48kMvalmFo0trkL6zoncBvYyCZ7z4o9F79cWPQCLSNLuviCRbS9k5LsZEr9M8nM+k+zqYQKh8ttTWMt5odvpcz6C4miQMJ/Cc2gfcpRQDFWWSqm2O6BhALV7p1tzUmbchLxtBRtjcMXXTQIDAQAB" ;; Query time: 2 msec
;; SERVER: 157.7.180.133#53(157.7.180.133)
;; WHEN: 金 10月 26 10:34:29 JST 2018
;; MSG SIZE rcvd: 315

5-3-2. DKIMポリシーレコード(ADSP)の確認

続いてDKIMポリシーレコードであるADSPの確認を行います。ADSPはTXTレコードとなりますので、digコマンドを以下のように実行します。

 command
$ dig _adsp._domainkey.testdom.com txt

以下のように応答があれば、レコードは設定されています。

 log
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> _adsp._domainkey.testdom.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16470
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_adsp._domainkey.testdom.com. IN TXT ;; ANSWER SECTION:
_adsp._domainkey.testdom.com. 500 IN TXT "dkim=unknown" ;; Query time: 3 msec
;; SERVER: 157.7.180.133#53(157.7.180.133)
;; WHEN: 金 10月 26 10:34:58 JST 2018
;; MSG SIZE rcvd: 82

これでDNSサーバーへの公開鍵用設定と確認は完了です。

6. opendkimの設定

DKIMを利用するため

  • opendkimパッケージのインストール
  • 電子署名用ファイルの作成
  • DNSへの公開鍵登録

まで完了しましたので、ここからはopendkimの設定を変更します。opendkimの設定ファイルは複数に分かれています。順に説明していきます

6-1. opendkim.confの変更

opendkimの基本的な設定は”/etc/”ディレクトリ以下にあるopendkim.confファイルで行います。opendkim.confの設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

 command
# cp -p /etc/opendkim.conf /etc/opendkim.conf.org

バックアップの完了後、エディタでopendkim.confファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/opendkim.conf

opendkim.confファイルが開きます。具体的は変更ポイントを説明していきます。

ポイント

変更点でコメントを「付ける」「外す」という記載がありますが、以下のような意味合いになります。

  • 「コメントを外す」は行頭の”#”を削除
  • 「コメントを付ける」は行頭に”#”を付ける

6-1-1. Modeパラメータ

Modeパラメータは確認を行うモードを設定します。デフォルトの設定ではメール受信時の確認のみの”v”になります。本記事ではなりすまし回避として送信時の署名を行う必要がありますので”s”を追加します。

 code
#Mode v

上記のようになっているModeパラメーターを以下のように変更します。

 code
Mode sv コメントを外してvを追加する

6-1-2. keyFileパラメータ

KeyFileパラメータは利用する秘密鍵ファイルを指定します。KeyTableファイルで秘密鍵を指定するため、ここでは本設定を無効にします。

 code
KeyFile /etc/opendkim/keys/default.private

上記のように設定されているKeyFileパラメーターをコメントにして、無効にします。

 code
#KeyFile /etc/opendkim/keys/default.private

6-1-3. keyTableパラメータ

KeyTableパラメータには利用する秘密鍵を指定します。

 code
# KeyTable /etc/opendkim/KeyTable

デフォルトではコメントになっていますので、以下のようにコメントを外します。

 code
KeyTable /etc/opendkim/KeyTable コメントを外す

6-1-4. SigningTableパラメータ

SigningTableパラメータには電子署名を行う送信元アドレスを指定します。

 code
# SigningTable refile:/etc/opendkim/SigningTable

デフォルトでは無効になっていますのでSigningTableパラメーターを以下のように変更します。

 code
SigningTable refile:/etc/opendkim/SigningTable コメントを外す

6-1-5. ExternalIgnoreListパラメータ

ExternalIgnoreListパラメータには認証を行わないメールサーバーを指定します。本環境ではメールサーバー自身になります。

 code
# ExternalIgnoreList refile:/etc/opendkim/TrustedHosts

ExternalIgnoreListパラメーターを以下のように変更します。

 code
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts コメントを外す

6-1-6. InternalHostsパラメータ

InternalHostsパラメータはメールの送信時に、必ず認証を行うメールサーバーを指定します。本環境ではメールサーバー自身になります。

 code
# InternalHosts refile:/etc/opendkim/TrustedHosts

InternalHostsパラメーターを以下のように変更します。

 code
InternalHosts refile:/etc/opendkim/TrustedHosts コメントを外す

ExternalIgnoreListとInternalHostsのパラメーターが同じなのは、おかしな感じがしますが、以下のような考え方になります。

ExternalIgnoreListローカルホストからローカルホストに配送されるメールは認証不要
InternalHostsローカルホストから外部にメールを配送する場合には認証が必須

6-1-7. SoftwareHeaderパラメータ(任意での設定)

SoftwareHeaderパラメータはヘッダーにopendkimのソフトウェア情報を出力するための設定になります。本設定はデフォルトでは有効になっており、以下のようなヘッダーが出力されます。

 log
DKIM-Filter: OpenDKIM Filter v2.11.0 mail.testdom.com

セキュリティ面で、ソフトウェアのバージョンを表示したくない場合には、このパラメータを設定値を変更します。本記事では変更していません。

 code
SoftwareHeader yes

ソフトウェアのバージョンをメールのヘッダー情報に出力する場合には、パラメータを以下のように変更します。

 code
SoftwareHeader no yesからnoに変更

各設定項目の変更が終わったら、ファイルを保存します。これでopendkim.confの設定は完了です。

6-2. KeyTableの変更

KeyTableファイルは電子署名に利用する秘密鍵を指定するファイルになります。KeyTableファイルは”/etc/opendkim”ディレクトリ以下にあります。KeyTableファイルの変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

 command
# cp -p /etc/opendkim/KeyTable /etc/opendkim/KeyTable.org

バックアップの完了後、エディタでKeyTableファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/opendkim/KeyTable

KeyTableファイルが開きます。KeyTableファイルへの記載は以下のようなフォーマットがあります。

[セレクタ名]._domainkey.[ドメイン名] [ドメイン名]:[セレクタ名]:[秘密鍵へのパス]

このフォーマットに即して、本記事ではファイルの最下行に以下の記載を追記しました。

 code
181026._domainkey.testdom.com testdom.com:181026:/etc/opendkim/keys/testdom.com/181026.private

KeyTableの追記が終わったら、ファイルを保存します。これでKeyTableの設定は完了です。

6-3. TrustedHostsの変更

TrustedHostsは信頼できるメールサーバーを追加します。今回の記事ではopendkimとpostfixが同じサーバー上で動作する前提になりますので、ループバックアドレスを指定します。
デフォルトでループバックアドレスが指定されているため、設定変更は行いません。
以下がファイルの内容です。

 code
# OPENDKIM TRUSTED HOSTS
# To use this file, uncomment the #ExternalIgnoreList and/or the #InternalHosts
# option in /etc/opendkim.conf then restart OpenDKIM. Additional hosts
# may be added on separate lines (IP addresses, hostnames, or CIDR ranges).
# The localhost IP (127.0.0.1) should always be the first entry in this file.
127.0.0.1
#::1
#host.example.com
#192.168.1.0/24

6-4. SigningTableの変更

opendkimの基本的な設定は”/etc/opendkim”ディレクトリ以下にあるSigningTableファイルで行います。設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

 command
# cp -p /etc/opendkim/SigningTable /etc/opendkim/SigningTable.org

バックアップの完了後、エディタでSigningTableファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/opendkim/SigningTable

SigningTableファイルが開きます。具体的は変更ポイントを説明していきます。

6-4-1. SigningTableの設定

SigningTableパラメータは署名を行うドメインを記載します。記載についてはフォーマットがあります。

*@[ドメイン名] ._domainkey.[ドメイン名] [ドメイン名]:[セレクタ名]:[秘密鍵へのパス]

上記のフォーマットを踏まえて、最下行に以下を追記します。

 code
#example.com default._domainkey.example.com
*@testdom.com 181026._domainkey.testdom.com

SigningTableの追記が終わったら、ファイルを保存します。これでSigningTableの設定は完了です。

6-5. opendkim 起動の確認

設定が終わりましたので、opendkimを起動します。CentOSでは7系からsystemctlコマンドでサービスの起動・停止を行います。以下のようにsystemctlを実行することで起動できます。

 command
# systemctl start opendkim

エラーが出力されなければ、opendkimは起動しています。
続いて、サービスの状態を確認します。systemctlコマンドにstatusオプションを付けて実行することで、起動したサービスの状態について、詳細な情報を取得することができます。
以下が実行例です。

 command
$ systemctl status opendkim
● opendkim.service - DomainKeys Identified Mail (DKIM) Milter
Loaded: loaded (/usr/lib/systemd/system/opendkim.service; disabled; vendor preset: disabled)
Active: active (running) since 金 2018-10-26 10:43:06 JST; 4s ago
Docs: man:opendkim(8)
man:opendkim.conf(5)
man:opendkim-genkey(8)
man:opendkim-genzone(8)
man:opendkim-testadsp(8)
man:opendkim-testkey
http://www.opendkim.org/docs.html
Process: 24380 ExecStart=/usr/sbin/opendkim $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 24381 (opendkim)
CGroup: /system.slice/opendkim.service
mq24381 /usr/sbin/opendkim -x /etc/opendkim.conf -P /var/run/opendkim/opendkim.p...

上記では分かり難いかもしれませんが、黒丸(●)の部分が正常な起動状態の場合、緑色で表示されます。opendkimのActive項目に(running)と表示されていますので、起動されていることが確認できます。

6-6. opendkim 自動起動の設定

サーバーの再起動や停止の復旧時に、opendkimが自動的に起動するように設定します。サービスの自動起動を設定するにもsystemctlコマンドを利用します。自動起動は以下のようにsystemctlコマンドを実行します。

 command
# systetemctl enable opendkim
Created symlink from /etc/systemd/system/multi-user.target.wants/opendkim.service to /usr/lib/systemd/system/opendkim.service.

エラーが出力されなければ、自動起動は設定が完了しています。
続いて自動起動が設定されたことを確認します。

 command
$ systemctl is-enabled opendkim
enabled

実行結果として “enabled”と表示されれば自動起動の設定は完了です。

7. Postfixの設定変更

PostfixでDKIMを利用するため設定は”/etc/postfix”ディレクトリ以下にあるmain.cfファイルで行います。main.cfの設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。(.org、.org2、org3ファイルは以前の記事で作成していますので、本記事では.org4としています。)

 command
# cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org4

バックアップの完了後、エディタでmain.cfファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

 command
# vi /etc/postfix/main.cf

main.cf設定ファイルが開きます。具体的は変更ポイントは以下になります。

7-1. opendkim用設定の追加

SMTP接続時にDKIMを利用する設定パラメータを追記します。このパラメータはデフォルトのmain.cfには項目が無い為、設定ファイルの最下行に以下を追記します。

 code
### DKIM Settings
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

各パラメータの内容は以下のようになります。

smtpd_milterssmtpdが利用するmilterを指定
non_smtpd_milterssmtpd以外が利用するmilterを指定
milter_default_actionmilterがメールを受け取った時のデフォルトの挙動を指定

追記が出来たら、ファイルを保存して終了します。

7-2. 設定ファイルのチェック

設定ファイルのチェック用としてコマンド”postconf”を実行します。デフォルトパラメーターとは異なる設定のみを明示的に表示する”-n”オプションを付与します。以下のように実行します。

 command
$ postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = all
local_recipient_maps = unix:passwd.byname $alias_maps
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
masquerade_domains = testdom.com
message_size_limit = 10485760
milter_default_action = accept
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = testdom.com
myhostname = smtp.testdom.com
newaliases_path = /usr/bin/newaliases.postfix
non_smtpd_milters = $smtpd_milters
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP
smtpd_milters = inet:127.0.0.1:8891
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_tls_cert_file = /etc/letsencrypt/live/smtp.testdom.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/smtp.testdom.com/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
unknown_local_recipient_reject_code = 550

出力された内容を確認して、変更した部分が反映されていることを確認します。
またPostfixには設定ファイルの誤りをチェックするためのコマンド”postfix check”が用意されています。このコマンドで設定ファイルのチェックも行っておきます。

 command
# postfix check

エラーが表示されなければ、main.cfファイルには問題がありませんので、確認は完了です。

7-3. main.cfファイル変更点の反映

変更した設定を反映するためにPostfixを再起動します。systemctlコマンドを以下のように実行します。

 command
# systemctl restart postfix

エラーが無ければ、正常に再起動は実行されています。再起動後にPostfixのステータスを確認します。

 command
# systemctl status postfix
● Postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/Postfix.service; enabled; vendor preset: disabled)
Active: active (running) since 金 2018-10-26 16:08:49 JST; 6s ago
Process: 1827 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
Process: 1840 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
Process: 1838 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
Process: 1836 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
Main PID: 1912 (master)
CGroup: /system.slice/postfix.service
tq1912 /usr/libexec/postfix/master -w
tq1913 pickup -l -t unix -u
mq1914 qmgr -l -t unix -u

表示された上記のステータスから、Postfixが正常に起動していることが確認できました。

8. メールクライアントからの動作確認

DKIMが利用できるメールサーバーの設定ができましたので、テスト用クライアントからメールの送信を行い、DKIMによる電子署名が出来ていることを確認します。メールクライアントとしてはthunderbirdを利用しました。thunderbirdの設定は記事

Open Source
centos-postfix-dovecot-ssl-top
CentOSのPostfixとDovecotにSSLを設定して安全に通信を行う

前回の記事ではメールサーバーとしての基本的な機能である送信(SMTP)と受信(POP3/IMAP)を行うことが出来るように設定を行いました。 この状態でも運用には問題ありませんが、メールサーバーとクラ ...

から変更はありませんので、クライアントの設定を行っていない場合には、上記の記事をご覧下さい。

8-1. メールクライアントでの送信テスト(DKIM)

DKIMを設定したメールサーバーを利用して、外部ドメインにテスト用のメールを配信してみます。メールログを確認することでDKIMが有効になっているかを確認できます。
メールの送信元と送信先は以下になります。

送信元アドレスtestuser01@testdom.com
送信先アドレスsup@remsys.co.jp(Gmail)

送信時のメールログ(/var/log/maillog)から、該当するログを確認します。メールログには、以下のようにメールの配送ログが出力されました。

 log
Oct 26 11:00:58 smtp postfix/smtpd[24600]: connect from ******************[110.21.5.10]
Oct 26 11:00:58 smtp postfix/smtpd[24600]: Anonymous TLS connection established from ******************[110.21.5.10]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
Oct 26 11:00:58 smtp postfix/smtpd[24600]: 9CC8B12061A: client=a******************[110.21.5.10], sasl_method=PLAIN, sasl_username=testuser01
Oct 26 11:00:58 smtp postfix/cleanup[24606]: 9CC8B12061A: message-id=<da6922b6-210e-3dd1-a524-ad5ba440abc4@testdom.com>
Oct 26 11:00:58 smtp opendkim[24592]: 9CC8B12061A: DKIM-Signature field added (s=181026, d=testdom.com) <= 電子署名を行ったログ
Oct 26 11:00:58 smtp postfix/qmgr[22128]: 9CC8B12061A: from=<testuser01@testdom.com>, size=811, nrcpt=1 (queue active)
Oct 26 11:00:58 smtp postfix/smtpd[24600]: disconnect from ******************[111.8.53.106]]
Oct 26 11:01:00 smtp postfix/smtp[24607]: 9CC8B12061A: to=<sup@remsys.co.jp>, relay=aspmx.l.google.com[108.177.125.27]:25, delay=1.9, delays=0.14/0.01/0.99/0.73, dsn=2.0.0, status=sent (250 2.0.0 OK 1540519260 h2-v6si10127026plk.350 - gsmtp)
Oct 26 11:01:00 smtp postfix/qmgr[22128]: 9CC8B12061A: removed

上記のログにopendkimサービスによる電子署名を追加したログ"DKIM-Signature field added (s=181026, d=testdom.com)"が表示されています。

8-2. 受信側でのメールヘッダー確認

メールが正常に配送されましたので、受信してメールヘッダーを確認してみます。以下のようにDKIMの認証をパスしたログと、電子署名の記録が表示されています。

dkim-postfix04-8-2

これでDKIMを利用して電子署名されたメールの送信について確認が完了しました。

9. まとめ

現在、メールサーバーを運用する上で、なりすまし対策であるSPFとDKIMの設定は必須になっています。GoogleのGmailなどはDKIMが設定されていないサーバーからのメールについては、ほぼ迷惑メールと判別されてしまいますので、設定されていないメールサーバーを運用している場合には、これを機に設定を見直してみることをオススメします。
DNSとの関連もあるため、設定手順が煩雑に思えますが、一度、設定してしまえば、それ以後は特に気にすることもなく運用できます。
迷惑メールに判別されないために、是非、設定を行ってみて下さい。


レムシステムでは、ブログで紹介した設定ができない場合や、利用中のサーバー・ネットワークについての相談を受け付けています。利用中のシステムやセットアップでお困りの点がございましたら、お気軽にご相談ください。

メールでのお問い合わせ

メールフォームからシステムの
知りたいことや問題点をお問い合わせ

メールで問い合わせる

電話でのお問い合わせ

電話でお気軽にお問い合わせください
(受付時間:平日10:00〜18:00)

053-525-7357

  • この記事を書いた人
  • 最新記事
レムシステム

小村定

SIerでIT系インフラの設計と構築を経験したのちに独立、「レムシステム株式会社」を設立する。インフラ系エンジニア歴20年の経験を活かしてITに関わる課題解決や効率化に取り組む日々を送っている。

Copyright© レムシステム エンジニアブログ , 2019 All Rights Reserved.