なんです?これは
通常、サーバ上のプログラムからメールを送信する場合、各種ライブラリを使用して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-Resultsがdkim=neutral (bad format)になったりします。

上図は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にテストメールを送ってみましょう。このメールアドレスは、DKIMやSPFなどの設定が正しくなされているかを、実際にチェックしてその結果を返信してくれる自動サービスです。
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ディストリによってかなり違いますので、以下ご参照下さい。
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