如何配置内容安全策略(CSP)

本文介绍如何配置 GitLab 的内容安全策略(CSP),以应对渗透测试中常见的安全问题。

适用场景:

  • 渗透测试报告中涉及 CSP 相关问题(例如,缺少指令、来源过于宽松)
  • 加固 GitLab 实例的安全防护

背景

内容安全策略(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-evalunsafe-inline 可能导致以下已知问题:

  • 导航下拉菜单可能渲染异常(显示在页面顶部)。
  • 代码片段脚本编辑功能可能无法正常使用。

请根据您的安全需求权衡利弊后再应用此配置。您可以使用 report_only: true 来测试策略而不强制执行。

验证

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

  1. 在浏览器中打开 GitLab Web 界面。
  2. 打开浏览器开发者工具(F12),切换到 Network 标签。
  3. 检查任意页面请求的响应头,确认 Content-Security-Policy 头部反映了配置的指令。
  4. 切换到 Console 标签,查看是否有任何 CSP 违规错误提示,可能表明功能受影响。