なりすましメール・迷惑メール対策の仕組みとして、サーバーサイドでSPFという仕組みと、電子署名「DKIM」があるのだが、設定に手間取ったので、メモ。
Contents
そもそも、SPF/DKIMとは何か?
電子署名「DKIM」 – 民主党 http://p.tl/6Prc
DKIM はなりすましによる迷惑メールを防ぐための送信ドメイン認証技術のひとつです。 SPF が送信元サーバーの IP アドレスで正当性を検証していたのに対して、 DKIM はメールヘッダや本文に対して電子署名を施します。これには以下のような利点があります。
・配送経路での内容の改ざんを検出できる。
・メールが他のサーバーで中継されても正しく検証できる。
・多数のメールサーバーがある場合でも、 DNS リソースレコードにはひとつの公開鍵を記述するだけでよい。
SPF よりも信頼性が高く、大規模なシステムでの運用も考慮されているのがわかる。しかし欠点もあって、例えばメーリングリストへの投稿などで件名が変更された場合、メール内容と署名にズレが生じて、なりすましと判定されてしまうおそれ。このような場合はメーリングリストのサーバーが署名しなおすことになっているのだが、正しく処理しないシステムも多く存在する。逆に SPF はメール内容が変化しても検証できるので、両者を併用するのがベターなよう・・・
SPFとは 【 Sender Policy Framework 】 -IT用語辞典 http://p.tl/5vXD
メールの送信元アドレスの偽装を防止する技術。Pobox.com社の創設者Meng Wong氏が提唱した方式で、無差別に大量に送られる広告メール(SPAMメール)の抑止につながるとして期待されている。
あるドメインのメールを送信することができる正規のサーバのIPアドレスをリストして管理する。そのドメインと無関係なメールサーバを利用して送信元を偽ったメールを送信しようとすると、受信側でそのことを検出して自動的に受け取りを拒否することができる。これにより、SPAM業者が大手プロバイダなどの有名なドメイン名を含むメールアドレスを利用することを防ぐことができるようになる。ただし、多くの企業やプロバイダが参加しなければ効果が上がらず、また、SPAM業者が自前ドメインのメールを送信することは防げない。受け取りを拒否するドメインのブラックリストを用意するなど、別の対策を併用する必要がある。
Sender Policy Framework – Wikipedia http://p.tl/ztOF
Sender Policy Framework(センダー・ポリシー・フレームワーク)とは、電子メールにおける送信ドメイン認証のひとつ。差出人のメールアドレスが他のドメインになりすましていないかどうかを検出することができる。 SPF もしくは SPF認証 とも呼ばれる。
window.onload = function() {
dp.SyntaxHighlighter.ClipboardSwf = ‘http://tmh.main.jp/lib/js/dp.SyntaxHighlighter/Scripts/clipboard.swf’;
dp.SyntaxHighlighter.HighlightAll(‘code’);
};
SPFレコードの一般的な内容を示す。以下の内容が指定されたドメインは、「指定したIPアドレス帯域から送信された電子メールなら信頼して欲しいが、それ以外のIPアドレスからの電子メールは拒否して欲しい」と宣言することになる。
v=spf1 +ip4:203.0.113.0/24 +ip4:198.51.100.0/24 -all
下手に間違った指定をしてしまうと、「それ以外のIPアドレスからの電子メールは拒否して欲しい」と、自ら墓穴を掘ってしまうこととなる(つまり、自分で設置したスクリプト、wordpress等システムがsendmailするメールを「このメールは拒否してほしい」と宣言することになり、メールが送れない事態となる可能性がある・・・)
ちなみに、自分が使ってるプロバイダーがSPF認証にきちんと対応してるかは、以下のコマンドで確認できる。
nslookup -q=asah-net.or.jp(メアドのドメイン部分)
実際のSPF レコードの記述
現在管理しているシステム構成は、以下であり、googleAppsのヘルプにあったように、「コンテンツ:v=spf1 include:_spf.google.com ~all」を記入すると、wordpressからの問い合わせフォームの返信等、直接的にはgoogleのSMTPサーバーを使用してないメール送信に不具合が生じそう・・・なので、スクリプトがおいてあるサーバーのIPもあわせて指定しておく。
SPFレコードの設定
ホスト名:(空白のまま)
タイプ:TXT
//コンテンツ:v=spf1 include:_spf.google.com ~all
コンテンツ:v=spf1 ip4:112.78.117.186 ip4:210.172.144.0/24 ip4:210.157.22.0/25 ip4:203.189.109.0/24 include:_spf.google.com ~all
優先度:(0のまま)
ちなみに、ロリポップだと、以下を指定すればよい。
112.78.119.173(ロリポップ!Webメーラー)
210.172.144.0/24(Web、メール)
210.157.22.0/25(usersサーバー)
203.189.109.0/24(usersサーバー)
ホスト名 タイプ コンテンツ 優先度 pia-no.com A 112.78.117.186 - *.pia-no.com A 112.78.117.186 - pia-no.com TXT google-site-verification: google23bd730afc8c619d.html - pia-no.com MX aspmx.l.google.com 10 pia-no.com MX alt1.aspmx.l.google.com 20 pia-no.com MX alt2.aspmx.l.google.com 20 pia-no.com MX aspmx2.googlemail.com 30 pia-no.com MX aspmx3.googlemail.com 30 pia-no.com MX aspmx4.googlemail.com 30 pia-no.com MX aspmx5.googlemail.com 30 mail.pia-no.com CNAME ghs.google.com - calendar.pia-no.com CNAME ghs.google.com - docs.pia-no.com CNAME ghs.google.com - sites.pia-no.com CNAME ghs.google.com - google._domainkey.pia-no.com TXT v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCAWap45517piyseCEz+wdXN9f5AIE+EFX5cKCJ6C2Rr - pia-no.com TXT v=spf1 ip4:112.78.117.186 ip4:210.172.144.0/24 ip4:210.157.22.0/25 ip4:203.189.109.0/24 include:_spf.google.com ~all
DKIM認証の設定
DNS ホストの名前(TXT レコード名):
google._domainkey
TXT レコード値:
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCAWap45517piyseCEz+wdXN9f5AIE+EFX5cKCJ6(←先ずgoogleAppsでキー生成処理が必要)
優先度:(0のまま)
DKIM認証の申請
メールヘッダー 設定前
Received-SPF: neutral (google.com: 67.23.44.103 is neither permitted nor denied by best guess record for domain of example@cloudrop.jp) client-ip=67.23.44.103;
Authentication-Results: mx.google.com; spf=neutral (google.com: 67.23.44.103 is neither permitted nor denied by best guess record for domain of example@cloudrop.jp) smtp.mail=example@cloudrop.jp
設定後 (pass になっていればOK)
Received-SPF: pass (google.com: domain of example@cloudrop.jp designates 67.23.44.103 as permitted sender) client-ip=67.23.44.103;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of example@cloudrop.jp designates 67.23.44.103 as permitted sender) smtp.mail=example@cloudrop.jp
システムの対応
gmailサーバーからメールを送信する
<?php // PHPMailerを使用 require("PHPMailer/class.phpmailer.php"); //------------------ //1-1 文字コード設定 //------------------ mb_language("japanese"); mb_internal_encoding("UTF-8"); mb_language("japanese"); mb_internal_encoding("UTF-8"); //------------------ //1-2 認証設定 //------------------ $mailer = new PHPMailer(); $mailer->IsSMTP(); $mailer->Host = 'ssl://smtp.gmail.com:465'; $mailer->SMTPAuth = TRUE; $mailer->Username = 'info@gmail.com'; // Gmailのアカウント名 $mailer->Password = 'passpass'; // Gmailのパスワード $mailer->From = 'info@gmail.com'; // Fromのメールアドレス $mailer->FromName = mb_encode_mimeheader(mb_convert_encoding("ピアノサークル・ピアノを弾きたい!","JIS","UTF-8")); $mailer->Subject = mb_encode_mimeheader(mb_convert_encoding("メールのタイトル","JIS","UTF-8")); //------------------ //2-1 送信内容(宛先、件名、本文) //------------------ $mailer->Body = mb_convert_encoding("メールの内容","JIS","UTF-8"); //$mail->isHTML(true); $mailer->AddAddress('friend@example.com'); // 宛先 // $mailer->AddReplyTo($email, $from); $mailer->AddCC($cc-email); $mailer->AddBCC($bcc-email); //------------------ //2-2 添付ファイル //------------------ $attachfile = "files/test.xls"; //添付ファイルパス //添付ファイル追加 $mailer->AddAttachment($attachfile); $mailer->AddAttachment($attachfile2); //------------------ //2-3 送信処理 //------------------ $mailer->Send(); //メール送信 ?>
WordPressで、Gmailを使って送信する。
GmailをSMTPサーバとして使用するWordPressプラグイン「Cimy Swift SMTP」
WP Mail SMTP プラグインを使用する
コンタクトフォームからの送信テストで、以下を確認してOK
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of info@pia-no.com designates 2607:f8b0:400e:c02::233 as permitted sender) smtp.mail=info@pia-no.com;dkim=pass header.i=@pia-no.com
XOOPSから「Google Apps」を利用してメールを受信する方法
「XOOPS コンフィグ」→「メール設定」を開き
「メール送信方法」を「SMTPAuth」に設定
「SMTPサーバアドレス 」を「ssl://smtp.gmail.com:465」
「SMTPAuthユーザ名 」を「Google Apps」で設定されたアドレスのユーザ名
「SMTPAuthパスワード 」を「Google Apps」で設定されたアドレスのパスワード
予約フォームからの送信テストで、以下を確認してOK
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of info@pia-no.com designates 2607:f8b0:400e:c02::233 as permitted sender) smtp.mail=info@pia-no.com;dkim=pass header.i=@pia-no.com
Openpneの対策
1.管理画面の「SNSの設定」で、メアドを設定できるので、そこをinfo@gmail.com に変更。
(ここまでで、いったん様子をみて~あくまで、以上の対応だけでは、従来どおりサーバーのsendmailからの発信となる=送信サーバーはレンタルサーバーのSMTP)
2.config.phpをいじって(メール設定部分が真ん中あたりにあるので、そこら辺に)、以下を書き込む。
//--------------------------------------------------- //::GMAIL //--------------------------------------------------- // Pear::Mailで外部SMTPサーバに送信する define('MAIL_NET_SMTP', true); // 外部SMTPサーバ設定 $GLOBALS['_NET_SMTP_SERVER'] = array( 'host' => 'tls://smtp.gmail.com', 'port' => 465, 'auth' => true, 'debug' => 'false', 'username' => 'info@gmail.com', 'password' => 'passpass', ); //--------------------------------------------------- //::GMAIL //---------------------------------------------------
(追記)
上記対策は結局意味がなく、以下で対応。
/usr/local/OpenPNE/webapp/lib/util/mail_send.php がメールを送信しているスクリプトであり、これを編集。
mail_send.phpのL60
//return mail($address, $subject, $body, $headers, $params);//オリジナルをコメントアウト //////////////////////////////////////////////////////////////// //以下を追加 //////////////////////////////////////////////////////////////// include_once('Mail.php'); $recipients = "$address" ; $headers = "" ; $headers['From'] = $from ; $headers['To'] = "$address"; $headers['Subject'] = "$subject"; $mail_options = array( 'host' => 'tls://smtp.gmail.com', // SMTPサーバー名 'port' => 465, // ポート番号 'auth' => true, // SMTP認証 true false 'username' => "info@gmail.com", // ユーザー名 'password' => "password", // パスワード 'localhost' => 'tmh.main.jp' //送信元サーバーのFQDN名 HELOに使う ); $mail_object =& Mail::factory("SMTP",$mail_options); $mail_object->send($recipients, $headers, $body); //////////////////////////////////////////////////////////////// //ここまで ////////////////////////////////////////////////////////////////