#概要
CloudFront -> ELB -> EC2(Apache httpd) の構成で、インターネットから直接のELBへのアクセスを拒否したい。全てのウェブアクセスはCloudFront経由に限定したい。
##案0 ELBの待ち受けポートをデフォルト以外のものにする
CloudFrontとELBの設定さえ合致していれば、ELBは必ずしも443や80ポートでリッスンする必要はない。デフォルトでないポートに変えるだけでボットなどの変なアクセスがほとんど来なくなる。ただしこれはアクセス制限でも何でもないため、他の案と併用するのが良い。
##案1 ELBのセキュリティグループでCloudFrontのグローバルIPアドレスを指定する
CloudFrontのグローバルIPはJSONで公開されている。これをもとにCloudFrontのグローバルIPを許可するセキュリティグループをELBにアタッチすればアクセス制限が可能。ただしこのグローバルIPはわりと頻繁に変更が発生する。グローバルIPの変更イベントはSNSで受信することができるため、このイベントをトリガーにLambdaをキックしてセキュリティグループを動的に変更すれば対応できなくもないが、面倒だし変更イベント発生時のタイムラグも気になる。
##案2 CloudFrontのカスタムヘッダをapacheがチェックする
これ系の話題はクラスメソッドさんのブログですでに網羅されていますよね。。
CloudFront側でカスタムヘッダを付加し、apache側でカスタムヘッダの項目と値が一致することを確認。一致しなかったらアクセスを拒否する。
##案3 ELBのWAFがCloudFrontのカスタムヘッダをチェックする
案2と仕組みは同じ。WAFのちょっとした追加コストが許容されるのなら案2よりこちらが良い。案2だとec2までリクエストが届いた上で拒否するが、この案だとec2までリクエストは届かない。(細かい話をすると案3はelbまではリクエストが到達する。案1だとelbにも到達しない)