CDNに動的コンテンツを安全に通すにはどうするべきか

メルカリでCDNにキャッシュされるべきでないページがキャッシュされることにより個人情報の流出が発生してしまうインシデントがありました

自分は動的コンテンツをCDNで配信することにあまり積極的ではない立場だったのですが流出への反応を見るとCDNを利用しているサービスはかなり増えてきているようです

個人情報やユーザーのプライベートデータを決して流出しないようにしつつCDNを利用する方法を考えてみました

CDN利用のメリット

このふたつ

  • 経路が最適化されレイテンシが小さくなる
  • DDoS対策となる

キャッシュされないようにする方法

Twitterで動的コンテンツもCDN通すの当たり前でしょーと言ってる人にリプしてきいてみました

  • CDNとレスポンスヘッダで二重にキャッシュを無効化する
    • キャッシュを細かくコントロールCDNを使う
      • ホワイトリスト方式で特定のパスのみキャッシュを許可
      • ログインセッションを持っている場合にはキャッシュされないようにする
  • CDNを含めた環境でキャッシュ専用のテストケースを作成しテストが必要なすべてのactionについて不正にキャッシュ専用されていないことをチェックする
    • 当然actionの追加があった場合には必ずキャッシュのテストも追加する

なるほど、これくらいしっかりとした対策をたてれば安全に使えそうですね

CDNの選定

設定を細かくできないものはよくなさそうです

ヘッダでしかコントロールできない Google Cloud CDN はヘッダをミスすると即死です

また直感的でない振る舞いをするCDNも避けた方がよさそうです

Fastlyでは Cache-Control: no-store, no-cache がキャッシュ対象となってしまい事故のにおいがします

https://community.fastly.com/t/fastly-ttl/882

CDNを動的コンテンツに使うべきか

用途や傾向ごとに

使うべき

  • アクセスが世界中から来る
    • 日本にサーバーがあって日本からのアクセスが99%とかだと経路最適化効果は薄いでしょう
  • 漏れて困るデータがない
    • 失敗しても失うものはありません、ガンガンいけます
  • DDoSが来ておりそれがCDNで防げるものである
    • 最近はAWSにデフォルトで対策がされていたりして、それで防げているものもありそうです
    • 逆にCDNを導入してもダメなものもあるのではないでしょうか
    • 今攻撃が来ていてそれがCDNで防げるなら導入すればいいと思いますがCDN入れれば完璧というものではない
  • サービス全体について充分な管理が行き届いており CDNの設定についてもサービスとともに管理できる体制が整っている
    • 安全に運用するには適切なコストをかける必要がありそうです

使うべきでない

  • センシティブなデータがある
  • ユーザーとサーバー間のレイテンシが充分に短い
  • DDoSが来ていない
  • サービスが巨大で全体をコントロールすることがむずかしい
  • サービスが放置されがち
  • 安全にキャッシュされないようにしながら導入するコストが効果に見合わない

まとめ

最初は否定的だったのですが、しかるべき手間をかければ安全に運用できそうですね

5年後の担当者が地雷を踏むといった事にならないようにしつつやっていきましょう!