配置适用于 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

  • 通过使用 GitHub 上提供的体系结构安装脚本,将 CodeQL 捆绑包安装到代理工具缓存。 这些脚本要求将 $AGENT_TOOLSDIRECTORY 环境变量设置为代理上的代理工具目录的位置,例如 C:/agent/_work/_tool。 或者,可以手动执行以下步骤:

    1. GitHub 选择最新的 CodeQL 发布捆绑包。
    2. 下载捆绑包并将其解压缩到代理工具目录中的以下目录(通常位于 _work/_tool 下):./CodeQL/0.0.0-[codeql-release-bundle-tag]/x64/。 使用最新版本的 v2.16.0,文件夹名称为 ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64/。 详细了解代理工具目录
    3. ./CodeQL/0.0.0-[codeql-release-bundle-tag] 文件夹内创建名为 x64.complete 的空文件。 以上面的示例为例,x64.complete 文件的结束文件路径为 ./CodeQL/0.0.0-codeql-bundle-v2.16.0/x64.complete

启用 GitHub 高级安全

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

存储库级加入

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

Screenshot of enabling GitHub Advanced Security.

项目级加入

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

Screenshot of project-level enablement for Advanced Security.

组织级别的加入

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

Screenshot of org-level enablement for Advanced Security.

设置机密扫描

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

Screenshot of enabling push protection.

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

设置依赖项扫描

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

提示

为了获得最准确的扫描结果,请确保按照生成想要扫描的代码的管道生成步骤添加依赖项扫描任务。

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

Screenshot of dependency scanning pipeline setup for YAML.

设置代码扫描

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

提示

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

按以下顺序添加任务:

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

Screenshot of code scanning pipeline setup for YAML.

此外,你需要在“初始化 CodeQL”任务中指定要分析的语言。 可使用逗号分隔列表一次性分析多种语言。 支持的语言是 csharp, cpp, go, java, javascript, python, ruby, swift

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

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

#   Add your custom build steps here
# - Ensure that all code to be scanned is compiled (often using a `clean` command to ensure you are 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. 

# 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 时将保留所有警报和警报状态。

后续步骤