【问题标题】:rack-attack doesn't blacklists any iprack-attack 不会将任何 ip 列入黑名单
【发布时间】:2016-01-31 16:14:10
【问题描述】:

这是我与rack-attack 的第一次互动,因此请随时指出我在代码中可能存在的任何错误。 我正在尝试将那些试图访问"/azenv.php", "/setup.php" etc.. 之类的路由的ip 列入黑名单,因为这些人经常使用一些随机的.php url 并可能试图关闭服务器,我认为这可能是一个好开始阻止它们的想法,但显然机架攻击并没有阻止任何尝试访问上述网址的ip

我要运行的代码块是:

class Rack::Attack

  Rack::Attack.whitelist('allow from localhost') do |req|
  # Requests are allowed if the return value is truthy
  '127.0.0.1' == req.ip || '::1' == req.ip || '122.166.130.230' == req.ip
  end

  Rack::Attack.blacklist("Block Referrer Analytics Spam") do |request|
    spammerList = ENV.has_key?("spammerList") ? ENV["spammerList"].split(',') : []
    spammerList.find { |spammer| request.referer =~ %r{#{spammer}} }
  end

  Rack::Attack.blacklist('bad_login_ip') do |req|
   (req.post? && req.path == "/users/sign_in" && IPCat.datacenter?(req.ip))
  end

  Rack::Attack.blacklist('Stupid IP for PHP') do |req|
    if req.path == "/azenv.php" || req.path == "/testproxy.php" || req.path == "//web/scripts/setup.php"
      req.ip
    end
    # req.path.include?(".php")
  end

  Rack::Attack.throttle('req/ip', limit: 300, period: 5.minutes) do |req|
    req.remote_ip if ['/assets', '/check'].any? {|path| req.path.starts_with? path }
  end

  Rack::Attack.throttle('req/ip', :limit => 5, :period => 20.seconds) do |req|
    if req.path == '/users/sign_in' && req.post?
      req.ip
    end
  end

  Rack::Attack.throttle("logins/email", :limit => 5, :period => 20.seconds) do |req|
    if req.path == '/users/sign_in' && req.post?
      # return the email if present, nil otherwise
      req.params['email'].presence
    end
  end
end

很少有块来自他们的 wiki 本身。如果这里有任何问题,请更正。

更新

这是我在给定示例中尝试的一段代码:

Rack::Attack.blacklist('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 => 5.minutes) do
      # The count for the IP is incremented if the return value is truthy
      req.path.include?('/testproxy.php') ||
      req.path.include?('azenv.php') 

    end
  end

【问题讨论】:

  • 你想要fail2ban而不是黑名单吗?
  • @FrederickCheung 没试过,你能给我举个例子吗
  • 他们在机架攻击自述文件中
  • @FrederickCheung 是的,我已经尝试过这些示例,但由于某种原因它无法正常工作。顺便说一句,谢谢。

标签: ruby-on-rails security rack-middleware rackattack


【解决方案1】:

@abhinay 您能否澄清一下您希望阻止哪些请求成功?

如果你想阻止来自一个已经发出几个 PHP 请求的 IP 地址的所有请求,你需要一个 Fail2Ban,就像@frederickcheung 建议的那样。

自述文件和 wiki 都有示例。

【讨论】:

  • 只需使用 Fail2Ban 示例中的代码更新问题,但不幸的是这也不起作用。
  • 另外,我想了解为什么代码Rack::Attack.blacklist('Stupid IP for PHP') do.. 中的第四块不起作用,如果它只需要一个true 值才能继续。如果我错了,请纠正我
【解决方案2】:

您是否尝试将环境变量移出块,

例如:

  spammerList = ENV.has_key?("spammerList") ? ENV["spammerList"].split(',') : []

  Rack::Attack.blacklist("Block Referrer Analytics Spam") do |request|
    spammerList.find { |spammer| request.referer =~ %r{#{spammer}} }
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多