配置适用于 Azure DevOps 的 GitHub Advanced Security

适用于 Azure DevOps 的 GitHub 高级安全性将 GitHub Advanced Security 的安全功能套件添加到 Azure Repos,并包含以下功能:

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

适用于 Azure DevOps 的 GitHub 高级安全性仅适用于 Azure DevOps Services,专门用于代码 Git 存储库。

适用于 Azure DevOps 的 GitHub Advanced Security 可与 Azure Repos 配合使用。 若要将 GitHub 高级安全性与 GitHub 存储库配合使用,请参阅 GitHub 高级安全性

先决条件

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

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

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

如果组织使用自承载代理,请将以下 URL 添加到 Allowlist,以便依赖项扫描任务可以提取漏洞咨询数据。 有关详细信息,请参阅 允许的 IP 地址和域 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 管道的 AdvancedSecurity-Codeql-Init@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 的代码扫描管道设置的屏幕截图。

此外,请在Initialize 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 阶段。 在测试版期间,对这些语言的分析不如对其他语言的 CodeQL 分析全面。

  • 使用 java 分析用 Java 或/和 Kotlin 编写的代码。
  • 使用 javascript 分析用 JavaScript 和/或 TypeScript 编写的代码。

如果指定的语言是 cpp, java, csharpswift,则需要自定义生成步骤。

设置拉取请求注释

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

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

若要禁用高级安全性,当您下次为存储库重新启用高级安全性时,所有警报及其状态将保留在“高级安全性”选项卡中。