能否为Azure容器注册表(ACR)中的特定仓库配置Azure RBAC角色分配?
好问题!其实Azure容器注册表(ACR)现在确实支持针对特定仓库的RBAC角色分配,你之前可能只是没找对正确的范围格式而已。下面分两部分来解答你的问题:
1. 确认仓库的正确范围(资源ID)
ACR的层级结构里,特定仓库的范围是在整个ACR资源ID的基础上追加固定路径:/subscriptions/<你的订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.ContainerRegistry/registries/<ACR名称>/repositories/<仓库名称>
举个实际例子:如果你的订阅ID是xxxx-xxxx-xxxx-xxxx,资源组叫my-app-rg,ACR实例是my-acr-registry,目标仓库是backend-api-images,那完整的仓库范围就是:/subscriptions/xxxx-xxxx-xxxx-xxxx/resourceGroups/my-app-rg/providers/Microsoft.ContainerRegistry/registries/my-acr-registry/repositories/backend-api-images
你可以先通过这条命令快速获取ACR的基础资源ID:
az acr show --name <ACR名称> --resource-group <资源组名称> --query id --output tsv
之后手动拼接/repositories/<仓库名称>就能得到仓库的专属范围。
2. 创建角色分配
用Azure CLI直接指定仓库范围即可完成分配,比如给某用户分配仅拉取镜像的AcrPull权限:
az role assignment create \ --assignee "user@yourdomain.com" \ --role "AcrPull" \ --scope "/subscriptions/<订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.ContainerRegistry/registries/<ACR名称>/repositories/<仓库名称>"
如果是给Azure AD组分配,把--assignee换成组的对象ID或组名就行。
目前支持作用于仓库级的ACR角色包括:
AcrPull:仅允许拉取镜像AcrPush:允许拉取和推送镜像AcrDelete:允许拉取、推送和删除镜像
对于ACR这类支持子资源级RBAC的资源,通用查询方法可以分为两步:
1. 查看资源支持的子资源类型
先通过az resource show获取父资源的信息,查看它支持哪些子资源类型。以ACR为例:
az resource show --name <ACR名称> --resource-group <资源组名称> --resource-type Microsoft.ContainerRegistry/registries --query properties.subresources --output json
返回结果里会看到ACR的子资源类型是repositories,也就是我们的仓库。
2. 列出所有子资源并生成范围
对于ACR,直接列出所有仓库:
az acr repository list --name <ACR名称> --output tsv
把每个仓库名称拼接到ACR的基础资源ID后面,就得到每个仓库的RBAC可用范围。
对于其他通用Azure资源,你可以用这条命令列出所有属于父资源的子资源ID(这些ID就是可用于RBAC分配的范围):
az resource list \ --resource-group <资源组名称> \ --query "[?contains(id, '<父资源ID>')].id" \ --output tsv
需要注意:不是所有Azure资源都支持子资源级的RBAC分配,具体要看对应资源的官方文档说明。如果某个资源不支持子资源级别,那只能在资源组、订阅或资源本身的层级分配角色。
内容的提问来源于stack exchange,提问作者Kyle N

