Azure 中的自定义角色是什么?

已完成

有时,并不能通过内置角色获得所需的精确访问级别。 你可以通过自定义角色定义满足组织特定需求的角色。 可在订阅、资源组或资源范围将创建的 Azure 自定义角色分配给用户、组和服务主体。

本单元介绍 Azure 基于角色的访问控制 (RBAC) 中的自定义角色。

Microsoft Entra 和 Azure 角色

首次使用 Azure 时,Microsoft Entra 角色和 Azure 角色通常会混淆。 Microsoft Entra 角色提供管理 Microsoft Entra 资源的权限的机制,例如用户帐户和密码。 Azure 角色提供丰富的功能,可用于在精细级别管理虚拟机 (VM) 等 Azure 资源。

显示 Azure 角色和 Microsoft Entra 角色之间关系的关系图。

下表展示了这二者在设置和管理方法方面的细微差异:

Azure 角色 Microsoft Entra 角色
管理对 Azure 资源(例如 VM、存储、网络等)的访问 管理对 Microsoft Entra 资源的访问权限(如用户帐户和密码)
多个范围级别(管理组、订阅、资源组、资源) 范围仅为租户级别
可通过 Azure 门户、Azure CLI、Azure PowerShell、Azure 资源管理器模板和 REST API 访问的角色信息 可在 Azure 管理门户、Microsoft 365 管理中心、Microsoft Graph、Microsoft Graph PowerShell 中访问的角色信息

在我们的场景中,我们需要一个自定义角色来管理订阅范围的 Azure VM,因此需要在 Azure RBAC 中使用自定义角色。

自定义角色的分配和范围

拥有“用户访问管理员”或“所有者”角色的用户可在 Azure RBAC 中创建或分配自定义角色。

可将自定义角色分配至:

安全主体 概要
用户 在 Microsoft Entra ID 中具有配置文件的个体
在 Microsoft Entra ID 中创建的一组用户
服务主体 应用程序或服务用于访问特定 Azure 资源的安全标识
托管标识 在 Microsoft Entra ID 中由 Azure 自动管理的标识

可以将分配和相关权限的范围设定为 Azure 中的不同级别。 不同的范围包括:

  • 订阅
  • 资源组
  • 单个资源

显示角色分配范围及其相互关系的关系图。

角色定义和结构

一个自定义角色定义可分解为一组不同的权限。 每个定义都详细说明了允许执行的操作,例如读取、写入和删除。 定义采用以下结构:

{
  "Name": "",
  "IsCustom": true,
  "Description": "",
  "Actions": [],
  "NotActions": [],
  "DataActions": [],
  "NotDataActions": [],
  "AssignableScopes": [
    "/subscriptions/{subscriptionId1}"
  ]
}

以下示例显示“参与者”角色的角色定义:

{
  "Name": "Contributor",
  "Id": "b24988ac-6180-42a0-ab88-20f7382dd24c",
  "IsCustom": false,
  "Description": "Lets you manage everything except access to resources.",
  "Actions": [
    "*"
  ],
  "NotActions": [
    "Microsoft.Authorization/*/Delete",
    "Microsoft.Authorization/*/Write",
    "Microsoft.Authorization/elevateAccess/Action",
    "Microsoft.Blueprint/blueprintAssignments/write",
    "Microsoft.Blueprint/blueprintAssignments/delete"
  ],
  "DataActions": [],
  "NotDataActions": [],
  "AssignableScopes": [
    "/"
  ]
}

任何角色定义都是使用以下格式声明的:

{Company}.{ProviderName}/{resourceType}/{action}

操作部分通常是下列操作之一:

  • *
  • 读取
  • 写入
  • 操作
  • 删除

定义用于管理 VM 的自定义角色

为了帮助你确定要在角色定义中包含的权限,请使用 Azure 资源管理器资源提供程序操作列表,并查看具有与所需权限相似的权限的内置 Azure 角色。

查看内置角色

在我们的场景中,“虚拟机参与者”内置角色拥有的权限比员工需要的权限多,而“虚拟机管理员登录名”角色没有足够的权限。

以下 Azure CLI 命令返回“虚拟机参与者”内置角色的权限:

az role definition list --name "Virtual Machine Contributor" --output json | jq '.[] | .permissions[0].actions'

以下列表显示了“虚拟机参与者”内置角色的权限:

[
  "Microsoft.Authorization/*/read",
  "Microsoft.Compute/availabilitySets/*",
  "Microsoft.Compute/locations/*",
  "Microsoft.Compute/virtualMachines/*",
  "Microsoft.Compute/virtualMachineScaleSets/*",
  "Microsoft.DevTestLab/schedules/*",
  "Microsoft.Insights/alertRules/*",
  "Microsoft.Network/applicationGateways/backendAddressPools/join/action",
  "Microsoft.Network/loadBalancers/backendAddressPools/join/action",
  "Microsoft.Network/loadBalancers/inboundNatPools/join/action",
  "Microsoft.Network/loadBalancers/inboundNatRules/join/action",
  "Microsoft.Network/loadBalancers/probes/join/action",
  "Microsoft.Network/loadBalancers/read",
  "Microsoft.Network/locations/*",
  "Microsoft.Network/networkInterfaces/*",
  "Microsoft.Network/networkSecurityGroups/join/action",
  "Microsoft.Network/networkSecurityGroups/read",
  "Microsoft.Network/publicIPAddresses/join/action",
  "Microsoft.Network/publicIPAddresses/read",
  "Microsoft.Network/virtualNetworks/read",
  "Microsoft.Network/virtualNetworks/subnets/join/action",
  "Microsoft.RecoveryServices/locations/*",
  "Microsoft.RecoveryServices/Vaults/backupFabrics/backupProtectionIntent/write",
  "Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/*/read",
  "Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/read",
  "Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/write",
  "Microsoft.RecoveryServices/Vaults/backupPolicies/read",
  "Microsoft.RecoveryServices/Vaults/backupPolicies/write",
  "Microsoft.RecoveryServices/Vaults/read",
  "Microsoft.RecoveryServices/Vaults/usages/read",
  "Microsoft.RecoveryServices/Vaults/write",
  "Microsoft.ResourceHealth/availabilityStatuses/read",
  "Microsoft.Resources/deployments/*",
  "Microsoft.Resources/subscriptions/resourceGroups/read",
  "Microsoft.SqlVirtualMachine/*",
  "Microsoft.Storage/storageAccounts/listKeys/action",
  "Microsoft.Storage/storageAccounts/read",
  "Microsoft.Support/*"
]

若要在 PowerShell 中获取此列表,请运行以下命令:

Get-AzRoleDefinition -Name "Virtual Machine Contributor" | Select Actions | ConvertTo-Json

在我们的场景中,我们需要一个自定义角色用于监视和重启特定订阅的虚拟机,因此我们希望包括以下限定在订阅级别的操作:

  • 对计算、网络和存储资源的读取访问
  • 能够启动和重启虚拟机
  • 访问订阅中资源组
  • 访问监视的资源

虚拟机参与者角色定义中有一些操作可供我们执行,例如 "Microsoft.Insights/alertRules/*" 用于监视,但重启和其他一些操作并未作为操作在该角色定义中列出。

查找资源提供程序操作

若要查找 VM 重启操作,可以在 Azure 资源管理器资源提供程序操作列表中进行查找,也可运行 PowerShell 以下命令返回 VM 操作:

Get-AzProviderOperation */virtualMachines/*

系统将在列表中返回以下重启操作:

Operation         : Microsoft.Compute/virtualMachines/restart/action
OperationName     : Restart Virtual Machine
ProviderNamespace : Microsoft Compute
ResourceName      : Virtual Machines
Description       : Restarts the virtual machine
IsDataAction      : False

可以使用 Azure PowerShell Get-AzProviderOperation cmdlet 来获取资源提供程序操作的最新列表。 在 Azure CLI 中,使用 az provider operation show 命令。 可以在 Docs 网站上的 Azure RBAC 内容中找到已发布的资源提供程序和操作列表。

创建 VM 操作员角色定义

假设我们通过查看相关的内置角色定义和资源提供程序操作列表,选取了所需的内容。 最终为我们的自定义角色获得了以下角色定义。 我们会将此角色定义用于自定义角色。

   {
   "Name": "Virtual Machine Operator",
   "Id": "88888888-8888-8888-8888-888888888888",
   "IsCustom": true,
   "Description": "Can monitor and restart virtual machines.",
   "Actions": [
     "Microsoft.Storage/*/read",
     "Microsoft.Network/*/read",
     "Microsoft.Compute/*/read",
     "Microsoft.Compute/virtualMachines/start/action",
     "Microsoft.Compute/virtualMachines/restart/action",
     "Microsoft.Authorization/*/read",
     "Microsoft.ResourceHealth/availabilityStatuses/read",
     "Microsoft.Resources/subscriptions/resourceGroups/read",
     "Microsoft.Insights/alertRules/*",
     "Microsoft.Support/*"
   ],
   "NotActions": [],
   "DataActions": [],
   "NotDataActions": [],
   "AssignableScopes": [
      "/subscriptions/{subscriptionId1}" 
   ]
   }

知识检查

1.

Azure 自定义角色定义中包含哪些内容?

2.

哪些命令有助于确定要向自定义角色定义添加的操作?