访问存储库、工件和其他资源

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

在运行时,管道中的每个作业都可以访问 Azure DevOps 中的其他资源。 例如,作业可执行以下操作:

  • 从 Git 存储库中签出源代码
  • 将标记添加到存储库
  • 在 Azure Artifacts 中访问信息提要
  • 将日志从代理上传到服务
  • 将测试结果和其他工件从代理上传到服务
  • 更新工作项

Azure Pipelines 使用作业访问令牌来执行这些任务。 作业访问令牌是 Azure Pipelines 在运行时为每个作业动态生成的安全令牌。 运行作业的代理使用作业访问令牌来访问 Azure DevOps 中的这些资源。 可以通过控制向作业访问令牌授予权限的方式来控制管道有权访问的资源。

令牌的权限派生方式保留:(a) 作业授权范围和 (b) 在项目或集合生成服务帐户上设置的权限。

作业授权范围

可以将作业授权范围设置为集合或项目。 通过将范围设置为集合,可以选择允许管道访问集合或组织中的所有存储库。 通过将范围设置为项目,可以选择仅访问与管道位于同一项目中的存储库。

可以为整个 Azure DevOps 组织或特定项目设置作业授权范围。

注意

在 2020 Azure DevOps Server 中,“将作业授权范围限制为当前项目”仅适用于 YAML 管道和经典生成管道。 不适用于经典发布管道。 经典发布管道始终在项目集合范围内运行。

为组织设置作业授权范围:

  • 在 Azure DevOps 用户界面中浏览到组织设置页。
  • 在“管道”下选择“设置”。
  • 启用“将作业授权范围限制为当前项目”,以将范围限制为项目。 这是建议的设置,因为此设置可增强管道的安全性。

为特定项目设置作业授权范围:

  • 在 Azure DevOps 用户界面中浏览到组织设置页。
  • 在“管道”下选择“设置”。
  • 启用“将作业授权范围限制为当前项目”,以将范围限制为项目。 这是建议的设置,因为此设置可增强管道的安全性。
  • 要在所有项目的组织级别设置作业授权范围,请选择“组织设置”>“管道”>“设置”。
  • 若要为特定项目设置作业授权范围,请选择“项目设置”>“管道”>“设置”。

启用以下一个或多个设置。 建议启用这些设置,因为此可增强管道的安全性。

  • 将作业授权范围限制为非发布管道的当前项目 - 此设置适用于 YAML 管道和经典生成管道,不适用于经典发布管道
  • 将作业授权范围限制为发布管道的当前项目 - 此设置仅适用于经典发布管道

注意

如果作用域在组织级别设置为项目,则无法更改每个项目中的范围。

重要

如果范围未在组织级别或项目级别进行限制,则 YAML 管道中的每个作业都会获得集合范围内的作业访问令牌。 也就是说,管道有权访问组织的任何项目中的任何存储库。 如果攻击者能够访问单个项目中的单个管道,则他们将能够访问组织中的任何存储库。 因此,建议将范围限制在最高级别(组织设置),以遏制对单一项目的攻击。

如果使用 Azure DevOps Server 2019,则所有 YAML 作业都会在作业授权范围设置为集合的情况下运行。 也就是说,这些作业有权访问项目集合中的所有存储库。 无法在 2019 Azure DevOps Server中更改此设置。

YAML 管道在 TFS 中不可用。

注意

如果管道位于公共项目中,则无论在任何设置中如何配置,作业授权范围都会自动限制为项目。 公共项目中的作业只能访问该项目中的资源(例如,生成项目或测试结果),而不能访问组织的其他项目中的资源。

将作业授权范围限制为所引用的 Azure DevOps 存储库

除了上一部分所述的作业授权范围设置外,Azure Pipelines 还提供“将作业授权范围限制为引用的 Azure DevOps 存储库”设置。

除非已启用“将作业授权范围限制为引用的 Azure DevOps 存储库”,否则管道可以访问授权项目中的任何 Azure DevOps 存储库。 启用此选项后,可以将所有管道的访问范围缩小到仅由使用该存储库的管道作业中的 checkout 步骤或 uses 语句显式引用的 Azure DevOps 存储库。

有关详细信息,请参阅 Azure Repos Git 存储库 - 将作业授权范围限制为引用的 Azure DevOps 存储库

保护对 YAML 管道中存储库的访问权限

除了上一部分所述的作业授权范围设置外,Azure Pipelines 还提供“保护对 YAML 管道中的存储库的访问”设置。

除非启用了“保护对 YAML 管道中的存储库的访问”,否则管道可以访问授权项目中的任何 Azure DevOps 存储库。 启用此选项后,可以将所有管道的访问范围缩小到仅由使用该存储库的管道作业中的 checkout 步骤或 uses 语句显式引用的 Azure DevOps 存储库。

有关详细信息,请参阅 Azure Repos Git 存储库 - 保护对 YAML 管道中的存储库的访问

重要

默认情况下,将为 2020 年 5 月之后创建的新组织和项目启用“保护对 YAML 管道中的存储库的访问”。

作用域内生成标识

Azure DevOps 使用两个内置标识来执行管道。

  • 集合范围的标识,有权访问集合中的所有项目(或 Azure DevOps Services 的组织)
  • 项目范围的标识,有权访问单个项目

这些标识是在回调 Azure DevOps 系统时执行生成/发布执行时间活动所必需的分配权限。 有内置的默认权限,还可以根据需要管理自己的权限。

集合范围的标识名称具有以下格式:

  • Project Collection Build Service ({OrgName})
  • 例如,如果组织名称 fabrikam-tailspin,则此帐户的名称为 Project Collection Build Service (fabrikam-tailspin)

项目范围的标识名称具有以下格式:

  • {Project Name} Build Service ({Org Name})
  • 例如,如果组织名称为 fabrikam-tailspin 且项目名称为 SpaceGameWeb,则此帐户的名称为 SpaceGameWeb Build Service (fabrikam-tailspin)

默认情况下,除非按照前面的作业授权范围一节中另有说明进行配置,否则使用集合范围的标识。

管理生成服务帐户权限

设置项目范围访问权限的一个结果可能是,项目范围的标识可能没有对集合范围标识具有的资源的权限。

在以下情况下可能希望更改作业访问令牌的权限:

  • 希望管道访问不同项目中的源。
  • 希望管道被限制为更改存储库中的代码。
  • 希望管道被限制为无法创建工作项。

更新作业访问令牌的权限:

  • 首先,确定管道的作业授权范围。 请参阅上面的章节,了解作业授权范围。 如果作业授权范围是集合,则要管理其权限的相应生成服务帐户是“项目集合生成服务 <你的集合名称>”。 如果作业授权范围是项目,则要管理其权限的生成服务帐户是“<你的项目名称> 生成服务 <你的集合名称>”。

  • 限制或授予对“项目集合生成服务<你的集合名称>”的其他访问权限:

    • 在“管道”页上的溢出菜单中选择“管理安全性”。
    • 在“用户”下,选择“项目集合生成服务 <你的集合名称>”。
    • 对此帐户的管道相关权限进行任何更改。
    • 导航到 Azure DevOps 组织的组织设置(或项目集合的集合设置)。
    • 在“安全性”下选择“权限”。
    • 在“用户”选项卡下,查找项目集合生成服务 <你的集合名称>。
    • 对此帐户的非管道相关权限进行任何更改。
    • 由于项目集合生成服务 <你的集合名称> 是你的组织或集合中的用户,因此你可以将此帐户显式添加到任何资源,例如,添加到 Azure 工件中的源。
  • 限制或授予对“<你的项目名称 > 生成服务<你的集合名称>”的其他访问权限:

    • 只有在运行管道一次之后,才会创建你可以管理其权限的生成服务帐户。 确保已运行管道一次。
    • 在“管道”页上的溢出菜单中选择“管理安全性”。
    • 在“用户”下,选择“<你的项目名称 > 生成服务 <你的集合名称>”。
    • 对此帐户的管道相关权限进行任何更改。
    • 导航到 Azure DevOps 组织的组织设置(或项目集合的集合设置)。
    • 在“安全性”下选择“权限”。
    • 在“用户”选项卡下,查找“<你的项目名称 >生成服务 <你的集合名称>”。
    • 对此帐户的非管道相关权限进行任何更改。
    • 由于 <你的项目名称 >生成服务 <你的集合名称> 是你的组织或集合中的用户,因此你可以将此帐户显式添加到任何资源,例如,添加到 Azure Artifacts 中的源。

为项目配置权限以访问同一项目集合中的另一个项目

在此示例中,fabrikam-tailspin/SpaceGameWeb 项目范围的构建标识被授予访问 fabrikam-tailspin/FabrikamFiber 项目的权限。

  1. 在 FabrikamFiber 项目中,依次导航到“项目设置”、“权限”。

    如何配置项目设置的屏幕截图。

  2. 创建名为“外部项目”的新组,并添加“SpaceGameWeb 生成服务”帐户。 创建新安全组的屏幕截图。

  3. 选择“用户”,开始键入名称“SpaceGameWeb”,然后选择“SpaceGameWeb 生成服务”帐户。 如果最初看不到任何搜索结果,请选择“展开搜索”。

    选择 SpaceGameWeb 项目范围的生成标识用户的屏幕截图。

  4. 授予该用户的“查看项目级信息”权限。

    如何向用户授予“查看项目级信息权限”的屏幕截图。

示例 - 配置权限以访问同一项目集合中的另一个存储库

在此示例中,fabrikam-tailspin/SpaceGameWeb 项目范围的构建标识被授予访问 fabrikam-tailspin/FabrikamFiber 项目中 FabrikamFiber 存储库的权限。

  1. 按照步骤授予 SpaceGameWeb 项目范围生成标识访问 FabrikamFiber 项目的权限

  2. 在 FabrikamFiber 项目中,依次导航到“项目设置”、“存储库”、“FabrikamFiber”。

    配置存储库设置。

  1. 选择 + 图标,开始键入名称“SpaceGameWeb”,然后选择“SpaceGameWeb 生成服务”帐户。

    为存储库访问添加用户。

  1. 开始键入名称“SpaceGameWeb”,然后选择“SpaceGameWeb 生成服务”帐户。

    有关如何添加用于存储库访问的用户的屏幕截图。

  1. 授予该用户的“读取”权限。

    如何配置存储库权限的屏幕截图。

示例 - 配置权限以访问同一项目集合中的另一个资源

在此示例中,向 fabrikam-tailspin/SpaceGameWeb 项目范围的生成标识授予访问 fabrikam-tailspin/FabrikamFiber 项目中其他资源的权限。

  1. 按照步骤授予 SpaceGameWeb 项目范围生成标识访问 FabrikamFiber 项目的权限

  2. 为该用户配置所需的权限。

    配置用户权限。

常见问题解答

如何实现确定 YAML 管道的作业授权范围?

  • 如果项目是公共项目,则无论任何其他设置如何,作业授权范围始终为项目。

Azure DevOps Server 2019 中的所有 YAML 管道在收集作业授权范围内运行。

  • 检查 Azure DevOps 的“组织设置”下的管道设置:
    • 如果已启用“将作业授权范围限制为当前项目”,则范围是“项目”。
    • 如果未启用“将作业授权范围限制为当前项目”,则在 Azure DevOps 中的“项目设置”下检查管道设置:
      • 如果已启用“将作业授权范围限制为当前项目”,则范围是“项目”。
      • 否则,范围为集合。
  • 如果管道位于专用项目中,请检查 Azure DevOps 的“组织设置”下的管道设置:
    • 如果已启用“对于非发布管道,将作业授权范围限制为当前项目”,则范围是“项目”。
    • 如果未启用“对于非发布管道,将作业授权范围限制为当前项目”,则在 Azure DevOps 中的“项目设置”下检查管道设置:
      • 如果已启用“对于非发布管道,将作业授权范围限制为当前项目”,则范围是“项目”。
      • 否则,范围为集合。

如何实现确定经典生成管道的作业授权范围?

  • 如果管道位于公共项目中,则作业授权范围为项目,而不考虑任何其他设置。
  • 打开管道的编辑器并导航到“选项”选项卡。
    • 如果“生成作业授权范围”为“当前项目”,则作用域为“项目”。
    • 否则,范围为集合。
  • 检查 Azure DevOps 的“组织设置”下的管道设置:
    • 如果已启用“将作业授权范围限制为当前项目”,则范围是“项目”。
    • 如果未启用“将作业授权范围限制为当前项目”,则在 Azure DevOps 中的“项目设置”下检查管道设置:
      • 如果已启用“将作业授权范围限制为当前项目”,则范围是“项目”。
      • 如果未启用“将作业授权范围限制为当前项目”,则打开管道的编辑器,然后导航到“选项”选项卡。
        • 如果“生成作业授权范围”为“当前项目”,则作用域为“项目”。
        • 否则,范围为集合。
  • 如果管道位于专用项目中,请检查 Azure DevOps 的“组织设置”下的管道设置:
    • 如果已启用“对于非发布管道,将作业授权范围限制为当前项目”,则范围是“项目”。
    • 如果未启用“对于非发布管道,将作业授权范围限制为当前项目”,则在 Azure DevOps 中的“项目设置”下检查管道设置:
      • 如果已启用“对于非发布管道,将作业授权范围限制为当前项目”,则范围是“项目”。
      • 如果未启用“对于非发布管道,将作业授权范围限制为当前项目”,则打开管道的编辑器,然后导航到“选项”选项卡。
        • 如果“生成作业授权范围”为“当前项目”,则作用域为“项目”。
        • 否则,范围为集合。

创建新的经典管道时,默认将作业授权范围设置为当前项目版本作业授权范围设置为项目

如何实现确定经典发布管道的作业授权范围?

Azure DevOps Server 2020 及更低版本中的经典发布管道在集合范围内运行。

  • 如果管道位于公共项目中,则作业授权范围为项目,而不考虑任何其他设置。
  • 如果管道位于专用项目中,请检查 Azure DevOps 的“组织设置”下的管道设置:
    • 如果已启用“对于发布管道,将作业授权范围限制为当前项目”,则范围是“项目”。
    • 如果未启用“对于发布管道,将作业授权范围限制为当前项目”,则在 Azure DevOps 中的“项目设置”下检查管道设置:
      • 如果已启用“对于发布管道,将作业授权范围限制为当前项目”,则范围是“项目”。
      • 否则,范围为集合。