BigW Consortium Gitlab
Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gitlab-ce
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Forest Godfrey
gitlab-ce
Commits
18521584
Commit
18521584
authored
Jul 03, 2017
by
Pawel Chojnacki
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove the need to use health check token
in favor of whitelist that will be used to control the access to monitoring resources
parent
5af1fcd6
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
73 additions
and
51 deletions
+73
-51
requires_whitelisted_monitoring_client.rb
...ollers/concerns/requires_whitelisted_monitoring_client.rb
+6
-11
health_check_controller.rb
app/controllers/health_check_controller.rb
+1
-1
health_controller.rb
app/controllers/health_controller.rb
+1
-1
metrics_controller.rb
app/controllers/metrics_controller.rb
+2
-2
gitlab.yml.example
config/gitlab.yml.example
+6
-0
1_settings.rb
config/initializers/1_settings.rb
+7
-0
health_check_controller_spec.rb
spec/controllers/health_check_controller_spec.rb
+23
-25
health_controller_spec.rb
spec/controllers/health_controller_spec.rb
+17
-7
metrics_controller_spec.rb
spec/controllers/metrics_controller_spec.rb
+10
-4
No files found.
app/controllers/concerns/requires_
health_token
.rb
→
app/controllers/concerns/requires_
whitelisted_monitoring_client
.rb
View file @
18521584
module
Requires
HealthToken
module
Requires
WhitelistedMonitoringClient
extend
ActiveSupport
::
Concern
included
do
before_action
:validate_
health_check_access
!
before_action
:validate_
ip_whitelisted
!
end
private
def
validate_
health_check_access
!
render_404
unless
token_vali
d?
def
validate_
ip_whitelisted
!
render_404
unless
client_ip_whiteliste
d?
end
def
token_valid?
token
=
params
[
:token
].
presence
||
request
.
headers
[
'TOKEN'
]
token
.
present?
&&
ActiveSupport
::
SecurityUtils
.
variable_size_secure_compare
(
token
,
current_application_settings
.
health_check_access_token
)
def
client_ip_whitelisted?
Settings
.
monitoring
.
ip_whitelist
.
any?
{
|
e
|
e
.
include?
(
Gitlab
::
RequestContext
.
client_ip
)
}
end
def
render_404
...
...
app/controllers/health_check_controller.rb
View file @
18521584
class
HealthCheckController
<
HealthCheck
::
HealthCheckController
include
Requires
HealthToken
include
Requires
WhitelistedMonitoringClient
end
app/controllers/health_controller.rb
View file @
18521584
class
HealthController
<
ActionController
::
Base
protect_from_forgery
with: :exception
include
Requires
HealthToken
include
Requires
WhitelistedMonitoringClient
CHECKS
=
[
Gitlab
::
HealthChecks
::
DbCheck
,
...
...
app/controllers/metrics_controller.rb
View file @
18521584
class
MetricsController
<
ActionController
::
Base
include
Requires
HealthToken
include
Requires
WhitelistedMonitoringClient
protect_from_forgery
with: :exception
before_action
:validate_prometheus_metrics
def
index
render
text:
metrics_service
.
metrics_text
,
content_type:
'text/plain; vers
s
ion=0.0.4'
render
text:
metrics_service
.
metrics_text
,
content_type:
'text/plain; version=0.0.4'
end
private
...
...
config/gitlab.yml.example
View file @
18521584
...
...
@@ -548,6 +548,12 @@ production: &base
# unicorn_sampler_interval: 10
## Monitoring
# Built in monitoring settings
monitoring:
# IP whitelist to access monitoring endpoints
access_whitelist: 127.0.0.0/8
#
# 5. Extra customization
# ==========================
...
...
config/initializers/1_settings.rb
View file @
18521584
...
...
@@ -495,6 +495,13 @@ Settings.webpack.dev_server['host'] ||= 'localhost'
Settings
.
webpack
.
dev_server
[
'port'
]
||=
3808
#
# Monitoring settings
#
Settings
[
'monitoring'
]
||=
Settingslogic
.
new
({})
Settings
.
monitoring
[
'ip_whitelist'
]
||=
%w{127.0.0.1/8}
Settings
.
monitoring
.
ip_whitelist
.
map!
(
&
IPAddr
.
method
(
:new
))
#
# Prometheus metrics settings
#
Settings
[
'prometheus'
]
||=
Settingslogic
.
new
({})
...
...
spec/controllers/health_check_controller_spec.rb
View file @
18521584
...
...
@@ -3,52 +3,57 @@ require 'spec_helper'
describe
HealthCheckController
do
include
StubENV
let
(
:token
)
{
current_application_settings
.
health_check_access_token
}
let
(
:json_response
)
{
JSON
.
parse
(
response
.
body
)
}
let
(
:xml_response
)
{
Hash
.
from_xml
(
response
.
body
)[
'hash'
]
}
let
(
:whitelisted_ip
)
{
'127.0.0.1'
}
let
(
:not_whitelisted_ip
)
{
'127.0.0.2'
}
before
do
allow
(
Settings
.
monitoring
).
to
receive
(
:ip_whitelist
).
and_return
([
IPAddr
.
new
(
whitelisted_ip
)])
stub_env
(
'IN_MEMORY_APPLICATION_SETTINGS'
,
'false'
)
end
describe
'GET #index'
do
context
'when services are up but NO access token'
do
context
'when services are up but accessed from outside whitelisted ips'
do
before
do
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
not_whitelisted_ip
)
end
it
'returns a not found page'
do
get
:index
expect
(
response
).
to
be_not_found
end
end
context
'when services are up and an access token is provided'
do
it
'supports passing the token in the header'
do
request
.
headers
[
'TOKEN'
]
=
token
get
:index
expect
(
response
).
to
be_success
expect
(
response
.
content_type
).
to
eq
'text/plain'
context
'when services are up and accessed from whitelisted ips'
do
let
(
:ip
)
{
'127.0.0.1'
}
before
do
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
whitelisted_ip
)
end
it
'supports successful plaintest response'
do
get
:index
,
token:
token
get
:index
expect
(
response
).
to
be_success
expect
(
response
.
content_type
).
to
eq
'text/plain'
end
it
'supports successful json response'
do
get
:index
,
token:
token
,
format: :json
get
:index
,
format: :json
expect
(
response
).
to
be_success
expect
(
response
.
content_type
).
to
eq
'application/json'
expect
(
json_response
[
'healthy'
]).
to
be
true
end
it
'supports successful xml response'
do
get
:index
,
token:
token
,
format: :xml
get
:index
,
format: :xml
expect
(
response
).
to
be_success
expect
(
response
.
content_type
).
to
eq
'application/xml'
expect
(
xml_response
[
'healthy'
]).
to
be
true
end
it
'supports successful responses for specific checks'
do
get
:index
,
token:
token
,
checks:
'email'
,
format: :json
get
:index
,
checks:
'email'
,
format: :json
expect
(
response
).
to
be_success
expect
(
response
.
content_type
).
to
eq
'application/json'
expect
(
json_response
[
'healthy'
]).
to
be
true
...
...
@@ -62,29 +67,22 @@ describe HealthCheckController do
end
end
context
'when a service is down and an
access token is provided
'
do
context
'when a service is down and an
endpoint is accessed from whitelisted ip
'
do
before
do
allow
(
HealthCheck
::
Utils
).
to
receive
(
:process_checks
).
with
([
'standard'
]).
and_return
(
'The server is on fire'
)
allow
(
HealthCheck
::
Utils
).
to
receive
(
:process_checks
).
with
([
'email'
]).
and_return
(
'Email is on fire'
)
end
it
'supports passing the token in the header'
do
request
.
headers
[
'TOKEN'
]
=
token
get
:index
expect
(
response
).
to
have_http_status
(
500
)
expect
(
response
.
content_type
).
to
eq
'text/plain'
expect
(
response
.
body
).
to
include
(
'The server is on fire'
)
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
whitelisted_ip
)
end
it
'supports failure plaintest response'
do
get
:index
,
token:
token
get
:index
expect
(
response
).
to
have_http_status
(
500
)
expect
(
response
.
content_type
).
to
eq
'text/plain'
expect
(
response
.
body
).
to
include
(
'The server is on fire'
)
end
it
'supports failure json response'
do
get
:index
,
token:
token
,
format: :json
get
:index
,
format: :json
expect
(
response
).
to
have_http_status
(
500
)
expect
(
response
.
content_type
).
to
eq
'application/json'
expect
(
json_response
[
'healthy'
]).
to
be
false
...
...
@@ -92,7 +90,7 @@ describe HealthCheckController do
end
it
'supports failure xml response'
do
get
:index
,
token:
token
,
format: :xml
get
:index
,
format: :xml
expect
(
response
).
to
have_http_status
(
500
)
expect
(
response
.
content_type
).
to
eq
'application/xml'
expect
(
xml_response
[
'healthy'
]).
to
be
false
...
...
@@ -100,7 +98,7 @@ describe HealthCheckController do
end
it
'supports failure responses for specific checks'
do
get
:index
,
token:
token
,
checks:
'email'
,
format: :json
get
:index
,
checks:
'email'
,
format: :json
expect
(
response
).
to
have_http_status
(
500
)
expect
(
response
.
content_type
).
to
eq
'application/json'
expect
(
json_response
[
'healthy'
]).
to
be
false
...
...
spec/controllers/health_controller_spec.rb
View file @
18521584
...
...
@@ -3,17 +3,19 @@ require 'spec_helper'
describe
HealthController
do
include
StubENV
let
(
:token
)
{
current_application_settings
.
health_check_access_token
}
let
(
:json_response
)
{
JSON
.
parse
(
response
.
body
)
}
let
(
:whitelisted_ip
)
{
'127.0.0.1'
}
let
(
:not_whitelisted_ip
)
{
'127.0.0.2'
}
before
do
allow
(
Settings
.
monitoring
).
to
receive
(
:ip_whitelist
).
and_return
([
IPAddr
.
new
(
whitelisted_ip
)])
stub_env
(
'IN_MEMORY_APPLICATION_SETTINGS'
,
'false'
)
end
describe
'#readiness'
do
context
'a
uthorization token provided
'
do
context
'a
ccessed from whitelisted ip
'
do
before
do
request
.
headers
[
'TOKEN'
]
=
token
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
whitelisted_ip
)
end
it
'returns proper response'
do
...
...
@@ -25,7 +27,11 @@ describe HealthController do
end
end
context
'without authorization token'
do
context
'accessed from not whitelisted ip'
do
before
do
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
not_whitelisted_ip
)
end
it
'returns proper response'
do
get
:readiness
expect
(
response
.
status
).
to
eq
(
404
)
...
...
@@ -34,9 +40,9 @@ describe HealthController do
end
describe
'#liveness'
do
context
'a
uthorization token provided
'
do
context
'a
ccessed from whitelisted ip
'
do
before
do
request
.
headers
[
'TOKEN'
]
=
token
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
whitelisted_ip
)
end
it
'returns proper response'
do
...
...
@@ -47,7 +53,11 @@ describe HealthController do
end
end
context
'without authorization token'
do
context
'accessed from not whitelisted ip'
do
before
do
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
not_whitelisted_ip
)
end
it
'returns proper response'
do
get
:liveness
expect
(
response
.
status
).
to
eq
(
404
)
...
...
spec/controllers/metrics_controller_spec.rb
View file @
18521584
...
...
@@ -3,20 +3,22 @@ require 'spec_helper'
describe
MetricsController
do
include
StubENV
let
(
:token
)
{
current_application_settings
.
health_check_access_token
}
let
(
:json_response
)
{
JSON
.
parse
(
response
.
body
)
}
let
(
:metrics_multiproc_dir
)
{
Dir
.
mktmpdir
}
let
(
:whitelisted_ip
)
{
'127.0.0.1'
}
let
(
:not_whitelisted_ip
)
{
'127.0.0.2'
}
before
do
stub_env
(
'IN_MEMORY_APPLICATION_SETTINGS'
,
'false'
)
stub_env
(
'prometheus_multiproc_dir'
,
metrics_multiproc_dir
)
allow
(
Gitlab
::
Metrics
).
to
receive
(
:prometheus_metrics_enabled?
).
and_return
(
true
)
allow
(
Settings
.
monitoring
).
to
receive
(
:ip_whitelist
).
and_return
([
IPAddr
.
new
(
whitelisted_ip
)])
end
describe
'#index'
do
context
'a
uthorization token provided
'
do
context
'a
ccessed from whitelisted ip
'
do
before
do
request
.
headers
[
'TOKEN'
]
=
token
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
whitelisted_ip
)
end
it
'returns DB ping metrics'
do
...
...
@@ -59,7 +61,11 @@ describe MetricsController do
end
end
context
'without authorization token'
do
context
'accessed from not whitelisted ip'
do
before
do
allow
(
Gitlab
::
RequestContext
).
to
receive
(
:client_ip
).
and_return
(
not_whitelisted_ip
)
end
it
'returns proper response'
do
get
:index
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment