配置适用于 Azure DevOps 的 GitHub Advanced Security

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

适用于 Azure DevOps 的 GitHub Advanced Security 包括:

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

目前,适用于 Azure DevOps 的 GitHub Advanced Security 仅适用于 Azure DevOps Services,没有计划将该产品引入 Azure DevOps Server。 适用于 Azure DevOps 的 GitHub Advanced Security 也仅适用于代码 Git 存储库。

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

先决条件

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

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

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

域 URL 说明
https://governance.dev.azure.com 对于使用 dev.azure.com 域访问其 DevOps 实例的组织
https://dev.azure.com 对于使用 dev.azure.com 域访问其 DevOps 实例的组织
https://advsec.dev.azure.com 对于使用 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 8.x)。 如果代理上不存在兼容版本,则依赖项扫描生成任务将下载 .NET

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

启用 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,则需要执行自定义生成步骤。

设置拉取请求注释

对于依赖项扫描和代码扫描,注释会自动配置到包含依赖项扫描和/或代码扫描任务的生成验证策略的拉取请求中。 有关配置生成验证策略的详细信息,请参阅生成验证

拉取请求注释还需要对默认分支和目标分支进行高级安全扫描,然后才能扫描源(拉取请求)分支。 有关解决拉取请求分支警报的详细信息,请参阅管理有关拉取请求的依赖项扫描警报管理拉取请求的代码扫描警报

无论出于什么原因,如果需要禁用高级安全功能,任何警报和警报状态都将保留在“高级安全”选项卡中,以便下次重新为版本库启用高级安全功能时使用。

后续步骤