安全 如何正确阻挡有人不断尝试登入?

artone · 发布于 2016年11月08日 · 最后由 Peter 回复于 2016年11月15日 · 1149 次阅读
3417

因为收到 CloudWatch 通知我主机 CPU 使用率超过 80%,上去一看发现有人正在尝试暴力登入。

先貼 log:
54.182.204.56 - - [08/Nov/2016:10:16:21 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:21 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:21 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:22 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:22 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:22 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:22 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:22 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:23 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:23 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"
54.182.204.56 - - [08/Nov/2016:10:16:23 +0800] "POST /wp-login.php HTTP/1.1" 200 3656 "-" "Amazon CloudFront"

只取其中一段,因为其他都是一样的。

我自己的分析:
  • 从 log 来看有人不断想要尝试登入我主机上的某个 WordPress 站,而且是透过破解程式自动化执行。
  • 我的主机上有很多个 WordPress 站点,有的有透过 CDN(CloudFront)加速,从 log 看来是有用 CDN 的 WordPress 之一。
  • log 上只看得出来他想尝试登入 WordPress,但是看不出来到底是想尝试登入哪个站。
我的主机架構:
  • 主機 Nginx
  • 有的 WordPress 站有用 CDN 有的没有,CDN 是 CloudFront
我目前的作法:

目前用 iptables 把该 IP 挡掉了,Nginx 的 access.log 立即停止出现登入尝试:

$ sudo iptables -A INPUT -s 54.182.204.56 -j DROP
想讨论的问题:
  • 我查了一下该 IP 似乎是 CloudFront 的 IP,显然这样是错的;我应该是阻挡攻击者,而不是挡 CDN 的 IP,请教该如何正确阻挡?
  • 从 log 看不来到底是哪个站被攻击,我该怎么进一步得知?

以上两个问题请教贤达,先谢谢各位!

共收到 8 条回复
De6df3

第一个问题:

Nginx 得先得到 RealIP 并打到日志中。

第二个,修改 Nginx access_log 的 log_format 增加 $host

log_format my_log '$http_x_forwarded_for - $remote_user [$time_local] "$host" "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" $request_time';
access_log /var/log/nginx/access.log my_log;
3417

@huacnlee 谢谢提供的资料,我来研究一下!

17365

登录加验证码。

96

iptables里面加限制吧。

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
4597

可以记录IP,然后限制同一IP在一定时间段内的登录频率,比如一分钟不超过3次、一小时不超过10次,对于超过的IP予以限制,比如停止服务1小时,对于屡教不改的IP,自动加入IPTable禁止访问。

1553

发现个有意义的补充: http://jessewolgamott.com/blog/2015/11/17/when-fake-googlebots-attack-your-rails-app/

另外 有个问题,当超过访问限制后会有个出错信息:Retry later

https://github.com/kickstarter/rack-attack/blob/8936cc647ac2d310b3cb49fc50fac87486795aff/lib/rack/attack.rb#L128

不知道这个 Retry later 怎么能定制一下,重新定义 @throttled_response

@zhang_soledad @Rei 谢谢!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册