こんにちは、pixiv開発支援チームのmipsparcです。
ピクシブからは月に2000万通程度のメールが送信されています。しかし、送ったメールが本当にユーザーに到達しているかという不安がありました。また、pixivになりすましてメールを送信している悪意のある人がいないかというのも重要な関心事です。
すでにバウンスメールなどはモニタリングしていましたが、追加の対策としてなりすましメール防止に使用されるDMARC(RFC 7489) を使って監視する仕組みをGoogle App Script(GAS)で作りました。
DMARCとは、保有しているドメインがユーザーに見える送信元メールアドレス header-from
に設定されたメールについて
RFC5321 from
(envelope-from; 受信したメールのReturn-Pathに同じ内容が書かれている)とheader-from
が一致(alignment)しているか、また、SPF認証が成功するか- DKIM署名元と
header-from
が一致しているか、また、DKIM認証が成功するか
による取扱いを宣言し、また結果をレポート(report)してもらう仕組みです。
2019年10月現在大手の受信者としてDMARCレポートに対応している代表的なサービスとしてはGmailがあります。
レポートを取得する方法
専用サービスを使うか、自分で開発するかの2択があります。今回はしっくりくるものがなかったのと、簡単に作れそうな感触があったので開発をしました。
DNSのTXTレコードに集約レポート先メールアドレスを記載しておくと、受信したメールサーバからおよそ1日に1回ZIP圧縮されたXMLファイルが添付された本文のないメールが届きます。このメールをシンプルに扱う仕組みを考えた結果、GmailとGASを組み合わせることにしました。
まずはレポート受信用の適当なメールアドレス(今回は dmarc@pixiv.com
)を用意します。別のドメインでも構いませんし、一つのメールアドレスに多数のドメインのレポートを集約させることもできます。
今回は pixiv.net
を監視するので、 _dmarc.pixiv.net
にTXTレコードを設定します。以下のポリシーは、集約レポートはすべて行うがfailしても何もしないというものです。まずはこのポリシーで様子を見るべきかと思います。
例: v=DMARC1; p=none; rua=mailto:dmarc@pixiv.com;
この場合設定ドメインと受信メールドメインが異なるので、 pixiv.net._report._dmarc.pixiv.com
にも設定が必要とされています。ドメイン単指定ではなくワイルドカードも可能です。
例: v=DMARC1;
これだけでレポートメールは送られてきます。
次に、スプレッドシートを作成し、それに紐付いたGASを書きます。
GASサンプルコード メールからのXML取得
function retribeXMLs() | |
{ | |
// 2日以内のすべてのスレッドを取得 | |
var threads = GmailApp.search('newer_than:2d'); | |
var xmls = []; | |
for (var i = 0; i < threads.length; i++) { | |
// スレッドからメッセージ(各メール)を取得 | |
var messages = threads[i].getMessages(); | |
for (var j = 0; j < messages.length; j++) { | |
// 添付されたzipバイナリ(1つのみ)を取得 | |
var zipblob = messages[j].getAttachments()[0].copyBlob(); | |
try { | |
// XMLファイルのバイナリを取得 | |
var fileblob = Utilities.unzip(zipblob); | |
} catch (e) { | |
continue; | |
} | |
for (var k = 0; k < fileblob.length; k++) { | |
// 配列にXML文字列を追加する | |
xmls.push(fileblob[k].getDataAsString()); | |
} | |
} | |
} | |
return xmls; | |
} |
DMARCレポートXMLの特に見るべきポイント
<feedback> | |
<report_metadata> | |
<org_name>受信者名</org_name> | |
<date_range> | |
<begin>開始UNIX TIME</begin> | |
<end>終了UNIX TIME</end> | |
</date_range> | |
</report_metadata> | |
<record> | |
<!-- recordは1つのXMLに複数含まれうる --> | |
<identifiers> | |
<header_from>header-from</header_from> | |
</identifiers> | |
<source_ip>送信元IPアドレス</source_ip> | |
<count>recordあたりの件数</count> | |
<auth_results> | |
<dkim> | |
<result>DKIMの判定結果</result> | |
<domain>DKIM署名元</domain> | |
</dkim> | |
<spf> | |
<result>SPFの判定結果</result> | |
<domain>envelope-from</domain> | |
</spf> | |
</auth_results> | |
</record> | |
</feedback> |
最終的には集計したレポートを作成したり、毎日のfail率をSlackに通知したりする仕組みができました。通知は経験的に確実に到着するstart_atの2日後にまとめてすると安定して監視できるかと思います。
今後は当分数値を監視して、厳しいポリシーを設定するなど次の一手を考えていくつもりです。
わかったこと
- pixivのメール設定は間違っておらず、ユーザーにメールは到達しているとみられる。
- pixivドメインを騙ってスパムメールを送信している業者は見つからなかった。
- DMARC対応の受信者率はpixivでは50%程度だった。
参考文献
なりすまし対策ポータルナリタイ
一般財団法人インターネット協会 RFC7489日本語訳(加藤 大雄)
DMARC.org wiki
DMARCと送信ドメイン認証( SPF, DKIM) を理解して、実際に設定してみよう - Customers Mail Cloud ブログ
最後に: pixivではアルバイトも募集しています
pixiv開発支援チームは、長期的な目標とどのチームにも所属しない短期的な問題の両面からpixivの課題を解決するチームです。
私は来年新卒予定で、大学に通いながらアルバイトとして参加して3年目ですが、立場に関係なく問題解決に取り組んでいます。
普通では味わえない実務能力を期待される体験をしたい方を募集しています。