我喜欢使用Rollbar'的默认计划,用于小型应用程序或原型的wip。在我的收件箱中获得生产异常可能相当有用,但其中大多数实际上是404 - 当然,有许多方法可以过滤掉噪音(Fail2Ban ,手写的IPTables规则 ,等等)。
这里的主要想法是通过足够简单的改变来过滤Rails日志中的噪音--安全是一个完全不同的话题(尽管一些工具也触及了这个领域)。
nginx
我观察到的第一件事是,我的应用程序是通过IP而不是域名被扫描的--所以首先要做的是修改nginx的配置,使其只通过应用程序的主机进行响应:
server {
listen 80;
server_name {the-ip-address};
return 404;
}
我不太确定我应该使用404还是403--Not Found听起来很正确,因为人们不应该通过它的IP访问应用程序,但Forbidden也同样合适--资源在这里,但你不能通过服务器的IP访问它。
这个单一的配置变化减少了每天大约200个假请求的日志噪音--这相当不错。
Rack::Attack
下一站:自动扫描WordPress的漏洞--很多很多对wp-admin 和wp-login 的请求--真是惨不忍睹。
我们怎样才能解决这个问题呢?我们在应用层面上,即Rack。
这个想法很简单:在链的前面放一个Rack中间件,可以直接放弃所有那些讨厌的WP扫描。Rack::Attack
安装很简单:将gem添加到你的Gemfile中,创建一个类似于/config/initialisers/rack_attact.rb 的配置文件并添加:
# After 1 blocked requests in 10 minutes, block all requests from that IP for 1 day.
Rack::Attack.blocklist('fail2ban pentesters') do |req|
# `filter` returns truthy value if request fails, or if it's from a previously banned IP so the request is blocked
Rack::Attack::Fail2Ban.filter(
"pentesters-#{req.ip}",
maxretry: 1,
findtime: 10.minutes,
bantime: 1.day
) do
# The count for the IP is incremented if the return value is truthy
req.path.include?('wp-admin') ||
req.path.include?('wp-login')
end
end
任何对/{wp-admin | wp-login} 的请求都将转化为对该IP的一天即时禁止。很明显,你可以用Fail2Ban来做这件事,但Rack::Attack ,它也有其他的好处,,而且它能勾选简单的复选框,同时比Fail2Ban更便携。
最后一步是通过在config.ru中预置这个中间件来实际使用它:
require ::File.expand_path('../config/environment', __FILE__)
use Rack::Attack
run YourApp::Application
为什么是在config.ru而不是在Rails的配置文件中?主要是因为语义问题--它与应用程序的业务逻辑无关,而且它明确了这是通过nginx的请求所遇到的第一个Rack中间件。
在所有这些设置之后--对"/wp-admin "的简单请求将导致一个403的禁止信息和一天的禁止。
结论
之前:220到240- 404异常/天
之后:10个或更少- 404例外/天
而这并没有完全关闭404异常。