如何保持你的Rails日志没有不必要的噪音

118 阅读2分钟

我喜欢使用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-adminwp-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异常。