Help us learn about your current experience with the documentation. Take the survey.

应用安全故障排除

  • 级别:Ultimate
  • 提供:GitLab.com, GitLab Self-Managed, GitLab Dedicated

在使用应用安全功能时,您可能会遇到以下问题。

日志级别

GitLab 分析器输出的日志详细程度由 SECURE_LOG_LEVEL 环境变量决定。此日志级别或更高级别的消息会被输出。

从最高到最低严重程度,日志级别为:

  • fatal
  • error
  • warn
  • info(默认)
  • debug

调试级别日志

调试日志可能带来严重的安全风险。输出可能包含作业可用的环境变量和其他机密内容。输出会上传到 GitLab 服务器,并在作业日志中可见。

要启用调试级别日志,请将以下内容添加到您的 .gitlab-ci.yml 文件中:

variables:
  SECURE_LOG_LEVEL: "debug"

这表示所有 GitLab 分析器将输出所有消息。有关更多详细信息,请参阅日志级别

安全作业以退出代码 1 失败

如果安全作业失败且原因不明:

  1. 启用调试级别日志
  2. 运行作业。
  3. 检查作业的输出。
  4. 移除 debug 日志级别以恢复默认的 info 值。

过时的安全报告

当为合并请求生成的安全报告变得过时时,合并请求会在安全小部件中显示警告消息,并提示您采取适当的操作。

这可能在两种情况下发生:

源分支落后于目标分支

当目标分支和源分支之间的最新共同祖先提交不是目标分支上的最新提交时,安全报告可能会过时。

要解决此问题,请使用 rebase 或 merge 来合并目标分支的更改。

Incorporate target branch changes

目标分支安全报告已过时

这可能由于多种原因发生,包括作业失败或新的安全建议。当合并请求显示安全报告已过时时,您必须在目标分支上运行新的流水线。选择新建流水线来运行新的流水线。

Run a new pipeline

获取警告消息 … report.json: 没有匹配的文件

调试日志可能带来严重的安全风险。输出可能包含作业可用的环境变量和其他机密内容。输出会上传到 GitLab 服务器,并在作业日志中可见。

此消息通常伴随着错误 没有文件可上传,前面还有其他错误或警告,指示为什么未生成 JSON 报告。检查整个作业日志以查找此类消息。如果找不到这些消息,请在将 SECURE_LOG_LEVEL: "debug" 设置为自定义 CI/CD 变量后重试失败的作业。这提供了额外的信息以便进一步调查。

获取错误消息 sast 作业:配置键不能与 'rules' 一起使用:only/except

包含SAST.gitlab-ci.yml 这样的 .gitlab-ci.yml 模板时,根据您的 GitLab CI/CD 配置,可能会发生以下错误:

Unable to create pipeline

    jobs:sast config key may not be used with `rules`: only/except

当包含的作业的 rules 配置已使用已弃用的 onlyexcept 语法覆盖时,会出现此错误。要解决此问题,您必须:

有关更多信息,请参阅覆盖 SAST 作业

将您的 only/except 语法转换为 rules

当覆盖模板以控制作业执行时,先前的 onlyexcept 实例不再兼容,必须转换为 rules 语法

如果您的覆盖旨在限制作业仅在 main 上运行,则先前的语法可能类似于:

include:
  - template: Jobs/SAST.gitlab-ci.yml

# Ensure that the scanning is only executed on main or merge requests
spotbugs-sast:
  only:
    refs:
      - main
      - merge_requests

要将先前的配置转换为新的 rules 语法,覆盖将如下编写:

include:
  - template: Jobs/SAST.gitlab-ci.yml

# Ensure that the scanning is only executed on main or merge requests
spotbugs-sast:
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - if: $CI_MERGE_REQUEST_ID

如果您的覆盖旨在限制作业仅在分支上运行,而不是标签,则可能类似于:

include:
  - template: Jobs/SAST.gitlab-ci.yml

# Ensure that the scanning is not executed on tags
spotbugs-sast:
  except:
    - tags

要转换为新的 rules 语法,覆盖将重写为:

include:
  - template: Jobs/SAST.gitlab-ci.yml

# Ensure that the scanning is not executed on tags
spotbugs-sast:
  rules:
    - if: $CI_COMMIT_TAG == null

有关更多信息,请参阅 rules

将您的模板固定到已弃用的版本

为确保获得最新支持,我们强烈建议您迁移到 rules

如果您无法立即更新 CI 配置,有几种解决方法涉及固定到先前的模板版本,例如:

include:
  remote: 'https://gitlab.com/gitlab-org/gitlab/-/raw/12-10-stable-ee/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml'

此外,我们提供了一个包含版本化遗留模板的专门项目。这可用于离线设置或任何希望使用 Auto DevOps 的人。

说明可在遗留模板项目中找到。

发现了漏洞,但作业成功。如何让流水线失败?

在这种情况下,作业成功是默认行为。作业的状态表示分析器本身的成功或失败。分析器结果显示在作业日志合并请求小部件安全仪表板中。

错误:作业 仅用于配置,不应执行其脚本

GitLab 13.4 中所做的更改Security/Dependency-Scanning.gitlab-ci.ymlSecurity/SAST.gitlab-ci.yml 模板意味着,如果您通过设置 rules 属性启用 sastdependency_scanning 作业,它们会失败并显示错误 (job) is used for configuration only, and its script should not be executed

可以使用 sastdependency_scanning 节来更改所有 SAST 或依赖项扫描,例如更改 variablesstage,但不能用于定义共享的 rules

有一个开放的问题以改进可扩展性。您可以为此问题点赞以帮助确定优先级,并且欢迎贡献

空的漏洞报告、依赖项列表页面

如果流水线包含具有 allow_failure: false 选项的手动步骤作业,并且此作业未完成,GitLab 无法使用安全报告的数据填充列出的页面。在这种情况下,漏洞报告依赖项列表页面为空。可以通过运行流水线手动步骤中的作业来填充这些安全页面。

有一个开放的问题来处理这种情况。您可以为此问题点赞以帮助确定优先级,并且欢迎贡献