Commit 460fc6c4 authored by Connor Shea's avatar Connor Shea

Document the CSP file.

parent b2752c46
require 'gitlab/current_settings' require 'gitlab/current_settings'
include Gitlab::CurrentSettings include Gitlab::CurrentSettings
# If Sentry is enabled and the Rails app is running in production mode,
# this will construct the Report URI for Sentry.
if Rails.env.production? && current_application_settings.sentry_enabled if Rails.env.production? && current_application_settings.sentry_enabled
uri = URI.parse(current_application_settings.sentry_dsn) uri = URI.parse(current_application_settings.sentry_dsn)
CSP_REPORT_URI = "#{uri.scheme}://#{uri.host}/api#{uri.path}/csp-report/?sentry_key=#{uri.user}" CSP_REPORT_URI = "#{uri.scheme}://#{uri.host}/api#{uri.path}/csp-report/?sentry_key=#{uri.user}"
...@@ -8,14 +10,20 @@ else ...@@ -8,14 +10,20 @@ else
CSP_REPORT_URI = '' CSP_REPORT_URI = ''
end end
# Content Security Policy Headers
# For more information on CSP see:
# - https://gitlab.com/gitlab-org/gitlab-ce/issues/18231
# - https://developer.mozilla.org/en-US/docs/Web/Security/CSP/CSP_policy_directives
SecureHeaders::Configuration.default do |config| SecureHeaders::Configuration.default do |config|
# Mark all cookies as "Secure", "HttpOnly", and "SameSite=Strict".
config.cookies = { config.cookies = {
secure: true, # mark all cookies as "Secure" secure: true,
httponly: true, # mark all cookies as "HttpOnly" httponly: true,
samesite: { samesite: {
strict: true # mark all cookies as SameSite=Strict strict: true
} }
} }
# Disallow iframes.
config.x_frame_options = "DENY" config.x_frame_options = "DENY"
config.x_content_type_options = "nosniff" config.x_content_type_options = "nosniff"
config.x_xss_protection = "1; mode=block" config.x_xss_protection = "1; mode=block"
...@@ -23,26 +31,44 @@ SecureHeaders::Configuration.default do |config| ...@@ -23,26 +31,44 @@ SecureHeaders::Configuration.default do |config|
config.x_permitted_cross_domain_policies = "none" config.x_permitted_cross_domain_policies = "none"
config.referrer_policy = "origin-when-cross-origin" config.referrer_policy = "origin-when-cross-origin"
config.csp = { config.csp = {
# "meta" values. these will shaped the header, but the values are not included in the header. # "Meta" values.
report_only: true, # default: false report_only: true,
preserve_schemes: true, # default: false. Schemes are removed from host sources to save bytes and discourage mixed content. preserve_schemes: true,
# directive values: these values will directly translate into source directives # "Directive" values.
# Default source allows nothing, more permissive values are set per-policy.
default_src: %w('none'), default_src: %w('none'),
frame_src: %w('self'), # (Deprecated) Don't allow iframes.
frame_src: %w('none'),
# Only allow XMLHTTPRequests from the GitLab instance itself.
connect_src: %w('self'), connect_src: %w('self'),
# Only load local fonts.
font_src: %w('self'), font_src: %w('self'),
# Load local images, any external image available over HTTPS.
img_src: %w('self' https:), img_src: %w('self' https:),
# Audio and video can't be played on GitLab currently, so it's disabled.
media_src: %w('none'), media_src: %w('none'),
# Don't allow <object>, <embed>, or <applet> elements.
object_src: %w('none'), object_src: %w('none'),
# Allow local scripts and inline scripts.
script_src: %w('unsafe-inline' 'self'), script_src: %w('unsafe-inline' 'self'),
# Allow local stylesheets and inline styles.
style_src: %w('unsafe-inline' 'self'), style_src: %w('unsafe-inline' 'self'),
# The URIs that a user agent may use as the document base URL.
base_uri: %w('self'), base_uri: %w('self'),
# Only allow local iframes and service workers
child_src: %w('self'), child_src: %w('self'),
# Only submit form information to the GitLab instance.
form_action: %w('self'), form_action: %w('self'),
# Disallow any parents from embedding a page in an iframe.
frame_ancestors: %w('none'), frame_ancestors: %w('none'),
block_all_mixed_content: true, # see http://www.w3.org/TR/mixed-content/ # Don't allow any plugins (Flash, Shockwave, etc.)
upgrade_insecure_requests: true, # see https://www.w3.org/TR/upgrade-insecure-requests/ plugin_types: %w('none'),
# Blocks all mixed (HTTP) content.
block_all_mixed_content: true,
# Upgrades insecure requests to HTTPS when possible.
upgrade_insecure_requests: true,
# Reports are sent to Sentry if it's enabled, nowhere otherwise.
report_uri: %W(#{CSP_REPORT_URI}) report_uri: %W(#{CSP_REPORT_URI})
} }
...@@ -51,11 +77,12 @@ SecureHeaders::Configuration.default do |config| ...@@ -51,11 +77,12 @@ SecureHeaders::Configuration.default do |config|
config.csp[:script_src] << "maxcdn.bootstrapcdn.com" config.csp[:script_src] << "maxcdn.bootstrapcdn.com"
end end
# Recaptcha # reCAPTCHA
if current_application_settings.recaptcha_enabled if current_application_settings.recaptcha_enabled
config.csp[:script_src] << "https://www.google.com/recaptcha/" config.csp[:script_src] << "https://www.google.com/recaptcha/"
config.csp[:script_src] << "https://www.gstatic.com/recaptcha/" config.csp[:script_src] << "https://www.gstatic.com/recaptcha/"
config.csp[:frame_src] << "https://www.google.com/recaptcha/" config.csp[:frame_src] << "https://www.google.com/recaptcha/"
config.x_frame_options = "SAMEORIGIN"
end end
# Gravatar # Gravatar
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment