昨日(2017/6/22)、メルカリWeb版にて個人情報流出が起こりました。
⇨CDN切り替え作業における、Web版メルカリの個人情報流出の原因につきまして
本投稿では、非インフラエンジニア向けに、『メルカリで起こった問題は、自社のサービスでは果たして起こらないか?』を確認する考え方について書きたいと思います。
▼つよいインフラエンジニアの方へ
もし記載内容に誤りがあれば、ご指摘をいただきたいです。よろしくお願いします。
( https://twitter.com/katsuhisa__ )
▼そこそこインターネット詳しいぜ!という方へ
分かりきっている内容に関しては、がんがん読み飛ばしてください。
今回の問題を三行で
- 個人情報が含まれるページが、
- CDNプロバイダ切り替え時に、
- 予想外にキャッシュされてしまった
問題の構造
今回の問題は、2つの視点で分けて考えると理解しやすいです。
- キャッシュとは
- CDNの仕組み
少し遠回りに感じられるかもしれませんが、一つずつ解説しますので、お付き合いください。
キャッシュとは
エンジニアのみなさんにとっては、「キャッシュとか知ってるわバーローww」だと思いますが、改めてキャッシュとは何かについて書きます。
(説明の簡単のため、HTTPキャッシュについてのみ書きます。)
キャッシュとは、一度アクセスしたページの情報を、通信経路のどこかに保存しておき、通信を高速化する仕組みのことです。
CDNの仕組み
引き続き、CDN(コンテンツデリバリーネットワーク)の仕組みについても確認します。
CDNとは、世界各地にちらばるサーバーに、自社のWebサイトや、自社のWebサイトで使われているデータの一部、または全部をキャッシュさせる仕組みです。
そうすることにより、アクセスしてきた人に早くデータを返せるCDN内のサーバーが、Webサーバーに代わってリクエストを返すことで、Webサイト表示の高速化を実現します。
Akamaiや、AWSのCloudFrontなどが有名です。
ちなみにメルカリWeb版を昨夜見た限り、メルカリさんはAkamai使っているみたいです。
メルカリWeb版で起こった問題
さて、前提知識の統一ができたところで、実際に今回の問題の中身について詳しくみていきましょう。
ここで、問題点を認識しやすくするため、メルカリWeb版にアクセスします。
※要PCでのアクセス
※ここからURLに注目しながら読んでみてください。
引き続き、マイページにアクセスします。
⇨https://www.mercari.com/jp/mypage/
※要アカウント登録
せっかくですので、もう1ページだけ。
過去の取引の評価一覧を表示してくれるページです。
⇨https://www.mercari.com/jp/mypage/review/history/
さて、当たり前に思われるかもしれませんが、
みなさんが上記URLにアクセスしても、私と同じページは表示されませんよね?
しかし、今回起こった問題は、まさにこの瞬間に他人のアカウントページが表示されたのです。
なぜでしょうか?
キャッシュとURLの関係、そしてCDNの勘所
ここでもう一度、キャッシュとは何かについておさらいしましょう。
キャッシュとは、一度アクセスしたページの情報を、通信経路のどこかに保存しておき、通信を高速化する仕組みです。
一度アクセスしたページは、URLでおぼえられていると考えてください。
先ほど、評価一覧のページ( https://www.mercari.com/jp/mypage/review/history/ )にアクセスしましたが、これがCDNにキャッシュされてしまうと何がマズイのかを考えてみましょう。
通常、このような個人のアカウントにひもづく情報が含まれるページは、Webサーバー側で、「あなたはだれですか?」をちゃんと確認した上でレスポンスを返します。
そのため、個人のアカウントにひもづく情報が含まれるページがCDNにキャッシュされたのならば、CDN側で「あなたはだれですか?」と確認しない限り、個人情報流出の可能性があります。
今回、メルカリのエンジニアブログで、以下のような記述があったのは、まさにこのことです。
本来お客さまごとに異なる内容が表示されるはずが、CDNにてキャッシュされたことにより同一の内容が表示されました。 これによりお客さまの個人情報(配送先住所、メールアドレス)などが、本人以外に表示されました。
ここまでで問題の大枠がつかんでいただけましたでしょうか?
うちでは大丈夫?に答えるための視点
ようやく本題に入ります。
通常、今回起こったような問題を防ぐためには、私が思いつく限り、以下3つのどれかの対応が必要です。
- キャッシュ無効化
- CDN側でHTTP Cookieを利用
- そもそも個人情報を含むページをCDNに配信できないアーキテクチャにする
※Cookieについては、ここでは、「わたしは◯◯です!」をCDN側に理解させる仕組みくらいに考えて下さい。
もうお分かりかと思いますが、今回のメルカリさんでの原因は、1の対応をしたつもりだったが、設定に誤りがあったということですね。
…さて、上記3つのうちどれか1つが自社サービスに実装されているかを確認すれば、本投稿の目的は果たされることになりそうですね。順に見ていきましょう。
キャッシュ無効化
これに関しては、本投稿冒頭にリンクをはったメルカリさんのエンジニアブログで解説されておりますので、そちらをご参照ください。
Nginxの設定で、HTTPリクエストヘッダに、
Cache-Control: private
が含まれるよう設定すればよい、ということですね。
CDN側でHTTP Cookieを利用
こちらは各CDNプロバイダーによって設定方法が異なります。自社が利用しているCDNプロバイダのドキュメントを確認しましょう。
そもそも個人情報を含むページをCDNに配信できないアーキテクチャにする
これはCDNに配信される元となるサーバーを切り分けよう、という視点です。
たとえば以下のようなアーキテクチャなら、キャッシュが原因で個人情報流出するリスクはありません。
- 誰に見られても良いCSS / JS / 画像ファイルだけを格納したサーバーを準備
- そのサーバーだけをCDNの配信元とする
そもそも誰に見られても問題ないコンテンツだけをCDNの配信元に指定しておけば、
CDN経由でどこに配信されようが困りませんよね?という考え方です。
さいごに
以上で、『メルカリで個人情報流出したけど、うちは大丈夫?に答えるためのポスト』を締めくくります。
メルカリさんでは、問題が起こったその日のうちに原因を詳しく整理した技術記事を公開されており、本当に素晴らしいと思いました。
個人情報流出はあってはならないことですが、メルカリさんの事後対応の姿勢に非常に共感しました。
これからも日本最強のユニコーンとして活躍されているメルカリさんを応援しています。
何かご指摘や補足のリクエストあればご連絡お待ちしています。
https://twitter.com/katsuhisa__