配置适用于 Azure DevOps 的 GitHub Advanced Security

适用于 Azure DevOps 的 GitHub Advanced Security 将 GitHub Advanced Security 的安全功能套件添加到 Azure Repos。

适用于 Azure 的 GitHub Advanced Security 包括:

  • 机密扫描推送保护:检查代码推送是否包含可公开机密(如凭据)的提交
  • 机密扫描存储库扫描:扫描你的存储库并查找意外提交的公开机密
  • 依赖项扫描 - 搜索开放源代码依赖项中的已知漏洞(直接和可传递)
  • 代码扫描 - 使用 CodeQL 静态分析引擎识别代码级应用程序漏洞,如 SQL 注入和身份验证绕过

目前,适用于 Azure DevOps 的 GitHub Advanced Security 仅适用于 Azure DevOps Services,没有计划将该产品引入 Azure DevOps Server。

适用于 Azure DevOps 的 GitHub Advanced Security 可与 Azure Repos 配合使用。 如果要将 GitHub Advanced Security 与 GitHub 存储库配合使用,请参阅 GitHub Advanced Security

先决条件

作为“项目集合管理员”组的成员,你必须拥有所分配的权限。 要向“项目集合管理员”组添加成员或更改项目集合级别权限,请参阅更改项目集合级别权限

自托管代理的额外先决条件

如果你的组织使用自托管代理,则还有其他要求:

域 URL 说明
https://governance.dev.azure.com/{organization_name} 对于使用 dev.azure.com 域访问其 DevOps 实例的组织
https://dev.azure.com/{organization_name} 对于使用 dev.azure.com 域访问其 DevOps 实例的组织
https://advsec.dev.azure.com/{organization_name} 对于使用 dev.azure.com 域访问其 DevOps 实例的组织
https://{organization_name}.governance.visualstudio.com/ 对于使用 {organization_name}.visualstudio.com 域访问其 DevOps 实例的组织
https://{organization_name}.visualstudio.com  对于使用 {organization_name}.visualstudio.com 域访问其 DevOps 实例的组织
https://{organization_name}.advsec.visualstudio.com/ 对于使用 {organization_name}.visualstudio.com 域访问其 DevOps 实例的组织
  • 运行 .NET 运行时的兼容版本(当前为 .NET 6.0.x)。 如果代理上不存在兼容版本,则依赖项扫描生成任务将下载 .NET

  • 确保将 CodeQL 捆绑包安装到代理上的代理工具缓存。 可以将 enableAutomaticCodeQLInstall: true 变量与 YAML 管道的 Advanced-Security-CodeQL@1 管道任务一起使用,或选中 Enable automatic CodeQL detection and installation 经典管道的复选框。 或者,有关手动安装说明,请参阅 适用于 Azure DevOps 的 GitHub 高级安全性的代码扫描。

启用 GitHub 高级安全

可以在组织、项目或存储库级别启用 Advanced Security。 要访问每个扫描工具和结果,需要先启用 Advanced Security。 启用 Advanced Security 后,将阻止任何包含机密的未来推送到已启用此策略的存储库,并且存储库机密扫描将在后台进行。

存储库级加入

  1. 转到 Azure DevOps 项目的“项目设置”。
  2. 选择>“存储库”“存储库”。
  3. 选择要为其启用 Advanced Security 的存储库。
  4. 选择“启用”“开始计费以激活 Advanced Security”。 对于启用了 Advanced Security 的任何存储库,防火墙图标现在显示在存储库视图中。

启用 GitHub Advanced Security 的屏幕截图。

项目级加入

  1. 转到 Azure DevOps 项目的“项目设置”。
  2. 选择“Repos”。
  3. 选择“设置”选项卡。
  4. 选择“ 全部 启用”,并查看项目的活动提交者数的估计值。
  5. 选择“开始计费”,为项目中的每个现有存储库激活 Advanced Security。
  6. (可选)选择“自动为新存储库启用 Advanced Security”,使任何新创建的存储库在创建时都启用 Advanced Security。

高级安全性的项目级启用的屏幕截图。

组织级别的加入

  1. 转到 Azure DevOps 组织的“组织设置”
  2. 选择“存储库”
  3. 选择“ 全部 启用”,并查看组织的活动提交者的估计值。
  4. 选择“开始计费”,为组织的每个项目中的每个现有存储库激活 Advanced Security。
  5. (可选)选择“自动为新存储库启用 Advanced Security”,使任何新创建的项目在创建时都启用 Advanced Security。

高级安全性的组织级启用的屏幕截图。

设置机密扫描

当你打开 Advanced Security 时,将自动启用机密扫描推送保护和存储库扫描。 可以从存储库设置页启用或禁用机密推送保护。

启用推送保护的屏幕截图。

如前所述,机密扫描存储库扫描将在为选定存储库启用 Advanced Security 后自动启动。

设置依赖项扫描

依赖项扫描是一种基于管道的扫描工具。 结果按存储库聚合。 建议将依赖项扫描任务添加到想要扫描的所有管道。

提示

为了获得最准确的扫描结果,请确保按照生成想要扫描的代码的管道生成步骤和/或软件包还原步骤来添加依赖项扫描任务。

将 Advanced Security 依赖项扫描 (AdvancedSecurity-Dependency-Scanning@1) 任务直接添加到 YAML 管道文件,或从任务助手中选择 Advanced Security 依赖项扫描任务。

YAML 的依赖项扫描管道设置的屏幕截图。

设置代码扫描

代码扫描也是一种基于管道的扫描工具,其中结果按存储库聚合。

提示

建议将代码扫描任务添加到主生产管道的单独克隆管道,或者创建新管道。 这是因为代码扫描可能是一项更耗时的生成任务。

按以下顺序添加任务:

  1. Advanced Security 初始化 CodeQL (AdvancedSecurity-Codeql-Init@1)
  2. 你的自定义生成步骤
  3. Advanced Security 执行 CodeQL 分析 (AdvancedSecurity-Codeql-Analyze@1)

YAML 的代码扫描管道设置的屏幕截图。

此外,还需要指定要在初始化 CodeQL 任务中分析的语言。 可使用逗号分隔列表一次性分析多种语言。 支持的语言是 csharp, cpp, go, java, javascript, python, ruby, swift。 如果使用自承载代理,则还可以添加 enableAutomaticCodeQLInstall: true 变量以自动为代理安装最新的 CodeQL 位。

下面是一个初学者管道示例:

trigger:
  - main

pool:
  # Additional hosted image options are available: https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted#software
  vmImage: ubuntu-latest

steps:

  - task: AdvancedSecurity-Codeql-Init@1
    inputs:
      languages: "java"
      # Supported languages: csharp, cpp, go, java, javascript, python, ruby, swift
      # You can customize the initialize task: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-codeql-init-v1?view=azure-pipelines
      # If you're using a self-hosted agent to run CodeQL, use `enableAutomaticCodeQLInstall` to automatically use the latest CodeQL bits on your agent:
      enableAutomaticCodeQLInstall: true

#   Add your custom build steps here
# - Ensure that all code to be scanned is compiled (often using a `clean` command to ensure you're building from a clean state).
# - Disable the use of any build caching mechanisms as this can interfere with CodeQL's ability to capture all the necessary data during the build.
# - Disable the use of any distributed/multithreaded/incremental builds as CodeQL needs to monitor executions of the compiler to construct an accurate representation of the application.
# - For dependency scanning, ensure you have a package restore step for more accurate results.

# If you had a Maven app:
#   - task: Maven@4
#     inputs:
#       mavenPomFile: 'pom.xml'
#       goals: 'clean package'
#       publishJUnitResults: true
#       testResultsFiles: '**/TEST-*.xml'
#       javaHomeOption: 'JDKVersion'
#       jdkVersionOption: '1.17'
#       mavenVersionOption: 'Default'

# Or a general script:
#   - script: |
#       echo "Run, Build Application using script"
#       ./location_of_script_within_repo/buildscript.sh

  - task: AdvancedSecurity-Dependency-Scanning@1 # More details on this task: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-dependency-scanning-v1?view=azure-pipelines

  - task: AdvancedSecurity-Codeql-Analyze@1 # More details on this task: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-codeql-analyze-v1?view=azure-pipelines

提示

Kotlin/Swift 的 CodeQL 分析目前为 beta 版本。 在 beta 版本中,这些语言的分析将不如其他语言的 CodeQL 分析全面。 使用 java 分析用 Java 或/和 Kotlin 编写的代码。 使用 javascript 分析用 JavaScript 和/或 TypeScript 编写的代码。

如果指定的语言是 cpp, java, csharpswift,则需要自定义或 AutoBuild 生成步骤。 对于其他语言,如果包含 AutoBuild,则该步骤将成功完成,而无需执行任何操作。

如果出于任何原因需要禁用 Advanced Security,则在下次为存储库重新启用 Advanced Security 时将保留所有警报和警报状态。

后续步骤