LoginSignup
6
6

More than 5 years have passed since last update.

CloudFront+ELB+EC2(nginx)で接続元による拒否設定

Last updated at Posted at 2016-03-15

よくあるCloudFront+ELB+EC2の環境で海外のIPから攻撃をうけてしまった。
SecurityGroupで拒否設定をしようと思ったら
接続元が全部CloudFrontなので上手く拒否設定が出来ず
やむなくEC2のnginxで設定することに。

↓こういうところを参考にさせて頂いたけど、x_forwarded_forに入るClientIPの順番が違って、少し困ったのでメモ。
http://takeyuweb.hatenablog.com/entry/elb_ec2_nginx_ip
http://blog.suz-lab.com/2011/06/x-forwarded-forhttpelb.html

方法1

海外からのアクセスなんていらないや、とか
南アフリカからのアクセスとかないよね!?いらないよね!?
というサービスであれば、CloudFrontのgeo-restrictionを使えばよい。

方法2

AWS WAFを使う
https://aws.amazon.com/jp/waf/
セキュリティちゃんとしようと思ったら、予算とって
こういうのちゃんと使うほうがいいと思う。

方法3

国内からの攻撃だったり国別で拒否は出来ないよ、、お金も無いよ、という時。
EC2(nginx)側で制限を実施。

前提

1 拒否したい接続元を指定

# vi /etc/nginx/deny_ip
# cat /etc/nginx/deny_ip
map $http_x_forwarded_for $deny {
    default 0;
    ~^111\.222\.111\.222,\s 1;
}

map XXX $YYY : XXXに対して{}の条件で$YYYに変数をセット
default 0 : 何もなければ変数は0
~ : 正規表現で指定するよって宣言
^111.222.111.222,\s : マッチさせる正規表現部分
1 : 正規表現にマッチしたものは変数1にセット

なので、この場合はhttp_x_forwarded_forの行頭に
111.222.111.222,スペース があったときに$denyに1をセットすることになる

2 拒否

  • 全体で拒否したい時
+include /etc/nginx/deny_ip;
server {
    listen      80 default;
    server_name www.example.com;
    index       index.html index.htm

+   if ( $deny = "1" ) {
+       return 403;
+   }

    location = / {
        root        /var/www/html;
    }
  • 特定ディレクトリのみ拒否したい時
+include /etc/nginx/deny_ip;
server {
    listen      80 default;
    server_name www.example.com;
    index       index.html index.htm

    location = /admin {
+       if ( $deny = "1" ) {
+           return 403;
+       }
        root        /var/www/html;
    }

無事403へ落とすことが出来ました。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6