OpenDKIMをセットアップする方法

なんです?これは

OpenDKIM公式

通常、サーバ上のプログラムからメールを送信する場合、各種ライブラリを使用してsendmailに送信をお願いするような形が多いかと思います。 この時、DKIM-Signatureというヘッダ情報をメールに付ける+DNSの追加情報設定を行うことで、迷惑メールでないことをある程度証明できることができ、受信メールサーバ側で迷惑メールとして処理される確率を下げることができます。 この特殊なメールヘッダを生成できるのがOpenDKIMというオープソフトウェアになります。

ちなみに、"オープンディーキム"と読むらしいです。

気をつけたいのは、確実に迷惑メールではないということを証明をするものではなく、あくまでこのメールは正しいドメインからのものですよーというのが分かる程度ですので、メールプロバイダーによっては結局迷惑メールとして処理されてしまうケースもあります。 が、オープンソースなので、やっておくことに越したことはありません。やりましょう。

セットアップ環境と注意

これから説明する構成は、CentOS6でMTAにPostfixを利用している環境になります。 現在のMTAの向き先を確認したい場合、以下のコマンドを実行してください。 /usr/sbin/sendmail.postfixが含まれていればOKです。

[kantaro@cloud ~]$ alternatives --display mta
mta -ステータスは自動です。
リンクは現在 /usr/sbin/sendmail.postfix を指しています。
(略)

含まれていなければ、以下コマンドでMTAをPostfixに切り替えてから再度確認してください。

[kantaro@cloud ~]$ alternatives --config mta

2 プログラムがあり 'mta' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.sendmail
   2           /usr/sbin/sendmail.postfix

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2

ちなみに、後述するサーバ設定を行うことで、Postfixを通した指定のドメインからの送信メールにDKIM-Signatureが自動的に付くようになりますが、細かいサーバ設定が面倒な場合は自前でシグネチャを付けて渡してもOKです。 自前でシグネチャを付ける場合、Perlだと Mail::DKIM、PHPだと DKIM and Domain Keys class for PHP などのライブラリがありますが、ここでは詳説しません。ご参考まで。

また、該当ドメインのDNS情報に公開鍵情報を設定する必要があります。DNSサービス側で設定できないケースも考えられますので、事前に調査しておく必要があるかもしれません。ご注意を。

※尚、以下セットアップは基本的にroot権限での作業手順になります。sudoコマンドを使用する場合は適所読み替えて下さい。

OpenDKIMパッケージをインストール

OpenDKIMパッケージはEPELリポジトリにあります。 先にEPELリポジトリを追加します。既に追加されている方は結構です。

rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

リポジトリが追加できたらyumコマンドでOpenDKIMをインストールしてください。

yum install opendkim

尚、dkim-milterというパッケージが見つかる場合もありますが、現在はOpenDKIMが役目を受け継いだようですので、そちらは必要ありません。

キーペア作成

OpenDKIMパッケージのインストールに成功していれば、キーペア保存用のディレクトリができているのでそこに移動し、ドメインごとのディレクトリを作ります。適用したいメールアドレスのドメインです。
ここではsample.comとします。

cd /etc/opendkim/keys/
mkdir sample.com

作成したディレクトリの中でキーペアを生成します。OpenDKIM専用のコマンドがあるのでそれを使います。

cd sample.com
opendkim-genkey -d sample.com -s dkimselector

今作成したディレクトリとキーペアをopendkimユーザーの所有に変更します。

chown -R opendkim:opendkim /etc/opendkim/keys

OpenDKIM設定

既存のOpenDKIMの設定ファイルを編集します。以下ハイライトの行の部分を参考に編集してください。

## BASIC OPENDKIM CONFIGURATION FILE
## See opendkim.conf(5) or %{_pkgdocdir}/opendkim.conf.sample for more

## BEFORE running OpenDKIM you must:

## - make your MTA (Postfix, Sendmail, etc.) aware of OpenDKIM
## - generate keys for your domain (if signing)
## - edit your DNS records to publish your public keys (if signing)

## See %{_pkgdocdir}/INSTALL for detailed instructions.

## CONFIGURATION OPTIONS

# Specifies the path to the process ID file.
PidFile /var/run/opendkim/opendkim.pid

# Selects operating modes. Valid modes are s (sign) and v (verify). Default is v.
# Must be changed to s (sign only) or sv (sign and verify) in order to sign outgoing
# messages.
Mode    sv

# Log activity to the system log.
Syslog  yes

# Log additional entries indicating successful signing or verification of messages.
SyslogSuccess   yes

# If logging is enabled, include detailed logging about why or why not a message was
# signed or verified. This causes an increase in the amount of log data generated
# for each message, so set this to No (or comment it out) if it gets too noisy.
LogWhy  yes

# Attempt to become the specified user before starting operations.
UserID  opendkim:opendkim

# Create a socket through which your MTA can communicate.
Socket  inet:8891@localhost

# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
Umask   002

# This specifies a text file in which to store DKIM transaction statistics.
# OpenDKIM must be manually compiled with --enable-stats to enable this feature.
#Statistics     /var/spool/opendkim/stats.dat

## SIGNING OPTIONS

# Selects the canonicalization method(s) to be used when signing messages.
Canonicalization        relaxed/relaxed

# Domain(s) whose mail should be signed by this filter. Mail from other domains will
# be verified rather than being signed. Uncomment and use your domain name.
# This parameter is not required if a SigningTable is in use.
Domain  sample.com

# Defines the name of the selector to be used when signing messages.
Selector        default

# Specifies the minimum number of key bits for acceptable keys and signatures.
MinimumKeyBits 1024

# Gives the location of a private key to be used for signing ALL messages. This
# directive is ignored if KeyTable is enabled.
#KeyFile        /etc/opendkim/keys/default.private

# Gives the location of a file mapping key names to signing keys. In simple terms,
# this tells OpenDKIM where to find your keys. If present, overrides any KeyFile
# directive in the configuration file. Requires SigningTable be enabled.
#KeyTable       /etc/opendkim/KeyTable
KeyTable refile:/etc/opendkim/KeyTable

# Defines a table used to select one or more signatures to apply to a message based
# on the address found in the From: header field. In simple terms, this tells
# OpenDKIM how to use your keys. Requires KeyTable be enabled.
#SigningTable   refile:/etc/opendkim/SigningTable
SigningTable refile:/etc/opendkim/SigningTable

# Identifies a set of "external" hosts that may send mail through the server as one
# of the signing domains without credentials as such.
#ExternalIgnoreList     refile:/etc/opendkim/TrustedHosts
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts

# Identifies a set "internal" hosts whose mail should be signed rather than verified.
#InternalHosts  refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts

ちなみに、55行目でドメインを一つ指定していますが、OpenDKIMは複数のドメインにも対応しています。詳しくは後述する「複数のドメインに対応する」をご参照下さい。

KeyTable設定

キーテーブルの設定ファイルを編集します。

vi /etc/opendkim/KeyTable

以下の行のsample.comの3箇所を正しいものに置き換え、追記して下さい。

dkimselector._domainkey.sample.com sample.com:dkimselector:/etc/opendkim/keys/sample.com/dkimselector.private

TrustedHostsの設定

信頼できるホストを設定します。

vi /etc/opendkim/SigningTable

以下の行のsample.comの2箇所を正しいものに置き換え、追記して下さい。

*@sample.com dkimselector._domainkey.sample.com

DNSにOpenDKIMの公開鍵を設定

以下、DNSサービスにAWS Route 53を利用した場合で説明をしますが、ドメインにTXT情報を設定できるDNSサービスならどこでも大丈夫です。 ちなみに、他にムームーDNSでも設定ができた実績がありますのでご参考まで。

まず、最初のほうで生成したキーペアのうち公開鍵の中身を見ます。

cat /etc/opendkim/keys/sample.com/dkimselector.txt

こんな感じになってると思います。↓
p=から文字列が実際のキーになります。(長いので一部省略)

dkimselector._domainkey IN      TXT     ( "v=DKIM1; k=rsa; "
      "p=MIGfMA0GCS..." )  ; ----- DKIM key dkimselector for sample.com

上記を参考に、AWS Route 53に以下の内容でTXTレコードを追加します。

項目
Name dkimselector._domainkey.sample.com
Type TXT
Value "v=DKIM1; k=rsa; p=MIGfMA0GCS..."

尚、; k=rsaじゃなく;=rsaとなってしまうOpenDKIMのバージョンもあるらしいのでご注意!
この違いでメール認証に失敗してメールヘッダAuthentication-Resultsdkim=neutral (bad format)になったりします。

AWS Route 53:selector

上図はAWS Route 53の画面です。こんな感じでDNSサーバにTXT情報を登録します。

DKIM送信ポリシー(SSP)の設定

次に、上記と同様にAWS Route 53で、送信ポリシーを記述したTXT情報も設定します。

項目
Name _adsp._domainkey.sample.com
Type TXT
Value "dkim=unknown"

ちなみに、上記で指定されているunknownという値はこのドメインから送信されるメールのいくつか、またはすべてに、メール作成者署名が得られるという意味とのこと。 詳細は以下サイトをご参考下さい。

DKIM (Domainkeys Identified Mail)

Postfix側の設定

次にPostfixと連動させるための設定をします。Postfix側の設定ファイルを開き、以下のハイライト行を末尾に追記して下さい。

# readme_directory: The location of the Postfix README files.
#
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES


message_size_limit = 0

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

OpenDKIMを起動

service opendkim start

でOpenDKIMを起動します。以下のような出力があれば問題無いです。

Generating default DKIM keys: [ OK ]
Starting OpenDKIM Milter: [ OK ]

もし、hostname 不明なホストといった警告が出る場合は、hostnameコマンドで出るホスト名がドメインの形になってない場合です。これは確認してないのですが、特に問題無いような気がしますが、うまくいかない場合は、hostnameの変更をするといいかもしれません。 また、初回はDefault DKIM keys for net created in /etc/opendkim/keys.という警告が出る場合もありますが気にしなくてOKです。

次に、Postfixも再起動しておきましょう。

service postfix reload

さらに、サーバスタートアップ時にもOpenDKIMを自動起動するように設定します。

chkconfig opendkim on

正常に動くか確認

mailコマンドでsa-test@sendmail.netにテストメールを送ってみましょう。このメールアドレスは、DKIMSPFなどの設定が正しくなされているかを、実際にチェックしてその結果を返信してくれる自動サービスです。

echo "Test Mail." | mail -s "test mail" -r webmaster@sample.com sa-test@sendmail.net

返信内容にDKIM signature confirmed GOODとあれば成功、DKIM signature confirmed BADとなっていれば設定失敗となります。 DNSの反映を待ってから再度試すといいかもしれません。

尚、上記mailコマンドはCentOS6系です。CentOS5系や別のLinuxディストリによってかなり違いますので、以下ご参照下さい。

mail コマンドで from を変更する方法まとめ

OpenDKIMの設定は以上になります。

以下からは、2つ目以降のドメインを追加する場合の簡易にまとめた版です。

複数のドメインに対応する

以下の要領で対応するドメインを追加します。例としてhogehoge.jpとします。

# be verified rather than being signed. Uncomment and use your domain name.
# This parameter is not required if a SigningTable is in use.
Domain sample.com, hogehoge.jp
 
# Defines the name of the selector to be used when signing messages.
cd /etc/opendkim/keys/
mkdir hogehoge.jp
cd hogehoge.jp
opendkim-genkey -d hogehoge.jp -s dkimselector
chown -R opendkim:opendkim /etc/opendkim/keys
dkimselector._domainkey.hogehoge.jp hogehoge.jp:dkimselector:/etc/opendkim/keys/hogehoge.jp/dkimselector.private
*@hogehoge.jp dkimselector._domainkey.hogehoge.jp

そして、キーの中身を確認して、DNSサービスでTXTレコードを2つ追加します。

cat /etc/opendkim/keys/hogehoge.jp/dkimselector.txt
項目
Name dkimselector._domainkey.hogehoge.jp
Type TXT
Value "v=DKIM1; k=rsa; p=XXXXXXXXX..."
項目
Name _adsp._domainkey.hogehoge.jp
Type TXT
Value "dkim=unknown"
service opendkim restart
service postfix reload

DNS反映後、テストして完了です。

echo "Test Mail." | mail -s "test mail" -r test@hogehoge.jp sa-test@sendmail.net

以上です。

おまけ

nslookup -q=txt dkimselector._domainkey.sample.com
dig -t TXT dkimselector._domainkey.sample.com @8.8.8.8

参考にさせていただいたサイト