使用 Azure CLI 分配 Azure 角色

Azure 基于角色的访问控制 (Azure RBAC) 是用于管理 Azure 资源访问权限的授权系统。 若要授予访问权限,请将角色分配给特定范围内的用户、组、服务主体或托管标识。 本文介绍如何使用 Azure CLI 分配角色。

先决条件

若要分配角色,必须具有:

分配 Azure 角色的步骤

角色分配包含三个要素:安全主体、角色订阅和范围。

步骤 1:确定谁需要访问权限

可以将角色分配到用户、组、服务主体或托管标识。 若要分配角色,可能需要指定对象的唯一 ID。 ID 的格式为:11111111-1111-1111-1111-111111111111。 可以使用 Azure 门户或 Azure CLI 获取 ID。

用户

对于 Microsoft Entra 用户,获取用户主体名称,例如 patlong@contoso.com 或用户对象 ID。 若要获取对象 ID,可以使用 az ad user show

az ad user show --id "{principalName}" --query "id" --output tsv

对于 Microsoft Entra 组,需要组对象 ID。 若要获取对象 ID,可以使用 az ad group showaz ad group list

az ad group show --group "{groupName}" --query "id" --output tsv

服务主体

对于 Microsoft Entra 服务主体(应用程序使用的标识),需要服务主体对象 ID。 若要获取对象 ID,可以使用 az ad sp list。 对于服务主体,使用对象 ID,而不是应用程序 ID。

az ad sp list --all --query "[].{displayName:displayName, id:id}" --output tsv
az ad sp list --display-name "{displayName}"

托管的标识

对于系统分配的或用户分配的托管标识,你需要对象 ID。 若要获取对象 ID,可以使用 az ad sp list

az ad sp list --all --filter "servicePrincipalType eq 'ManagedIdentity'"

若要仅列出用户分配的托管标识,可以使用 az identity list

az identity list

步骤 2:选择合适的角色

权限组合成角色。 可以从包含多个 Azure 内置角色的列表中选择,也可以使用自己的自定义角色。 最佳做法是以所需的最少权限授予访问权限,因此避免分配范围更广泛的角色。

若要列出角色并获取唯一的角色 ID,可以使用 az role definition list

az role definition list --query "[].{name:name, roleType:roleType, roleName:roleName}" --output tsv

下面介绍了如何列出特定角色的详细信息。

az role definition list --name "{roleName}"

有关详细信息,请参阅列出 Azure 角色定义

步骤 3:识别所需的范围

Azure 提供四个级别的范围:资源、资源组、订阅,以及管理组。 最佳做法是以所需的最少权限授予访问权限,因此避免在更广泛的范围分配角色。 有关范围的详细信息,请参阅了解范围

资源范围

对于资源范围,你需要资源的资源 ID。 可以通过在 Azure 门户中查看资源的属性来找到资源 ID。 资源 ID 采用以下格式。

/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{providerName}/{resourceType}/{resourceSubType}/{resourceName}

资源组范围

对于资源组范围,你需要资源组的名称。 可以在 Azure 门户的 “资源组” 页上找到此名称,也可以使用 az group list

az group list --query "[].{name:name}" --output tsv

订阅范围

对于订阅范围,你需要订阅 ID。 可以在 Azure 门户中的“订阅”页上找到 ID,也可以使用 az account list

az account list --query "[].{name:name, id:id}" --output tsv

管理组范围

对于管理组范围,你需要管理组名称。 可以在 Azure 门户中的“管理组”页面上找到此名称,也可以使用 az account management-group list

az account management-group list --query "[].{name:name, id:id}" --output tsv

步骤 4:分配角色

若要分配角色,请使用 az role assignment create 命令。 根据范围,命令通常采用以下格式之一。

资源范围

az role assignment create --assignee "{assignee}" \
--role "{roleNameOrId}" \
--scope "/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{providerName}/{resourceType}/{resourceSubType}/{resourceName}"

资源组范围

az role assignment create --assignee "{assignee}" \
--role "{roleNameOrId}" \
--scope "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}"

订阅范围

az role assignment create --assignee "{assignee}" \
--role "{roleNameOrId}" \
--scope "/subscriptions/{subscriptionId}"

管理组范围

az role assignment create --assignee "{assignee}" \
--role "{roleNameOrId}" \
--scope "/providers/Microsoft.Management/managementGroups/{managementGroupName}"

下面显示了在资源组范围内将虚拟机参与者角色分配给用户时的输出示例。

{
  "canDelegate": null,
  "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
  "name": "{roleAssignmentId}",
  "principalId": "{principalId}",
  "principalType": "User",
  "resourceGroup": "{resourceGroupName}",
  "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/9980e02c-c2be-4d73-94e8-173b1dc7cf3c",
  "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}",
  "type": "Microsoft.Authorization/roleAssignments"
}

分配角色示例

为存储帐户资源范围中的所有 blob 容器分配角色

在名为 storage12345 的存储帐户的资源范围内将存储 Blob 数据参与者角色分配给对象 ID 为 55555555-5555-5555-5555-555555555555 的服务主体。

az role assignment create --assignee "55555555-5555-5555-5555-555555555555" \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Example-Storage-rg/providers/Microsoft.Storage/storageAccounts/storage12345"

为特定 blob 容器资源范围分配角色

在名为 blob-container-01 的 blob 容器的资源范围内将存储 Blob 数据参与者角色分配给对象 ID 为 55555555-5555-5555-5555-555555555555 的服务主体。

az role assignment create --assignee "55555555-5555-5555-5555-555555555555" \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Example-Storage-rg/providers/Microsoft.Storage/storageAccounts/storage12345/blobServices/default/containers/blob-container-01"

为特定虚拟网络资源范围内的某个组分配角色

虚拟机参与者角色分配给名为 pharma-sales-project-network 的虚拟网络的资源范围内 ID 为 22222222-2222-2222-2222-222222222222 的“Ann Mack 团队”组。

az role assignment create --assignee "22222222-2222-2222-2222-222222222222" \
--role "Virtual Machine Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/pharma-sales/providers/Microsoft.Network/virtualNetworks/pharma-sales-project-network"

在资源组范围内为某个用户分配角色

虚拟机参与者角色分配给 pharma-sales 资源组范围内的 patlong@contoso.com 用户。

az role assignment create --assignee "patlong@contoso.com" \
--role "Virtual Machine Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/pharma-sales"

在资源组范围内使用唯一角色 ID 为某个用户分配角色

很多时候角色名称可能会更改,例如:

  • 你使用的是自己的自定义角色,你决定更改名称。
  • 你使用的是预览版角色,其名称中有“(预览)”字样。 发布角色时重命名了角色。

即使重命名了角色,角色 ID 也不会更改。 如果使用脚本或自动化来创建角色分配,最佳做法是使用唯一的角色 ID 而非角色名称。 这样一来,即使角色重命名,脚本仍可以使用。

以下示例将虚拟机参与者角色分配给 pharma-sales 资源组范围内的 patlong@contoso.com 用户。

az role assignment create --assignee "patlong@contoso.com" \
--role "9980e02c-c2be-4d73-94e8-173b1dc7cf3c" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/pharma-sales"

在资源组范围内为所有 blob 容器分配角色

在 Example-Storage-rg 资源组范围内将存储 Blob 数据参与者角色分配给对象 ID 为 55555555-5555-5555-5555-555555555555 的服务主体。

az role assignment create --assignee "55555555-5555-5555-5555-555555555555" \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/Example-Storage-rg"

在资源组范围内为某个应用程序分配角色

在 pharma-sales 资源组范围内将虚拟机参与者角色分配给服务主体对象 ID 为 44444444-4444-4444-4444-444444444444 的应用程序。

az role assignment create --assignee "44444444-4444-4444-4444-444444444444" \
--role "Virtual Machine Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/pharma-sales"

在资源组范围内为某个新的服务主体分配角色

如果创建新的服务主体并立即尝试将角色分配给该服务主体,则在某些情况下该角色分配可能会失败。 例如,如果使用脚本创建新的托管标识,然后尝试将角色分配给该服务主体,则角色分配可能会失败。 此失败的原因可能是复制延迟。 服务主体是在一个区域中创建的;但是,角色分配可能发生在尚未复制服务主体的另一个区域中。 若要解决这种情况,应该在创建角色分配时指定主体类型。

若要分配角色,请使用 az role assignment create,为 --assignee-object-id 指定值,然后将 --assignee-principal-type 设置为 ServicePrincipal

az role assignment create --assignee-object-id "{assigneeObjectId}" \
--assignee-principal-type "{assigneePrincipalType}" \
--role "{roleNameOrId}" \
--scope "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}"

以下示例将“虚拟机参与者”角色分配给“pharma-sales”资源组范围内的 msi-test 托管标识:

az role assignment create --assignee-object-id "33333333-3333-3333-3333-333333333333" \
--assignee-principal-type "ServicePrincipal" \
--role "Virtual Machine Contributor" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/pharma-sales"

在订阅范围内为某个用户分配角色

读取者角色分配给订阅范围内的 annm@example.com 用户。

az role assignment create --assignee "annm@example.com" \
--role "Reader" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000"

在订阅范围内为某个组分配角色

在订阅范围内将读者角色分配给 ID 为 22222222-2222-2222-2222-222222222222 的“Ann Mack 团队”组。

az role assignment create --assignee "22222222-2222-2222-2222-222222222222" \
--role "Reader" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000"

在订阅范围内为所有 blob 容器分配角色

在订阅范围内将存储 Blob 数据读者角色分配给 alain@example.com 用户。

az role assignment create --assignee "alain@example.com" \
--role "Storage Blob Data Reader" \
--scope "/subscriptions/00000000-0000-0000-0000-000000000000"

在管理组范围内为某个用户分配角色

在管理组范围内将账单读取者角色分配给 alain@example.com 用户。

az role assignment create --assignee "alain@example.com" \
--role "Billing Reader" \
--scope "/providers/Microsoft.Management/managementGroups/marketing-group"

后续步骤