Database JUNKY

MySQL,MariaDBを中心としたブログです

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版

Amazon Web Services パターン別構築・運用ガイド 改訂第2版

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の評価の順番は(おそらく)上から下に評価されていると思いますので、 まず、

  1. アクセスしているドメインは、(www.abc.abcもしくは、www2.abc.abc)の場合は、通常アクセス

  2. それ以外は、リターンコード444を返しますよ

といった具合に制御してます。

これで一安心と思いきや・・・

f:id:hit10231023:20190317214033j:plain

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でのチェックなわけですね。これを変更します

f:id:hit10231023:20190317215512j:plain

変更後のヘルスチェック設定

編集画面でポートを上書きに選択して、9000と入力しました。

f:id:hit10231023:20190317215903j:plain

これで設定してしばらく待ちます・・

結果

無事にステータスが、healthyに変わりました!よかった。

f:id:hit10231023:20190317220204j:plain

念のため、ログも確認しました。上記の指定で、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のステータスが戻って来ていることを確認いたしました。

しばらくこれで様子を見ていきたいと思いますが、、もっとスマートな方法があるんだろうな?と思いつつ、どなたかアドバイスをお願いします・・・

f:id:hit10231023:20190317214858j:plain