Azure 中的自定义角色是什么?
有时,并不能通过内置角色获得所需的精确访问级别。 你可以通过自定义角色定义满足组织特定需求的角色。 可在订阅、资源组或资源范围将创建的 Azure 自定义角色分配给用户、组和服务主体。
本单元介绍 Azure 基于角色的访问控制 (RBAC) 中的自定义角色。
Microsoft Entra 和 Azure 角色
首次使用 Azure 时,Microsoft Entra 角色和 Azure 角色通常会混淆。 Microsoft Entra 角色提供管理 Microsoft Entra 资源的权限的机制,例如用户帐户和密码。 Azure 角色提供丰富的功能,可用于在精细级别管理虚拟机 (VM) 等 Azure 资源。
下表展示了这二者在设置和管理方法方面的细微差异:
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}"
]
}