クラウド事業部の原口です。
Amazon CloudFrontはCDNサービスですが、さまざまな機能がある事もありキャッシュを使う使わないに限らず利用する事が増えてきました。
特にAWS WAFにAWSマネージドルールが出来てからはセキュリティ面の対策をCloudFrontをAWS WAFの統合を見込んで使う事も多くなっています。
先にまとめ
AWSマネージドプレフィックスリスト(CloudFront)を利用すればCloudFront を経由しないオリジンへのアクセスをブロックできる為、これのみでオリジンのセキュリティを担保できると思いがちですが、CloudFrontを経由したアクセスであれば、例え別アカウントのCloudFrontであってもすべて許可してしまうという事を意識しときましょう。
これまでの「カスタムヘッダーでの検証」 + 「マネージドプレフィックスリスト」の二つでオリジンを保護すべきというお話です。
CloudFrontを経由しないアクセスを制限したい
CloudFrontとオリジンとのアクセスはインターネット経由で行われるため、オリジンはCloudFrontからアクセスできるようにする必要があります。
そうすると、CloudFrontへのアクセスを経由せずにオリジンへ直接接続できる環境が出来てしまいます。
これだと制限なくシステムにアクセスされてしまうので「オリジンはCloudFrontを経由したアクセスだけに強制したい!」というという要望は当然でてきます。
特にセキュリティの担保やIP制限等をCloudFront(AWS WAF)で行なっている場合はCloudFrontを経由したアクセスだけに強制しなければ即セキュリティリスクになる可能性があります。
その為、これまでこういった環境ではCloudFrontからのアクセスを強制するために、CloudFrontからオリジンへのリクエストにカスタムHTTPヘッダを付与し、ELB側ではそのヘッダがなければ拒否するような実装を行う形が一般的でした。
(参考)リクエストにカスタム HTTP ヘッダーを追加するための CloudFront 設定
CloudFront の IP が Managed Prefix Listでのサポートを開始
実は上記のカスタムヘッダでの方法以外にもCloudFrontのIPのみを許可するようにするという方法もありますが、CloudFrontはIPアドレスがしょっちゅう変わるのでそのメンテが大変であまり使われない方法でした。しかしManaged Prefix List がサポートされたので、CloudFront を経由しない想定外のアクセスを簡単にブロックできるようになりました。
使い方は簡単でセキュリティグループのソースにManaged Prefix ListのIDを指定してあげるだけです。
リージョン毎にIDは異なるのでちょっと調べないとダメですがカスタムヘッダを付与する方法に比べてめちゃくちゃ楽ちんになりました。
この手法は現在ではデファクトになってるんじゃないかなと思います。
Managed Prefix Listは、CloudFrontからの接続であればたとえ別アカウントのものでも許可する
さて、このManaged Plefix Listが出てからオリジンのアクセス制限は随分楽になったと思ったのですが、よーーーーく考えてみると、Managed Plefix Listに書かれているCloudFrontのIPはリージョン毎で固定です。つまり「CloudFrontからのアクセスからに制限する」=「CloudFrontからのアクセスであればどこの物でも許可する」という事に気づいたのでした。
つまり自分が作ったものでは無い、全然知らないAWSアカウントのCloudFrontであっても許可しちゃうわけですね。こんな感じで悪意ある人がバイパスしてアクセスする抜け道がある事に気づきました。
結論!
特にCloudFrontに付与したAWS WAFにてセキュリティを担保している環境においてはManaged Plefix List に加えて、これまでのカスタムヘッダーによる制限も入れておくのが吉です。
しかし例外として、
・CloudFrontにて代替ドメイン名(独自ドメイン)を利用している
・CloudFront <-> オリジン をhttps(443)の接続としている
・オリジンリクエストポリシーでHostヘッダーをオリジンに転送している
という状況の場合ですとCloudFrontはオリジンのSSL証明書エラーが出ればたとえ暗号化はできていても502を返しますので問題は発生しません。
…ですが、まぁ基本的にManaged Plefix Listと並行してカスタムヘッダもつけてオリジンで検証した方が安心ですね。
CloudFrontはCDNなので、これまで「オリジン直接接続されえたらキャッシュ返らないじゃーん」くらいでよかったのですが、AWS WAFなどでセキュリティやアクセス制限を担保したり、無料SSL(ACM)を使いたいために導入、なんて事が多くなった最近だと、プレフィックスリストだけで制限してる場合は少し問題となるかもしれませんので再度見直しをおすすめします。
それでは!