Amazon S3 静的サイトホスティングに対して、ワイルドカードによる DNS レコードは使わないでください

Amazon S3 静的サイトホスティングに対して、ワイルドカードによる DNS レコードは使わないでください

Clock Icon2019.12.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

旬の生魚おじさん、都元です。弊社は本日を最終営業日として、これから冬季休業となります。 今年も一年、どうもありがとうございました。というわけで恒例の書き納め三本締め、その1。

だいぶ昔に「AWSにおける静的コンテンツ配信パターンカタログ(アンチパターン含む)」というエントリーでご紹介しましたが、Amazon S3 には静的ウェブサイトホスティングという機能があります。

静的 (つまり、状況に応じて異なるコンテンツを返さない、常に同じコンテンツを返す) ウェブサイトは、特に EC2 などのサーバーを立ち上げずに、S3 の機能を使って実現できます。古くからある機能です。

この機能は、さらに Amazon Route 53 によって ALIAS レコードを設定することにより、独自ドメインによるホスティングも可能です。これも古くからある機能です。

このあたりの詳細は AWS ドキュメントのチュートリアル「独自ドメインを使用して静的ウェブサイトをセットアップする」を参照してください。

静的サイトホスティング機能の理解

とりあえず、東京リージョンで S3 バケットを作り、aaa.foobar.example.com というドメインでこの設定を行ったことを考えます。

この状態を観察してみると、aaa.foobar.example.com というドメインに対して s3-website-ap-northeast-1.amazonaws.com の IP アドレスを設定したことになります。そして S3 は名前ベースのバーチャルホストの挙動をしているようで、HTTP リクエストにおける Host ヘッダと同じ名前の S3 バケットを探し、そこにルーティングしているようです。

また「S3 静的ウェブサイトホスティングのドメインを別のAWSアカウントで管理する」でご紹介したように、Route 53 の Hosted zone がある AWS アカウントと S3 のバケットがある AWS アカウントは同じである必要がありません。

ワイルドカードによる DNS レコードと、その危険性

さて、ここからが本題です。

Route 53 にはワイルドカードを使ったレコードを登録、ハンドリングする機能があります。例えば *.foobar.example.com というレコードを登録することにより、aaa.foobar.example.com でも bbb.foobar.example.com でも同じ A レコードを返すような設定ができます。

この機能を静的サイトホスティングに対して適用して、複数のサブドメインについてサイト公開できるようにしたい! と思ったとしても、絶対にやめましょう。

  • aaa.foobar.example.com
  • bbb.foobar.example.com

という 2 つのサイトを運営しているとき、xxx.foobar.example.com にアクセスすると次のような 404 エラーレスポンスが返ります。

悪意を持った第三者がこの画面を見たとき、まず「このドメインが S3 の静的サイトホスティング機能で動いている」ことが容易に判断できます。その上で、その第三者が xxx.foobar.example.com というバケットを作った場合、どうなるでしょうか?

そう、このドメインで任意のコンテンツ (悪意のあるスクリプト等) を配信できてしまいます。あー危ない。

まとめ

一言。S3 の静的サイトホスティングにおいて、ワイルドカードの DNS レコードを使うのはやめましょう。

ちなみに本件を書こうとしたきっかけは、単純にとあるドメインにアクセスした時に前述のような 404 が表示されているのを見かけたことでした。これは単純に「かつて運用していたサイトを閉鎖するにあたって、S3 バケットを消しただけで DNS レコードの削除を行わなかった」ことによって発生したのだと思われます。このサイト、かんたんに乗っ取れてしまいます…。みなさまも、かつて静的サイトホスティングで運用していたけど「閉鎖したあのドメイン」みたいなものが頭に浮かんだら、チェックしてみてください。

ワイルドカードの話ではなくても、とにかく危険です。

ではみなさま、良いお年を。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.