针对存储库权限的 Microsoft Entra 基于属性的访问控制 (ABAC)(预览版)

Azure 容器注册表(ACR)支持 Microsoft Entra 属性基于的访问控制(ABAC) 来管理存储库权限。 此功能通过对容器注册表存储库启用更精细的权限管理来增强安全性。 ABAC 基于Microsoft Entra 基于角色的访问控制(RBAC)构建,方法是在角色分配中引入特定于存储库的条件。

ABAC 旨在通过 Microsoft Entra 基于角色的访问控制(RBAC)、Microsoft Entra 角色分配和Microsoft Entra 标识来管理存储库权限。 若要在不Microsoft Entra 的情况下管理存储库权限,请改用 非Microsoft基于 Entra 令牌的存储库权限

配置注册表角色分配权限模式

若要使用 Microsoft Entra ABAC 管理存储库权限,请确保注册表角色分配权限模式设置为“RBAC 注册表 + ABAC 存储库权限”。通过此模式,可以使用具有可选 ABAC 条件的 RBAC 角色分配(使用 ACR 内置角色)将角色分配限定为特定存储库。

可以在创建注册表期间或通过更新现有注册表来配置注册表的角色分配权限模式。 可以通过 Azure 门户或 Azure CLI 完成此角色分配。 无论其 SKU 如何,都可以为任何注册表启用 ABAC。

注释

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

对现有角色分配的影响

重要

如果将存储库配置为使用“RBAC 存储库 + ABAC 仓库权限”,则一些现有角色分配不会被尊重,因为对启用 ABAC 的存储库适用不同的 ACR 内置角色集。

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

有关基于方案的角色和注册表角色分配权限模式的详细信息,请参阅 ACR 内置角色的方案。 或者,有关每个角色的深入说明,请参阅 ACR 内置角色参考

创建启用了 ABAC 的注册表

通过 Azure 门户创建新注册表时,在“角色分配权限模式”下拉列表中选择“RBAC 注册表 + ABAC 存储库权限”选项。

启用了 ABAC 的新容器注册表的屏幕截图。

继续填写注册表创建表单的其余部分,然后单击“创建”以创建注册表。 有关创建注册表的详细信息,请参阅 使用 Azure 门户创建 Azure 容器注册表

更新现有注册表以启用 ABAC

若要查看注册表的现有角色分配权限模式,请导航到注册表的“属性”边栏选项卡。 当前角色分配权限模式显示在“角色分配权限模式”字段中。

若要更新现有注册表的“角色分配权限模式”,请选择“RBAC 注册表 + ABAC 存储库权限”,然后单击“保存”以更新注册表。

更新现有容器注册表以启用 ABAC 的屏幕截图。

分配 Microsoft Entra ABAC 存储库权限

可以使用 Azure 门户或 Azure CLI 将 Microsoft Entra ABAC 条件应用于角色分配,以限定在特定的存储库内。 本部分提供了有关如何为特定存储库、存储库前缀(通配符)或多个存储库前缀(多个通配符)添加 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 的角色时包含 ABAC 条件

有关基于方案的角色和注册表角色分配权限模式的详细信息,请参阅 ACR 内置角色的方案。 或者,有关每个角色的深入说明,请参阅 ACR 内置角色参考

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

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

导航到注册表的“访问控制(IAM)”边栏选项卡。 单击“添加”,然后选择“添加角色分配”。

添加角色分配的屏幕截图。

选择 Container Registry Repository Reader 为角色。

选择要分配的角色的屏幕截图。

然后选择一个身份以分配角色。

之后,继续转到“条件”选项卡。选择“添加条件”按钮以添加新的 ABAC 条件以限制角色分配范围。

添加角色分配条件的屏幕截图。

在 ABAC 条件生成器中选择“视觉对象”编辑器选项。

选择“视觉编辑器”选项的屏幕截图。

选择要在此存储库范围的角色分配中授予的操作(权限)。 对于大多数用例,请选择属于您之前选择的角色的所有操作(权限),确保身份只能在存储库范围内执行这些操作。

选择要授予的操作和权限的屏幕截图。

添加 ABAC 条件的表达式,以将角色分配限制为特定存储库。

为 ABAC 条件添加表达式的屏幕截图。

为表达式配置以下选项,将 ABAC 条件限定为特定存储库:

  • 属性源: Request
  • 属性:Repository name
  • 运算符:StringEqualsIgnoreCase
  • 值: <repository-name> - 存储库的全名。
    • 例如,如果完整存储库名称为 nginx,请输入 nginx
    • 如果完整存储库名称为 backend/nginx,请输入 backend/nginx

配置表达式以将 ABAC 条件限定为特定存储库的屏幕截图。

单击“保存”以保存 ABAC 条件。

查看角色分配 ABAC 条件。 评审页包含 ABAC 条件的代码表达式,该表达式可用于使用 Azure CLI 通过同一 ABAC 条件执行相同的角色分配。

查看 ABAC 条件以限定为特定存储库的屏幕截图。

单击“查看 + 分配”来执行角色分配。

创建角色分配后,可以查看、编辑或删除角色分配。 导航到注册表的“访问控制(IAM)”,然后选择“角色分配”选项卡以查看适用于注册表的现有角色分配列表。

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

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

如果已按照上述示例将 Container Registry Repository Reader 角色分配给特定存储库,则必须删除该角色分配(导航到“访问控制(IAM)”边栏选项卡并选择“角色分配”选项卡),然后创建一个范围限定为存储库前缀的具有 ABAC 条件的新角色分配。

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

在为 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)授予权限。

配置表达式以将 ABAC 条件限定为存储库前缀的屏幕截图。

单击“保存”以保存 ABAC 条件。

查看角色分配 ABAC 条件。 评审页包含 ABAC 条件的代码表达式,该表达式可用于使用 Azure CLI 通过同一 ABAC 条件执行相同的角色分配。

查看关于范围限定为存储库前缀的 ABAC 条件的屏幕截图。

单击“查看 + 分配”来执行角色分配。

创建角色分配后,可以查看、编辑或删除角色分配。 导航到注册表的“访问控制(IAM)”,然后选择“角色分配”选项卡以查看适用于注册表的现有角色分配列表。

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

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

如果已按照上述示例将 Container Registry Repository Reader 角色分配给特定存储库,则必须删除该角色分配(导航到“访问控制(IAM)”边栏选项卡并选择“角色分配”选项卡),然后创建一个范围限定为存储库前缀的具有 ABAC 条件的新角色分配。

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

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

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

  • 属性源: Request
  • 属性:Repository name
  • 运算符:StringStartsWithIgnoreCase
  • 值: <repository-prefix> - 存储库的前缀,包括尾部斜杠 /
    • 例如,若要向具有前缀backend/的所有存储库授予权限,例如backend/nginx,请输入backend/redisbackend/
    • 若要向具有前缀frontend/js/的所有存储库授予权限,例如frontend/js/react,请输入frontend/js/vuefrontend/js/

单击“添加表达式”。确保布尔运算符设置为“Or”。 可以选择“组”将表达式组合在一起,并控制计算顺序。 视觉编辑器还支持多个布尔运算符,包括“And”、“Or”、“分层分组”和反函数。

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

  • 属性源: 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

配置表达式以将 ABAC 条件限定为多个存储库前缀的屏幕截图。

单击“保存”以保存 ABAC 条件。

查看角色分配 ABAC 条件。 评审页包含 ABAC 条件的代码表达式,该表达式可用于使用 Azure CLI 通过同一 ABAC 条件执行相同的角色分配。

将 ABAC 条件的范围限定到多个存储库前缀的屏幕截图。

单击“查看 + 分配”来执行角色分配。

创建角色分配后,可以查看、编辑或删除角色分配。 导航到注册表的“访问控制(IAM)”,然后选择“角色分配”选项卡以查看适用于注册表的现有角色分配列表。

ABAC 条件的最大数目

Azure 门户每个角色分配仅支持有限数量的 ABAC 条件。

若要添加超过 Azure 门户对 ABAC 条件的限制,可以使用 Azure CLI 创建包含更多 ABAC 条件的角色分配。

后续步骤