Azure 容器注册表中的 Azure 基于属性的访问控制 (Azure ABAC) 存储库权限

Azure 容器注册表(ACR)支持 Azure 基于属性的访问控制(Azure ABAC) 来管理存储库权限。 此功能通过对容器注册表存储库启用更精细的权限管理来增强安全性。

Azure ABAC 基于 Azure 角色的访问控制(Azure RBAC)在角色分配中引入特定于存储库的条件。 通过使用 Azure ABAC,可以基于属性授予对存储库资源的安全主体访问权限。

本文介绍如何为容器注册表中的存储库权限启用 Azure ABAC、更改角色分配权限模式的影响,以及如何使用 ABAC 条件配置角色分配。

配置角色分配权限模式设置

若要使用 Azure ABAC 管理存储库权限,请将注册表 的角色分配权限模式 设置为 RBAC 注册表 + ABAC 存储库权限。 此模式允许您使用可选的 ABAC 条件将角色分配限制于特定的存储库,同时还可以通过使用 ACR 内置角色进行 RBAC 角色分配。

可以在创建注册表时配置 角色分配权限模式 ,也可以更新任何现有注册表上的设置。 可以通过 Azure 门户Azure CLI 设置此配置。

如果更改现有注册表的设置,请务必了解对现有角色分配和任务的影响,如以下部分所述。

注释

确保已安装最新版本的 Azure CLI,方法是运行 Azure CLI 命令 az upgrade。 此外,如果以前曾参与过此功能的专用预览版,则可能已安装自定义的专用预览版扩展来管理 ACR ABAC。 不再需要此自定义扩展,应通过运行 Azure CLI 命令 az extension remove --name acrabac卸载(以避免冲突)。

对现有角色分配的影响

如果将注册表配置为使用 RBAC 注册表 + ABAC 存储库权限,请注意,某些现有角色分配不受遵守或产生不同影响。 不同的 ACR 内置角色集适用于已启用 ABAC 的注册表。

例如,在启用 ABAC 的注册表中,AcrPullAcrPushAcrDelete 角色不被承认。 相反,在已启用 ABAC 的注册表中,使用Container Registry Repository ReaderContainer Registry Repository WriterContainer Registry Repository Contributor角色授予注册表范围或特定于存储库的映像权限。

此外,特权角色(例如OwnerContributorReader)在已启用 ABAC 的注册表中具有不同的效果。 在这些存储库中,这些特权角色仅授予控制平面权限来创建、更新和删除注册表本身,而无需向注册表中的存储库和映像授予数据平面权限。

有关这些角色的详细信息,请参阅 Azure 容器注册表权限和角色分配概述。 或者,有关每个角色的深入说明,请参阅 ACR 内置角色参考

对 ACR 任务、快速任务、快速生成和快速运行的影响

如果将注册表配置为使用 RBAC 注册表 + ABAC 存储库权限、新的和现有的 ACR 任务以及快速任务、快速生成和快速运行,将受到影响。 它们不再具有对已启用 ABAC 的源注册表及其内容的默认数据平面访问权限。

若要了解此更改的影响(以及如何授予 ACR 任务、快速任务、快速生成和已启用 ABAC 的源注册表中的快速运行的数据平面访问权限),请参阅 在 ACR 任务、快速任务、快速生成和快速运行上启用 ABAC 的影响

创建启用了 ABAC 的注册表

可以使用 Azure 门户或 Azure CLI 启用 Azure ABAC。

通过 Azure 门户创建新注册表时,为角色分配权限模式选择RBAC 注册表 + ABAC 存储库权限

显示门户中容器注册表创建设置的屏幕截图。

更新现有注册表以启用 ABAC

重要

更改现有注册表的角色分配权限模式可能会影响现有角色分配和任务,如前面的部分所述。 在更改设置之前,请务必查看这些效果。

若要查看注册表的现有角色分配权限模式,请转到 Azure 门户中的注册表。 在服务菜单中的 “设置”下,选择“ 属性”,然后检查 “角色分配权限”模式 设置。

若要启用 Azure RBAC,请选择 RBAC 注册表 + ABAC 存储库权限,然后选择“ 保存”。

配置 Azure ABAC 存储库权限

可以使用 Azure 门户或 Azure CLI,将 Azure ABAC 条件应用于特定存储库的角色分配,以限制或指定角色范围。

小窍门

Azure 门户每个角色分配仅支持有限数量的 ABAC 条件。 若要添加更多 ABAC 条件,请使用 Azure CLI。

本部分提供了有关如何为特定存储库、存储库前缀(通配符)或多个存储库前缀(多个通配符)添加 ABAC 条件的示例。

已启用 ABAC 的内置角色

以下 ACR 内置角色是已启用 ABAC 的角色。 可以将可选的 ABAC 条件指定为以下角色,将角色分配的范围限定为特定的存储库。

  • Container Registry Repository Reader - 已启用 ABAC 的角色,授予对容器注册表中存储库内映像、标记和元数据的读取权限。
  • Container Registry Repository Writer - 已启用 ABAC 的角色,授予对容器注册表中存储库内映像、标记和元数据的读取、写入和更新权限。
  • Container Registry Repository Contributor - 启用 ABAC 的角色,授予在注册表存储库中 读取、写入、更新和删除 镜像、标签和元数据的权限。

这些角色不支持列出注册表中存储库的权限。 若要列出注册表中的所有存储库(未授予读取存储库内容的权限),还必须分配角色 Container Registry Repository Catalog Lister 。 此单独的角色不支持 ABAC 条件,因此它始终有权列出注册表中的所有存储库。

重要

如果在没有 ABAC 条件的情况下分配启用了 ABAC 的角色,则角色分配的范围不限定于存储库。 此角色分配充当注册表范围的角色分配,向注册表中的所有存储库授予权限。 若要将角色分配限定为特定存储库,请在分配已启用 ABAC 的角色时包括 ABAC 条件

有关这些角色的详细信息,请参阅 Azure 容器注册表权限和角色分配概述ACR 内置角色参考

将角色分配的范围限定为特定存储库

此示例分配 Container Registry Repository Reader 角色以向单个存储库授予拉取权限。 通过添加 ABAC 条件,角色分配允许标识仅从指定的存储库拉取映像、查看标记和读取元数据,从而阻止访问注册表中的其他存储库。

  1. 转到 Azure 门户中的注册表。 在服务菜单中,选择“访问控制”(IAM)。

  2. 选择“添加”,然后选择“添加角色分配”

  3. 搜索 Container Registry Repository Reader。 选择该角色,然后选择“ 下一步”。

  4. 在“ 成员 ”选项卡中,指定应为其分配此角色的标识,然后选择“ 下一步”。

  5. 在“ 条件 ”选项卡中,选择“ 添加条件”。

  6. 确保为编辑器类型选择视觉

  7. 条件 #1 下,选择属于此角色并希望在此存储库范围的角色分配中授予的操作(权限)。 在大多数情况下,选择所有操作,以将此角色的身份执行的所有操作限制在存储库范围内。 选取“选择”,保存所做的更改。

    选择用于授予 Azure ABAC 角色分配的操作和权限的屏幕截图。

  8. 接下来,在 “生成”表达式下,选择“ 添加表达式”。 为表达式配置以下选项,将 ABAC 条件限定为特定存储库:

    • 属性源Request
    • 属性Repository name
    • 操作员StringEqualsIgnoreCase
    • <repository-name> - 存储库的全名

    在 Azure ABAC 角色分配中生成表达式的屏幕截图。

  9. 选择 “保存” 以保存 ABAC 条件,然后查看 ABAC 条件的代码表达式。 可以使用此代码通过 Azure CLI 使用相同的 ABAC 条件执行相同的角色分配。

    查看 Azure ABAC 角色分配中表达式的代码的屏幕截图。

  10. 选择 “查看 + 分配 ”以完成角色分配。

创建角色分配后,可以通过选择角色分配在注册表的访问控制(IAM)页中查看、编辑或删除它。

使用存储库前缀(通配符)将角色分配范围限定为多个存储库

在此示例中,你将分配角色 Container Registry Repository Reader 以向具有通用前缀(通配符)的多个存储库授予拉取权限。 通过添加 ABAC 条件,此角色分配允许标识仅从具有通用前缀的存储库拉取映像、查看标记和读取元数据,同时阻止访问注册表中的其他存储库。

如果按照前面的示例将角色分配给 Container Registry Repository Reader 特定存储库,请在创建新存储库之前删除该角色分配。 可以在访问控制(IAM)中通过选择角色分配,选择相应的角色分配,然后选择“删除”来删除该角色分配。

  1. 按照 与上一示例中 相同的步骤,使用 ABAC 条件执行角色分配。

  2. 在为 ABAC 条件添加表达式的步骤中,配置 ABAC 条件的表达式,以将角色分配范围限定为具有通用前缀(通配符)的多个存储库。 配置以下选项:

    • 属性源Request

    • 属性Repository name

    • 操作员StringStartsWithIgnoreCase

    • <repository-prefix> - 存储库的前缀,包括尾部斜杠 /。 例如,若要向具有前缀backend/的所有存储库授予权限,例如backend/nginx,请输入backend/redisbackend/。 若要向具有前缀frontend/js/的所有存储库授予权限,例如frontend/js/react,请输入frontend/js/vuefrontend/js/

      重要

      ABAC 条件表达式的 / 字段中需要使用尾随左斜线 Value。 如果未包含尾部斜杠 /,则可能无意中向与前缀不匹配的其他存储库授予权限。 例如,如果输入backend时省略尾部斜杠/,则角色分配会向具有前缀backend的所有存储库(例如backend/nginxbackend/redisbackend-infra/k8sbackend-backup/storebackendbackendsvc/containers)授予权限。

  3. 选择 “保存” 以保存 ABAC 条件,然后查看 ABAC 条件的代码表达式。

  4. 选择 “查看 + 分配 ”以完成角色分配。

使用多个存储库前缀(多个通配符)将角色分配范围限定为多个存储库

在此示例中,你将分配角色 Container Registry Repository Reader 以在两个不同的前缀(多个通配符)下向多个存储库授予拉取权限。 通过添加 ABAC 条件,此角色分配允许标识仅从指定的存储库拉取映像、查看标记和读取元数据,从而阻止访问注册表中的其他存储库。

如果按照前面的示例将角色分配给 Container Registry Repository Reader 特定存储库前缀,请在创建新角色之前删除该角色分配。 可以在访问控制(IAM)中通过选择角色分配,选择相应的角色分配,然后选择“删除”来删除该角色分配。

  1. 按照与 第一个示例中 相同的步骤执行 ABAC 条件的角色分配。

  2. 在为 ABAC 条件添加表达式的步骤中,将两个表达式配置为将角色分配范围限定为两个前缀下的多个存储库: backend/frontend/js/ (多个通配符)。 在每个前缀中包含尾部斜杠 /

    对于第一个表达式,请配置以下选项:

    • 属性源Request
    • 属性Repository name
    • 操作员StringStartsWithIgnoreCase
    • backend/
  3. 选择“添加表达式”。 视觉编辑器还支持多个布尔运算符,包括 AndOr、分层分组和求反。 对于此示例,请确保布尔运算符设置为 Or

  4. 对于第二个表达式,请配置以下选项:

    • 属性源Request
    • 属性Repository name
    • 操作员StringStartsWithIgnoreCase
    • frontend/js/

    显示配置具有多个存储库前缀的 ABAC 条件的示例的屏幕截图。

  5. 选择 “保存” 以保存 ABAC 条件,然后查看 ABAC 条件的代码表达式。

  6. 选择 “查看 + 分配 ”以完成角色分配。

对 ACR 任务、快速任务、快速生成和快速运行启用 ABAC 的影响

启用 Azure ABAC 为容器注册表中的存储库权限时,需将 角色分配权限模式 设置为 RBAC 注册表 + ABAC 存储库权限,这将影响新的和现有的 ACR 任务,以及快速任务、快速构建和快速执行。 请查看以下部分,了解这些影响以及如何在已启用 ABAC 的源注册表中为这些任务授予数据平面访问权限。

对 ACR 任务的影响

使用 “RBAC 注册表 + ABAC 存储库权限”配置注册表时,新的和现有的 ACR 任务不再具有对源注册表的默认数据平面访问权限,包括其映像和存储库中的项目。

必须为新 ACR 任务和现有 ACR 任务明确附加并设置一个用于对已启用 ABAC 的源注册表进行身份验证的标识。 然后,向上述身份授予适当的 ACR 内置角色,以便启用该身份对注册表存储库的身份验证和访问权限。

将标识附加到用于源注册表访问的新 ACR 任务

对于已启用 ABAC 的源注册表,请使用az acr task create--source-acr-auth-id标志来指定任务用于对源注册表进行身份验证的标识。

可以为--source-acr-auth-id标志指定以下选项之一:

  • --source-acr-auth-id [system] - 绑定系统分配的托管标识。
  • --source-acr-auth-id $resourceId - 使用其资源 ID 附加用户分配的托管标识。

附加标识后,请为其分配 ACR 内置角色(可选使用 ABAC 条件)来授予适当的权限。

更新现有 ACR 任务以使用标识进行源注册表访问

对于启用了 ABAC 的源注册表,请使用与 az acr task update 相同的 --source-acr-auth-id 选项来分配或更改任务用于向源注册表进行身份验证的标识。 与新任务一样,请跟进相应的角色分配。

从 ACR 任务中删除源注册表访问权限

若要显式阻止 ACR 任务使用已启用 ABAC 的源注册表进行身份验证,并阻止任务对源注册表的权限,请设置 --source-acr-auth-id none。 此操作将禁用任务执行对源注册表及其内容的任何操作的能力。

注释

注意:已启用 ABAC 的注册表不再支持 --auth-mode 标志,该标志已被弃用,不再用于控制 ACR 任务的访问。

对快速任务、快速生成和快速运行的影响

使用 “RBAC 注册表 + ABAC 存储库权限”配置注册表时,新的快速任务(如 快速生成快速运行 )不再具有对源注册表的默认数据平面访问权限,包括其映像和存储库中的项目。 对于快速任务,必须使用调用方的身份向源注册表验证快速任务。 调用方的身份必须具有适当的 ACR 内置角色才能启用对注册表存储库的身份验证和访问权限。

使用调用方标识运行快速任务以访问源注册表

对于已启用 ABAC 的源注册表,请使用 az acr buildaz acr run--source-acr-auth-id [caller] 选项一起使用,以将调用者的身份指定为快速任务用于向源注册表进行身份验证的身份。 在运行快速任务之前,请确保调用方的身份具备恰当的 ACR 内置角色,以启用身份验证并访问源注册表及其存储库。

在没有源注册表访问权限的情况下运行快速任务

若要在没有任何源注册表访问权限的情况下运行快速任务,请使用 az acr buildaz acr run--source-acr-auth-id none 选项。 此设置禁用快速任务执行对源注册表及其内容的任何操作的能力。