なんです?これは
通常、サーバ上のプログラムからメールを送信する場合、各種ライブラリを使用して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