Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-04-29 11:20:38 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-04-29 11:20:57 +0300
commit4c4f653296e104566d2dd9a330b460c7ddc8cfc5 (patch)
tree69309f00de031698da9ea139f53e3f78c3ab61f0 /lib
parent7b1c7e980459210bea3f967cbc6b1c797c1ff658 (diff)
Add latest changes from gitlab-org/security/gitlab@14-10-stable-ee
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/auth/request_authenticator.rb7
-rw-r--r--lib/gitlab/metrics/subscribers/rack_attack.rb12
-rw-r--r--lib/gitlab/rack_attack.rb10
-rw-r--r--lib/gitlab/rack_attack/request.rb28
4 files changed, 40 insertions, 17 deletions
diff --git a/lib/gitlab/auth/request_authenticator.rb b/lib/gitlab/auth/request_authenticator.rb
index 0948663b4b3..0d376cdbd2e 100644
--- a/lib/gitlab/auth/request_authenticator.rb
+++ b/lib/gitlab/auth/request_authenticator.rb
@@ -13,6 +13,10 @@ module Gitlab
@request = request
end
+ def find_authenticated_requester(request_formats)
+ user(request_formats) || deploy_token_from_request
+ end
+
def user(request_formats)
request_formats.each do |format|
user = find_sessionless_user(format)
@@ -84,7 +88,8 @@ module Gitlab
def route_authentication_setting
@route_authentication_setting ||= {
job_token_allowed: api_request?,
- basic_auth_personal_access_token: api_request? || git_request?
+ basic_auth_personal_access_token: api_request? || git_request?,
+ deploy_token_allowed: api_request? || git_request?
}
end
diff --git a/lib/gitlab/metrics/subscribers/rack_attack.rb b/lib/gitlab/metrics/subscribers/rack_attack.rb
index d86c0f83c6c..70dcc6fad90 100644
--- a/lib/gitlab/metrics/subscribers/rack_attack.rb
+++ b/lib/gitlab/metrics/subscribers/rack_attack.rb
@@ -73,12 +73,16 @@ module Gitlab
matched: req.env['rack.attack.matched']
}
- if THROTTLES_WITH_USER_INFORMATION.include? req.env['rack.attack.matched'].to_sym
- user_id = req.env['rack.attack.match_discriminator']
- user = User.find_by(id: user_id) # rubocop:disable CodeReuse/ActiveRecord
+ discriminator = req.env['rack.attack.match_discriminator'].to_s
+ discriminator_id = discriminator.split(':').last
- rack_attack_info[:user_id] = user_id
+ if discriminator.starts_with?('user:')
+ user = User.find_by(id: discriminator_id) # rubocop:disable CodeReuse/ActiveRecord
+
+ rack_attack_info[:user_id] = discriminator_id.to_i
rack_attack_info['meta.user'] = user.username unless user.nil?
+ elsif discriminator.starts_with?('deploy_token:')
+ rack_attack_info[:deploy_token_id] = discriminator_id.to_i
end
Gitlab::InstrumentationHelper.add_instrumentation_data(rack_attack_info)
diff --git a/lib/gitlab/rack_attack.rb b/lib/gitlab/rack_attack.rb
index 3f4c0fa45aa..b2664f87306 100644
--- a/lib/gitlab/rack_attack.rb
+++ b/lib/gitlab/rack_attack.rb
@@ -95,7 +95,7 @@ module Gitlab
authenticated_options = Gitlab::Throttle.options(throttle, authenticated: true)
throttle_or_track(rack_attack, "throttle_authenticated_#{throttle}", authenticated_options) do |req|
if req.throttle?(throttle, authenticated: true)
- req.throttled_user_id([:api])
+ req.throttled_identifer([:api])
end
end
end
@@ -117,7 +117,7 @@ module Gitlab
throttle_or_track(rack_attack, 'throttle_authenticated_web', Gitlab::Throttle.authenticated_web_options) do |req|
if req.throttle_authenticated_web?
- req.throttled_user_id([:api, :rss, :ics])
+ req.throttled_identifer([:api, :rss, :ics])
end
end
@@ -129,19 +129,19 @@ module Gitlab
throttle_or_track(rack_attack, 'throttle_authenticated_protected_paths_api', Gitlab::Throttle.protected_paths_options) do |req|
if req.throttle_authenticated_protected_paths_api?
- req.throttled_user_id([:api])
+ req.throttled_identifer([:api])
end
end
throttle_or_track(rack_attack, 'throttle_authenticated_protected_paths_web', Gitlab::Throttle.protected_paths_options) do |req|
if req.throttle_authenticated_protected_paths_web?
- req.throttled_user_id([:api, :rss, :ics])
+ req.throttled_identifer([:api, :rss, :ics])
end
end
throttle_or_track(rack_attack, 'throttle_authenticated_git_lfs', Gitlab::Throttle.throttle_authenticated_git_lfs_options) do |req|
if req.throttle_authenticated_git_lfs?
- req.throttled_user_id([:api])
+ req.throttled_identifer([:api])
end
end
diff --git a/lib/gitlab/rack_attack/request.rb b/lib/gitlab/rack_attack/request.rb
index b24afd28dd7..08a5ddb6ad1 100644
--- a/lib/gitlab/rack_attack/request.rb
+++ b/lib/gitlab/rack_attack/request.rb
@@ -9,18 +9,22 @@ module Gitlab
GROUP_PATH_REGEX = %r{^/api/v\d+/groups/[^/]+/?$}.freeze
def unauthenticated?
- !(authenticated_user_id([:api, :rss, :ics]) || authenticated_runner_id)
+ !(authenticated_identifier([:api, :rss, :ics]) || authenticated_runner_id)
end
- def throttled_user_id(request_formats)
- user_id = authenticated_user_id(request_formats)
+ def throttled_identifer(request_formats)
+ identifier = authenticated_identifier(request_formats)
+ return unless identifier
- if Gitlab::RackAttack.user_allowlist.include?(user_id)
+ identifier_type = identifier[:identifier_type]
+ identifier_id = identifier[:identifier_id]
+
+ if identifier_type == :user && Gitlab::RackAttack.user_allowlist.include?(identifier_id)
Gitlab::Instrumentation::Throttle.safelist = 'throttle_user_allowlist'
return
end
- user_id
+ "#{identifier_type}:#{identifier_id}"
end
def authenticated_runner_id
@@ -169,8 +173,18 @@ module Gitlab
private
- def authenticated_user_id(request_formats)
- request_authenticator.user(request_formats)&.id
+ def authenticated_identifier(request_formats)
+ requester = request_authenticator.find_authenticated_requester(request_formats)
+
+ return unless requester
+
+ identifier_type = if requester.is_a?(DeployToken)
+ :deploy_token
+ else
+ :user
+ end
+
+ { identifier_type: identifier_type, identifier_id: requester.id }
end
def request_authenticator