Make組ブログ

Python、Webサービスや製品開発、ライブラリー開発についてhirokikyが書きます

Amazon ELB + EC2 環境で EC2 に直接アクセスしないよう nginx を設定する

Amazon ELB + EC2 環境で EC2 に直接アクセスしなよう nginx を設定する。

想定するのは ELB にドメイン名を設定して、それを介して EC2 上インスタンスにアクセスするような状態。
その場合、 EC2 (https?://ec2-.*\.amazonaws.com) に直接アクセスされると困る。
とくに ELB で HTTPS の設定をしている状態だと余計にそう。

nginx の設定

if ($http_x_forwarded_proto = "") { return 403; }

を入れてやる。

ELB を介さずアクセスがあれば $http_x_forwarded_proto は空になる。なので空のときは 403 を返す。
403 は「リクエストの実行拒否」なのでステータスコードとしては正しい。 (403 は「アクセス権がない」という意味だと思ってたけど、もう少し広い意味を持っているよう)

X-Forwarded-Proto ヘッダについて

この $http_x_forwarded_proto は X-Forwarded-Proto というヘッダと対応する変数。
X-Forwarded-Proto は ELB (というかロードバランサ) が付与するもので、プロトコル (http か https) が適宜が設定される。
このヘッダが無い==$http_x_forwarded_proto が空ということなので、この変数をみれば ELB を介したアクセスかどうかがわかるというわけ。

IP アドレスでは対応できない

ELB はインスタンスが立ち上がったり落ちたりを繰り返しているようで、 IP アドレスによる指定ができない。もし IP アドレスが固定であれば、例えば Ubuntu なら ufw などで設定してやればいいんだけど、それができない。iptables などならドメイン名によってアクセスを細かく設定できるかもしれないけど、いかんせん面倒。