Block Git HTTP Basic Auth after 10 failed attempts
This commit is contained in:
parent
7512016d51
commit
62ea02740d
6 changed files with 66 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
#
|
||||
|
|
10
config/initializers/rack_attack_git_basic_auth.rb
Normal file
10
config/initializers/rack_attack_git_basic_auth.rb
Normal 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
|
21
config/initializers/redis-store-fix-expiry.rb
Normal file
21
config/initializers/redis-store-fix-expiry.rb
Normal 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
|
|
@ -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?
|
||||
|
|
Loading…
Reference in a new issue