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

artone · 2016年11月08日 · 最后由 onehourzhan 回复于 2021年08月29日 · 7850 次阅读

因为收到 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 看不来到底是哪个站被攻击,我该怎么进一步得知?

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

第一个问题:

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;

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

登录加验证码。

iptables 里面加限制吧。

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

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

发现个有意义的补充: 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 谢谢!

两套 WordPress 建立专业网站视频教程 (一步步建站,一步也不少)

在互联网发达的时代,网站搭建已经是非常的容易简单,无需任何代码知识,无需聘请人做,就算是新手,也可以用一个小时来完成一个专业网站。建站三要素是域名 (网站的网址),主机空间 (存储文件,发布互联网) 和网站建设系统 (WordPress)。那么对于新手来讲怎样快速搭建一个网站呢?这里小编以知名的 US Domain Center 和 WordPress 主机演示如何快速搭建 WordPress 网站,一步步建站,一步也不少。

简单说,你只需购买一个域名和主机,然后就可以在 US Domain Center 一键免费安装 WordPress 建站系统,再一键免费安装网站的主题模板,然后添加内容,就可以快速完成网站。

域名注册:http://www.usdomaincenter.com/

选择主机:http://www.usdomaincenter.com/products/cpanel

最新 WordPress 建站课程:用 WordPress 建立专业网站视频教程 (一步步建站,一步也不少):

高端网站制作教程,如何从零开始用 WordPress 搭建专业网站中文建站教学,一步步从新手变成高手做各种网站:

US Domain Center 提供一键免费安装 WordPress 和一键免费备份网站功能,特别适合新手朋友搭建属于自己的网站。现在 US Domain Center 网站有很多语言,包括中文,所以很多人购买和使用 US Domain Center 主机都比较方便,并且支持 AliPay 支付宝,Credit Cards 信用卡,PayPal 贝宝和所有国家的货币。同时,对于很多新手站长来说,US Domain Center 主机的一键免费安装功能安装 WordPress 程序是非常吸引的。

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