了解如何排查 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])
。