Block Git HTTP Basic Auth after 10 failed attempts

This commit is contained in:
Jacob Vosmaer 2014-12-15 18:47:26 +01:00
parent 7512016d51
commit 62ea02740d
6 changed files with 66 additions and 2 deletions

View file

@ -1,3 +1,6 @@
v 7.7.0
- Block Git HTTP access after 10 failed authentication attempts
v 7.6.0
- Fork repository to groups
- New rugged version

View file

@ -298,6 +298,17 @@ production: &base
# ![Company Logo](http://www.companydomain.com/logo.png)
# [Learn more about CompanyName](http://www.companydomain.com/)
rack_attack:
git_basic_auth:
# Limit the number of Git HTTP authentication attempts per IP
# maxretry: 10
#
# Reset the auth attempt counter per IP after 60 seconds
# findtime: 60
#
# Ban an IP for one hour (3600s) after too many auth attempts
# bantime: 3600
development:
<<: *base

View file

@ -171,6 +171,15 @@ Settings.satellites['timeout'] ||= 30
#
Settings['extra'] ||= Settingslogic.new({})
#
# Rack::Attack settings
#
Settings['rack_attack'] ||= Settingslogic.new({})
Settings.rack_attack['git_basic_auth'] ||= Settingslogic.new({})
Settings.rack_attack.git_basic_auth['maxretry'] ||= 10
Settings.rack_attack.git_basic_auth['findtime'] ||= 1.minute
Settings.rack_attack.git_basic_auth['bantime'] ||= 1.hour
#
# Testing settings
#

View file

@ -0,0 +1,10 @@
unless Rails.env.test?
Rack::Attack.blacklist('Git HTTP Basic Auth') do |req|
Rack::Attack::Allow2Ban.filter(req.ip, Gitlab.config.rack_attack.git_basic_auth) do
# This block only gets run if the IP was not already banned.
# Return false, meaning that we do not see anything wrong with the
# request at this time
false
end
end
end

View file

@ -0,0 +1,21 @@
# Monkey-patch Redis::Store to make 'setex' and 'expire' work with namespacing
module Gitlab
class Redis
class Store
module Namespace
def setex(key, expires_in, value, options=nil)
namespace(key) { |key| super(key, expires_in, value) }
end
def expire(key, expires_in)
namespace(key) { |key| super(key, expires_in) }
end
end
end
end
end
Redis::Store.class_eval do
include Gitlab::Redis::Store::Namespace
end

View file

@ -72,8 +72,18 @@ module Grack
end
def authenticate_user(login, password)
auth = Gitlab::Auth.new
auth.find(login, password)
user = Gitlab::Auth.new.find(login, password)
return user if user.present?
# At this point, we know the credentials were wrong. We let Rack::Attack
# know there was a failed authentication attempt from this IP
Rack::Attack::Allow2Ban.filter(@request.ip, Gitlab.config.rack_attack.git_basic_auth) do
# Return true, so that Allow2Ban increments the counter (stored in
# Rails.cache) for the IP
true
end
nil # No user was found
end
def authorized_request?