AWS ELB&NginxでIPアドレス直指定アクセスを拒否する方法でハマった・・どうやるんだろう?
AWS ELB(ALB)でIPアドレス直指定アクセスを禁止する方法ですが。。 例えば、www.abc.abcというドメインのELBの111.222.333.444だったとして、http://www.abc.abc にはアクセスを許可したいけど、http://111.222.333.444はアクセスを拒否したいなんてことないですか? すこし例が悪いですが、逆に、111.222.333.444のIPは、www.abc.abcと、www2.abc.abcという2つのドメインを持っている場合で、IPアドレスでのアクセスは拒否して、そのほかドメインの指定は、アクセスを許可したいという場合は、ELBでどのように設定すれば良いのでしょうか?
それは・・・
ELBの設定ではわかりませんでした(汗) 誰か教えてください
というわけで、ELBというより、ターゲットホストのnginxでそれを制御する方法をメモしました。
Amazon Web Services パターン別構築・運用ガイド 改訂第2版
- 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/03/23
- メディア: Kindle版
- この商品を含むブログを見る
nginxでIP直指定のアクセスを禁止する!
結局nginxのserver_nameで設定でこれを実現しました。server_name *.abc.abc (ワイルドカード指定)を設定した後に、server_name _;を指定しているのがわかるかと思います
server { listen 80; server_name *.abc.abc; root /var/www/html; access_log /var/log/nginx/access.log main; } server { listen 80 default_server; server_name _; return 444; }
nginxの評価の順番は(おそらく)上から下に評価されていると思いますので、 まず、
アクセスしているドメインは、(www.abc.abcもしくは、www2.abc.abc)の場合は、通常アクセス
それ以外は、リターンコード444を返しますよ
といった具合に制御してます。
これで一安心と思いきや・・・
ELBのターゲットグループのヘルスチェックのステータスが、unhealthyになっているじゃないですか!なんで!? というわけで、nginxのアクセスログを確認したところ。。
10.0.0.149 - - [17/Mar/2019:10:53:52 +0000] "GET /HTTP/1.1" 444 0 "-" "ELB-HealthChecker/2.0" 10.0.100.233 - - [17/Mar/2019:10:54:18 +0000] "GET /HTTP/1.1" 444 0 "-" "ELB-HealthChecker/2.0" 10.0.0.149 - - [17/Mar/2019:10:54:22 +0000] "GET /HTTP/1.1" 444 0 "-" "ELB-HealthChecker/2.0" 10.0.100.233 - - [17/Mar/2019:10:54:48 +0000] "GET /HTTP/1.1" 444 0 "-" "ELB-HealthChecker/2.0"
なんか、先ほど設定した、444という結果が戻って来ているーー汗
冷静になって考えてみると、ELB-HealthCheckerは、ターゲットホストのヘルスチェックにipで指定してくるんですね(汗) ってなわけで、ヘルスチェック用に新しいポートをnginxに指定しました。
server { listen 9000; server_name _; root /var/www/html; access_log /var/log/nginx/healthy.log main; } server { listen 80; server_name *.abc.abc; root /var/www/html; access_log /var/log/nginx/access.log main; } server { listen 80 default_server; server_name _; return 444; }
また、通常のnginxのアクセスログの中に、ELB-HealthCheckerが入るのも鬱陶しかったので、healthy.log というファイルに出力するように変更しました
ELBのヘルスチェック設定の変更
ポート 9000番はヘルスチェック専用のポートにしたので、ELB側の設定も変更しなかればいけません。
変更前のヘルスチェック設定
ポートが、トラフィックポートになっています。つまり、ポート80でのチェックなわけですね。これを変更します
変更後のヘルスチェック設定
編集画面でポートを上書きに選択して、9000と入力しました。
これで設定してしばらく待ちます・・
結果
無事にステータスが、healthyに変わりました!よかった。
念のため、ログも確認しました。上記の指定で、healthy.logというログファイルを設定しておりますので、その中身を確認します
10.0.100.233 - - [17/Mar/2019:12:59:23 +0000] "GET /HTTP/1.1" 200 15 "-" "ELB-HealthChecker/2.0" "-" 10.0.0.149 - - [17/Mar/2019:12:59:27 +0000] "GET /HTTP/1.1" 200 15 "-" "ELB-HealthChecker/2.0" "-" 10.0.100.233 - - [17/Mar/2019:12:59:53 +0000] "GET /HTTP/1.1" 200 15 "-" "ELB-HealthChecker/2.0" "-"
無事に、200のステータスが戻って来ていることを確認いたしました。
しばらくこれで様子を見ていきたいと思いますが、、もっとスマートな方法があるんだろうな?と思いつつ、どなたかアドバイスをお願いします・・・