如何配置 Content Security Policy (CSP)

本文介绍如何为 GitLab 配置 Content Security Policy (CSP),以解决渗透测试中发现的常见安全问题。

适用场景:

  • 渗透测试报告指出与 CSP 相关的问题(例如缺少指令、来源过于宽松)
  • 加固 GitLab 实例的安全态势

背景

Content Security Policy (CSP) 是一种 HTTP 响应标头,可通过控制浏览器允许加载的资源,帮助防止跨站脚本攻击(XSS)、点击劫持和其他代码注入攻击。

默认情况下,GitLab 包含 CSP 配置,但某些指令可能过于宽松(例如允许 http: 和 https: 通配符来源),这可能会在渗透测试中被标记为问题。

前提条件

  • 已按照 GitLab 实例部署 文档部署 GitLab 实例。
  • 可参考的渗透测试结果(例如来自 OWASP ZAP)。

配置 CSP

修改 GitLab 实例 CR 配置,以启用和自定义 CSP 指令。

将 http://gitlab.example.com 替换为 GitLab 实例的实际外部 URL。

spec:
  helmValues:
    global:
      appConfig:
        contentSecurityPolicy:
          enabled: true
          report_only: false
          directives:
            form_action: "'self' http://gitlab.example.com"
            img_src: "'self' data: blob: http://gitlab.example.com"
            media_src: "'self' data: blob: http://gitlab.example.com"

指令说明

指令用途建议
form_action控制表单可以向哪些 URL 提交数据。默认值 'self' https: http: 允许向任何地址提交。限制为 'self' 和 GitLab 实例 URL。
img_src控制可以从哪些来源加载图像。默认值包含 http: 和 https: 通配符。限制为 'self'、data:、blob: 和 GitLab 实例 URL。
media_src控制可以从哪些来源加载媒体(音频/视频)。与 img_src 存在相同问题。限制为 'self'、data:、blob: 和 GitLab 实例 URL。

可选:移除 unsafe-eval 和 unsafe-inline

对于更严格的安全要求,您还可以从 script-src 中移除 unsafe-eval,并从 style-src 中移除 unsafe-inline:

spec:
  helmValues:
    global:
      appConfig:
        contentSecurityPolicy:
          enabled: true
          report_only: false
          directives:
            form_action: "'self' http://gitlab.example.com"
            img_src: "'self' data: blob: http://gitlab.example.com"
            media_src: "'self' data: blob: http://gitlab.example.com"
            script_src: "'strict-dynamic' 'self' https://www.google.com/recaptcha/ https://www.recaptcha.net"
            style_src: "'self'"

警告:移除 unsafe-eval 和 unsafe-inline 可能会导致以下已知问题:

  • 导航下拉菜单可能显示不正确(定位在页面顶部)。
  • 代码片段脚本编辑可能无法正常运行。

在应用此配置之前,请根据您的安全要求评估这些权衡。您可以使用 report_only: true 在不强制执行策略的情况下测试该策略。

验证

应用配置后,等待 GitLab 实例完成重新部署,然后进行验证:

  1. 在浏览器中打开 GitLab Web 界面。
  2. 打开浏览器开发者工具(F12),然后检查 Network 选项卡。
  3. 检查任意页面请求的响应标头,并确认 Content-Security-Policy 标头反映了配置的指令。
  4. 检查 Console 选项卡中是否存在任何 CSP 违规错误,这些错误可能表明功能已损坏。

GitLab 是 GitLab Inc. 的商标。

Alauda 是独立供应商。本产品与 GitLab Inc. 没有任何关联,也未获得其认可或赞助。所有商标均为其各自所有者的财产,此处仅用于标识目的。