Compartilhar via

了解Azure角色分配

通过角色分配,可以授予主体(例如用户、组、托管标识或服务主体)对特定Azure资源的访问权限。 本文介绍角色分配的详细信息。

角色分配

通过创建角色分配授予对Azure资源的访问权限,通过删除角色分配来撤销访问权限。

角色分配有多个组成部分,包括:

  • 分配了角色的“主体”或“被指派角色的人员”。
  • 分配给他们的“角色”。
  • 分配角色的范围。
  • 角色分配的“名称”,以及帮助你解释分配角色的原因的“说明”。

例如,可以使用 Azure RBAC 分配角色,例如:

  • 用户 Sally 对资源组“ContosoStorage”中的存储帐户“contoso123”拥有所有者访问权限。
  • Microsoft Entra ID云管理员组中的每个人都有权访问资源组ContosoStorage中的所有资源。
  • 与应用程序关联的托管标识被允许在 Contoso 的订阅中重新启动虚拟机。

下面显示了使用 Azure PowerShell

{
  "RoleAssignmentName": "00000000-0000-0000-0000-000000000000",
  "RoleAssignmentId": "/subscriptions/11111111-1111-1111-1111-111111111111/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000000",
  "Scope": "/subscriptions/11111111-1111-1111-1111-111111111111",
  "DisplayName": "User Name",
  "SignInName": "user@contoso.com",
  "RoleDefinitionName": "Contributor",
  "RoleDefinitionId": "b24988ac-6180-42a0-ab88-20f7382dd24c",
  "ObjectId": "22222222-2222-2222-2222-222222222222",
  "ObjectType": "User",
  "CanDelegate": false,
  "Description": null,
  "ConditionVersion": null,
  "Condition": null
}

下面显示了使用 Azure CLIREST API

{
  "canDelegate": null,
  "condition": null,
  "conditionVersion": null,
  "description": null,
  "id": "/subscriptions/11111111-1111-1111-1111-111111111111/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000000",
  "name": "00000000-0000-0000-0000-000000000000",
  "principalId": "22222222-2222-2222-2222-222222222222",
  "principalName": "user@contoso.com",
  "principalType": "User",
  "roleDefinitionId": "/subscriptions/11111111-1111-1111-1111-111111111111/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
  "roleDefinitionName": "Contributor",
  "scope": "/subscriptions/11111111-1111-1111-1111-111111111111",
  "type": "Microsoft.Authorization/roleAssignments"
}

下表说明了角色分配属性的含义。

属性 说明
RoleAssignmentName
name
角色分配名称,即全局唯一标识符 (GUID)。
RoleAssignmentId
id
角色分配的唯一 ID,其中包括名称。
Scope
scope
角色分配的范围限定为Azure资源标识符。
RoleDefinitionId
roleDefinitionId
角色的唯一 ID。
RoleDefinitionName
roleDefinitionName
角色的名称。
ObjectId
principalId
Microsoft Entra 对象标识符是指已分配角色的主体。
ObjectType
principalType
主体表示的 Microsoft Entra 对象的类型。 有效值包括 UserGroupServicePrincipal
DisplayName 用户角色分配中的用户显示名称。
SignInName
principalName
用户的唯一主体名称 (UPN),或者与服务主体关联的应用程序的名称。
Description
description
角色分配的说明。
Condition
condition
使用角色定义和属性中的一个或多个操作生成的条件语句。
ConditionVersion
conditionVersion
条件版本号。 默认为 2.0,这是唯一受支持的版本。
CanDelegate
canDelegate
未实现。

Scope

当创建角色分配时,需要指定它的应用范围。 范围代表主体可以访问的资源或资源集。 可以将角色分配的范围限定为单个资源、资源组、订阅或管理组。

提示

使用满足您需求所需的最小范围。

例如,如果需要向单个存储帐户授予托管标识访问权限,好的安全的做法是在存储帐户范围内创建角色分配,而不是在资源组或订阅范围内创建角色分配。

有关范围的详细信息,请参阅了解范围

要分配的角色

角色分配与角色定义相关联。 角色定义指定了主体在角色分配范围内应该拥有的权限。

可以分配内置角色定义或自定义角色定义。 创建角色分配时,一些工具会要求你使用角色定义 ID,而其他工具允许你提供角色的名称。

有关角色定义的详细信息,请参阅了解角色定义

主体

主体包括用户、安全组、托管标识、工作负载标识和服务主体。 主体在Microsoft Entra租户中创建和管理。 你可以向任一主体分配角色。 使用 Microsoft Entra ID 对象 ID 来标识要向其分配角色的主体。

使用 Azure PowerShell、Azure CLI、Bicep 或其他基础架构即代码(IaC)技术创建角色分配时,请指定 主体类型。 主体类型包括“用户”、“组”和“服务主体”。 请务必指定正确的主体类型。 否则,可能会遇到间歇性部署错误,尤其是在使用服务主体和托管标识时。

未找到身份标识的角色分配

从Microsoft Entra ID中删除用户、组、服务主体或托管标识时,最好删除任何角色分配。 不会自动删除角色分配。 在 Azure 门户中,引用已删除主体 ID 的角色分配会显示为身份未找到。 如果存在有效的Microsoft Entra ID令牌且令牌尚未过期,则角色分配将继续授予对已删除的安全主体的访问权限。 有关详细信息,请参阅症状 - 找不到具有标识的角色分配

名称

角色分配的资源名称必须是全局唯一标识符 (GUID)。

角色分配资源名称在Microsoft Entra租户中必须唯一,即使角色分配的范围更窄。

提示

使用Azure门户、Azure PowerShell或Azure CLI创建角色分配时,创建过程会自动为角色分配提供唯一的名称。

如果您使用Bicep或其他基础架构即代码(IaC)技术来创建角色分配,则需要仔细规划角色分配的命名方式。 有关详细信息,请参阅 使用 Bicep 创建 Azure RBAC 资源

重用角色分配名称

如果尝试使用已经用于其他角色分配的名称来创建新的角色分配,则部署会失败。 使用Bicep或Azure 资源管理器模板(ARM 模板)部署角色分配时,更有可能发生此问题,因为在使用这些工具时必须显式设置角色分配名称。 若要解决此问题,应在重新创建旧角色分配之前删除旧角色分配,或者确保在部署新角色分配时使用唯一名称。

说明

可以向角色分配添加文本说明。 虽然说明是可选的,但是最好将它们添加到角色分配中。 提供简短的理由解释主体为何需要分配的角色。 当相关人员审核角色分配时,这些说明可以帮助其了解为何创建这些角色以及这些角色是否仍然适用。

条件

一些角色支持“角色分配条件”,这些条件基于特定操作的上下文中的属性。 角色分配条件是一项额外检查,你可选择将其添加到角色分配中,来提供更精细的访问控制。

例如,你可以添加一个条件,要求某一对象具有特定的标记,以便用户读取该对象。

我们通常使用可视化对象条件编辑器来生成条件,不过下面的示例展示的是代码中的条件:

((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEqualsIgnoreCase 'Cascade'))

上述条件允许用户读取 Blob 对象的索引标签键为 Project,值为 Cascade

有关条件的详细信息,请参阅 Azure什么是基于属性的访问控制(Azure ABAC)?

后续步骤