排查依赖项扫描故障

了解如何排查 Azure DevOps 的 GitHub 高级安全性中的依赖项扫描问题。

先决条件

类别 要求
权限 - 若要查看存储库的所有警报的摘要:存储库的 参与者 权限。
- 若要消除高级安全性中的警报: 项目管理员 权限。
- 若要管理高级安全性中的权限:需要成为 项目集合管理员 组的成员,或者将 高级安全性:管理设置 权限设置为 允许

有关高级安全权限的详细信息,请参阅 “管理高级安全”权限

依赖扫描未识别到任何组件

如果依赖项扫描任务完成时未标记出任何组件,并且不能生成针对具有已知漏洞组件的警报,请确保在 AdvancedSecurity-Dependency-Scanning@1 任务之前执行包还原步骤。

例如,对于 C# (.NET Core) 项目,下面是一个示例 YAML 代码片段:

- task: DotNetCoreCLI@2
  displayName: 'Restore NuGet packages'
  inputs:
    command: 'restore'
    projects: '**/*.csproj'

    # If you are using a private package feed such as Azure Artifacts, you will need additional variables.
    # For more information, see https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/dotnet-core-cli-v2?view=azure-pipelines 
    feedsToUse: 'select'
    ...

- task: AdvancedSecurity-Dependency-Scanning@1

对于 JavaScript 项目,下面是一个示例 YAML 代码片段:

- task: Npm@1
  displayName: 'npm install'
  inputs:
    command: 'install'
    workingDir: '$(System.DefaultWorkingDirectory)'

- task: AdvancedSecurity-Dependency-Scanning@1

依赖项扫描任务超时

依赖项扫描任务在超时前将运行的默认时间为 300 秒(5 分钟)。 如果任务在完成前超时,则可以设置一个管道变量,该变量 DependencyScanning.Timeout需要一个表示秒的整数,例如 DependencyScanning.Timeout: 600。 在默认的 300 秒超时以下的任何设置都不会生效。

要使用此变量,需添加 DependencyScanning.Timeout 作为管道变量:

- task: AdvancedSecurity-Dependency-Scanning@1
  env:
    DependencyScanning.Timeout: 600

调整扫描目录

默认情况下,依赖项扫描任务将处理 Agent.BuildDirectory 目录。 如果要将扫描范围限定为特定文件夹,可以将管道变量 DependencyScanning.SourcePath 设置为要分析的生成代理中的任何目录文件路径。 不支持在同一管道作业中执行多个依赖项扫描任务。 如果扫描路径的范围限定为子目录,则无法重新添加任务以扫描其他目录。

- task: AdvancedSecurity-Dependency-Scanning@1
  env:
    DependencyScanning.SourcePath: scan/code/path

依赖扫描将结果发布到意外的存储库

如果管道定义位于一个存储库中,并且 GitHub 高级安全性要扫描的源代码位于另一个存储库中,则结果可能会被处理并提交到不正确的存储库,发布到包含管道定义的存储库,而不是源代码存储库。

若要启用预期的结果路由,请将管道环境变量 advancedsecurity.publish.repository.infer: true 设置为从工作目录中的存储库中推断要发布的存储库。

trigger:
  - main

resources:
  repositories:
    # PipelineRepo: The repository containing the pipeline definition.
    # This is optional and only needed if you plan to reference files or scripts from this repo.
    - repository: PipelineRepo
      type: git
      name: DevOpsPipelineRepo
      ref: refs/heads/main
      trigger:
        - main
    # SourceRepo: The repository where scanning and publishing will occur.
    - repository: SourceRepo
      type: git
      name: code-to-analyze-repo
      ref: refs/heads/main
      trigger:
        - main

jobs:
  - job: "DependencyScan"
    displayName: "Dependency Scanning with Inferred Publishing"
    variables:
      # Enable repository inference
      advancedsecurity.publish.repository.infer: true
    steps:
      # Checkout the SourceRepo
      - checkout: SourceRepo

      # Perform Dependency Scanning
      - task: AdvancedSecurity-Dependency-Scanning@1
        displayName: "Analyze Dependencies for Vulnerabilities"

在调整结果发布位置时,缺少依赖项扫描的拉取请求注释

如果您在使用 advancedsecurity.publish.repository.infer 或定义替代 advancedsecurity.publish.repository,您可能需要设置 DependencyScanning.SourcePath: $(System.DefaultWorkingDirectory),以确保文件路径能够被准确确定,从而使拉取请求的注释如预期般出现。

- task: AdvancedSecurity-Dependency-Scanning@1
  env:
    DependencyScanning.SourcePath: $(System.DefaultWorkingDirectory)

生成任务的破窗方案

如果依赖项扫描生成任务正在阻止管道的成功执行,而你需要紧急跳过生成任务,则可以设置管道变量 DependencyScanning.Skip: true

依赖项扫描任务权限

依赖项扫描生成任务使用管道标识来调用高级安全 REST API。 默认情况下,同一项目中的管道有权提取警报。 如果你从构建服务帐户中删除这些权限,或者有自定义设置,例如在与存储库不同的项目中托管流水线,请手动授予这些权限。

向管道中使用的生成服务帐户授予 Advanced Security: View Alerts 权限。对于项目范围的管道,该帐户为 [Project Name] Build Service ([Organization Name]);对于集合范围的管道,该帐户为 Project Collection Build Service ([Organization Name])