よくある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)側で制限を実施。
前提
- nginx では Realip Module が使えるようになっていること
http://nginx.org/en/docs/http/ngx_http_realip_module.html - nginx では HttpMapModule が使えるようになっていること
http://nginx.org/en/docs/http/ngx_http_map_module.html
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へ落とすことが出来ました。