访问存储库、项目和其他资源
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 组织或特定项目进行设置。
注释
在 Azure DevOps Server 2020 中,将作业授权范围限制为当前项目 仅适用于 YAML 管道和经典生成管道。 它不适用于经典发布管道。 经典发布管道始终使用项目集合范围运行。
若要为组织设置作业授权范围,请执行以下作:
- 导航到 Azure DevOps 用户界面中的组织设置页。
- 在 管道下选择 设置。
- 启用 将作业授权范围限制为当前项目 以将范围限制为项目。 这是建议的设置,因为它增强了管道的安全性。
若要为特定项目设置作业授权范围,请执行以下作:
- 导航到 Azure DevOps 用户界面中的项目设置页。
- 在 管道下选择 设置。
- 启用 将作业授权范围限制为当前项目 以将范围限制为项目。 这是建议的设置,因为它增强了管道的安全性。
- 若要在所有项目的组织级别设置作业授权范围,请选择 >管道>设置组织设置。
- 若要为特定项目设置作业授权范围,请选择 项目设置>管道>设置。
启用以下一个或多个设置。 建议启用这些设置,因为它增强了管道的安全性。
- 将非发布管道的作业授权范围限制为当前项目 - 此设置适用于 YAML 管道和经典生成管道,不适用于 经典发布管道。
- 将作业授权范围限制为发布管道的当前项目 - 此设置仅适用于经典发布管道。
注释
如果范围设置为 组织级别的项目,则不能更改每个项目中的范围。
重要
如果范围在组织级别或项目级别不受限制,则 YAML 管道中的每个作业都会获取集合范围的作业访问令牌。 换句话说,管道有权访问组织的任何项目中的任何存储库。 如果攻击者能够访问单个项目中的单个管道,他们将能够访问组织中的任何存储库。 因此,建议将范围限制在最高级别(组织设置),以包含对单个项目的攻击。
注释
如果管道位于 公共项目中,则无论在任何设置中配置什么,作业授权范围都会自动限制为 项目。 公共项目中的作业只能访问项目中的生成项目或测试结果等资源,而不能从组织的其他项目访问。
将作业授权范围限制为所引用的 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)
。
默认情况下,除非按照上一 作业授权范围 部分中所述进行配置,否则将使用集合范围的标识。
管理生成服务帐户权限
设置项目范围的访问的一个结果是,项目范围的标识可能无权访问集合范围的资源。
你可能希望在以下情况下更改作业访问令牌的权限:
- 希望管道访问位于不同项目中的源。
- 希望管道受到限制,无法更改存储库中的代码。
- 希望管道受到限制,无法创建工作项。
更新作业访问令牌的权限:
首先,确定管道的作业授权范围。 请参阅上面的部分以了解作业授权范围。 如果作业授权范围 集合,则要管理权限的相应生成服务帐户 项目集合生成服务(your-collection-name)。 如果作业授权范围 项目,则要管理权限的生成服务帐户 your-project-name 生成服务(your-collection-name)。
若要限制或授予对 项目集合生成服务(your-collection-name)的其他访问权限:
- 在 管道 页上的溢出菜单中选择“管理安全”。
- 在 用户下,选择 项目集合生成服务(your-collection-name)。
- 对此帐户的管道相关权限进行任何更改。
- 导航到 Azure DevOps 组织的组织设置(或项目集合的集合设置)。
- 在“安全性”下选择“权限”。
- 在“用户”选项卡下,查找 项目集合生成服务(your-collection-name)。
- 对此帐户的非管道相关权限进行任何更改。
- 由于 项目集合生成服务(your-collection-name) 是组织或集合中的用户,因此可以将此帐户显式添加到任何资源,例如,添加到 Azure Artifacts 中的源。
若要限制或授予对 项目名称生成服务(your-collection-name)的其他访问权限:
- 只能在运行管道一次后创建可以管理权限的生成服务帐户。 确保已运行管道一次。
- 在 管道 页上的溢出菜单中选择“管理安全”。
- 在 用户下,选择 项目名称生成服务(your-collection-name)。
- 对此帐户的管道相关权限进行任何更改。
- 导航到 Azure DevOps 组织的组织设置(或项目集合的集合设置)。
- 在“安全性”下选择“权限”。
- 在“用户”选项卡下,查找 your-project-name 生成服务(your-collection-name)。
- 对此帐户的非管道相关权限进行任何更改。
- 由于 Your-project-name 生成服务(your-collection-name) 是组织或集合中的用户,因此可以将此帐户显式添加到任何资源,例如,添加到 Azure Artifacts 中的源。
为项目配置权限以访问同一项目集合中的另一个项目
在此示例中,向 fabrikam-tailspin/SpaceGameWeb
项目范围的生成标识授予访问 fabrikam-tailspin/FabrikamFiber
项目的权限。
在 FabrikamFiber 项目中,导航到 项目设置,权限。
创建名为“外部项目”的新组,并添加 SpaceGameWeb 生成服务 帐户。
选择 用户,开始键入 spaceGameWeb 的名称,然后选择 SpaceGameWeb 生成服务 帐户。 如果最初未看到任何搜索结果,请选择 展开搜索。
授予该用户 权限 查看项目级信息。
示例 - 配置权限以访问同一项目集合中的另一个存储库
在此示例中,向 fabrikam-tailspin/SpaceGameWeb
项目范围的生成标识授予访问 fabrikam-tailspin/FabrikamFiber
项目中 FabrikamFiber
存储库的权限。
在 FabrikamFiber 项目中,导航到 项目设置,存储库,FabrikamFiber。
选择 + 图标,开始键入 SpaceGameWeb的名称,然后选择 SpaceGameWeb 生成服务 帐户。
开始键入 SpaceGameWeb的名称,然后选择 SpaceGameWeb 生成服务 帐户。
授予该用户的 读取 权限。
示例 - 配置权限以访问同一项目集合中的其他资源
在此示例中,向 fabrikam-tailspin/SpaceGameWeb
项目范围的生成标识授予访问 fabrikam-tailspin/FabrikamFiber
项目中其他资源的权限。
为该用户配置所需的权限。
常见问题
如何确定 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 中 项目设置下的管道 设置:
- 如果启用 将作业授权范围限制为当前项目的发布管道,则范围 项目。
- 否则,范围 集合。