Azure Role Base Access Control (
基本
云平台资源的接入管理(access management)对于任何使用云的组织都是一个至关重要的功能。Azure的基于角色的接入控制(RBAC)帮用户管理了,1) 谁可以接入Azure资源,2)可以用这些资源做什么,3)可以接入哪些资源。
Azure的RBAC是建立在Azure资源管理器之上得到授权系统(authorisation system),为Azure 资源提供了精细化的接入管理。
RBAC的具体案例如下:
- 允许一个用户管理订阅(subsription)的虚拟机(VM),以及另一个用户管理虚拟网络(VN)
- 允许一个DBA组管理订阅中的SQL数据库
- 允许一个用户管理一个资源组(resourece group)中的所有资源,比如VM,网页和子网
- 允许一个应用接入一个资源组的所有资源
RBAC如何工作
使用RBAC做资源接入控制的方式是分配Azure角色,也就是如何执行和赋予权限(permission)。角色分批包括三个元素,1) security principal,2) role defition角色定义,和3) scope。
-
security principal:代表了用户、组、service principal或者managed identity中的任意一个对象,该对象申请接入Azure资源。可将一个角色分配给任何一个security principals。其中的managed identity是用Azure自动管理的有Entra ID的个体。
rbac-security-principal.png -
角色定义:是权限的合集(a collection of permission),一般被称作一个角色(role)。角色定义列出了可以执行的动作,比如读、写、删除。角色可以是high level的,如所有者(owner),或比较具体的,VM的使用者
rbac-role-definition.png
Azure引入多个内建的角色。比如VM贡献者,允许用户创建和使用VM。如果内建角色无法满足用户需求,可定制化角色。
Azure可在对象内部赋给数据的接入权限,比如一个用户有一个存储账户的读权限,该用户可读该存储张的blobs或消息。
- Scope:Scope是接入应用的一系列资源(a set of resourcess that the access applies to)。分配角色时,可进一步限制角色的动作,该限制由scope提供。比如赋予某人website贡献者的角色,但仅限于在一个resource group中有效。
Azure中可指定的scope分为四级:1. management group, 2. subscription, 3. resource group, 4. resource。Scope以母子关系组织,可在任何一级分配角色。
rbac-scope.png
(2024.06.24 Mon @KLN)
-
角色分配(role assignment):角色分配是将角色定义与用户、组、service principal或managed identity在特定scope上为了赋予接入权限(grant access)而绑定的过程。创建角色分配,则授予了接入权限;移除角色分配则收回权限(revoke access)。
下图展示了角色分配的案例。营销组(marketing groupp)被分配了药品销售(pharma-sales)资源组中的Contributor角色,也就说营销组中的用户可在药品销售资源组中创建和管理任何Azure资源。营销组成员用户不能接入/使用药品销售资源组以外的资源,除非被分配了对应的角色。
rbac-role-assignment-overview.png
分配角色的方式包括,Azure portal, Azure CLI,Azure PowerShell,Azure SDKs,或REST APIs。
-
组群Group:对组群来说,角色分配有穿透性(transitive),也就是一个用户是某组群A
的成员,而组群A是另一个组群B的成员,组群B有角色分配,则该用户也拥有组群B的角色分配。 -
多角色分配:如果用户被分配了重叠的角色(overlapping role assignments)会出现什么结果?Azure RBAC是加性模型(additive model),有效的权限是角色分配之和。在下面案例中,一个用户在subscription scope被分配了Contributor角色,在resource group scope中被分配了Reader角色。两者之后也就是在subscription的Contributor角色,也就是Reader角色没有影响。
rbac-multiple-roles.png
Role Definition
(2024.06.25 Tues)
角色定义,或简称角色(role)是一系列许可/权限的合集。角色定义列出了可以执行的动作,如读、写、删除,也列出了不可以对底层数据进行的动作。
在用Azure PowerShell显示时,角色定义包含下列字段:
- Name
- Id
- IsCustom
- Description
- Actions []
- NotActions []
- DataActions []
- NotDataActions []
- AssignableScopes []
- Condition
- ConditionVersion
用REST APIs或AZURE CLI显示,角色定义包含下列字段:
- roleName
- name
- id
- roleType
- type
- description
- actions []
- notActions []
- dataActions []
- notDataActions []
- assignableScopes []
- condition
- conditionVersion
- createdOn
- updatedOn
- createdBy
- updatedBy
案例,在Azure PowerShell下的一个contributor role,以json形式表示如下
{
"Name": "Contributor",
"Id": "b24988ac-6180-42a0-ab88-20f7382dd24c",
"IsCustom": false,
"Description": "Grants full access to manage all resources, but does not allow you to assign roles in Azure RBAC, manage assignments in Azure Blueprints, or share image galleries.",
"Actions": [
"*"
],
"NotActions": [
"Microsoft.Authorization/*/Delete",
"Microsoft.Authorization/*/Write",
"Microsoft.Authorization/elevateAccess/Action",
"Microsoft.Blueprint/blueprintAssignments/write",
"Microsoft.Blueprint/blueprintAssignments/delete",
"Microsoft.Compute/galleries/share/action",
"Microsoft.Purview/consents/write",
"Microsoft.Purview/consents/delete"
],
"DataActions": [],
"NotDataActions": [],
"AssignableScopes": [
"/"
],
"Condition": null,
"ConditionVersion": null
}
字段说明
Property | Description |
---|---|
Name /roleName
|
角色的显示名 |
Id /name
|
该角色的唯一ID,内建角色在云平台内只有一个ID |
id |
角色的fully qualified unique ID,即便该角色被改名,角色ID也不会变,建议在代码中使用该id |
IsCustom /roleType
|
角色是否为自定义角色,值为true /CustomeRole 则为自定义,值为false /BuiltInRole 则为内建角色 |
type |
对象类型,设置为Microsoft.Authorization/roleDefinitions
|
Description /description
|
角色描述 |
Actions /actions
|
指定该角色可以执行的动作,列表形式 |
NotActions /notActions
|
指定了该角色不能执行的动作,列表形式 |
DataActions /dataActions
|
指定了该角色可以对对象中的数据执行的操作,列表形式 |
NotDataActions /notDataActions
|
指定了该角色不可以对对象中的数据执行的操作,列表形式 |
AssignableScopes /assignableScopes
|
指定了角色可以分配的scope(scopes that the role is available for assignment),列表形式 |
Condition /condition
|
对于内建角色,基于角色定义的动作的条件声明 |
ConditionVersion /conditionVersion
|
条件版本号,默认2.0,且为唯一支持版本 |
注意上面案例中的Actions
字段,该字段的格式如下
{Company}.{ProviderName}/{resourceType}/{action}
其中的{action}
部分指明了可以对该resourceType
执行的动作,可能包含如下动作
Action substring | Description |
---|---|
* |
wildcard符号含所有动作 |
read |
读(GET) |
write |
写(PUT/PATCH) |
action |
诸如重启VM(POST) |
delete |
删除(DELETE) |
另一个案例,在Azure CLI中表示的角色,以json形式表达
[
{
"assignableScopes": [
"/"
],
"createdBy": null,
"createdOn": "2015-02-02T21:55:09.880642+00:00",
"description": "Grants full access to manage all resources, but does not allow you to assign roles in Azure RBAC, manage assignments in Azure Blueprints, or share image galleries.",
"id": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
"name": "b24988ac-6180-42a0-ab88-20f7382dd24c",
"permissions": [
{
"actions": [
"*"
],
"condition": null,
"conditionVersion": null,
"dataActions": [],
"notActions": [
"Microsoft.Authorization/*/Delete",
"Microsoft.Authorization/*/Write",
"Microsoft.Authorization/elevateAccess/Action",
"Microsoft.Blueprint/blueprintAssignments/write",
"Microsoft.Blueprint/blueprintAssignments/delete",
"Microsoft.Compute/galleries/share/action",
"Microsoft.Purview/consents/write",
"Microsoft.Purview/consents/delete"
],
"notDataActions": []
}
],
"roleName": "Contributor",
"roleType": "BuiltInRole",
"type": "Microsoft.Authorization/roleDefinitions",
"updatedBy": null,
"updatedOn": "2023-07-10T15:10:53.947865+00:00"
}
]
Scope
(2024.06.26 Wed)
scope是一系列可以使用的资源。通过限制scope,可以限制security principal使用的资源。
Management group是比subscription更高一级的scope,但management group支持更多复杂分级。下图给出了一个management group和subscriptions的一个分级网络。
rbac-scope-management-groups.png
一个scope的案例如下,在Azure PowerShell中表示,scope id表示成属性的json。
RoleAssignmentId : /subscriptions/<subscriptionId>/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/azurestorage12345/blobServices/default/containers/blob-container-01/pro
viders/Microsoft.Authorization/roleAssignments/<roleAssignmentId>
Scope : /subscriptions/<subscriptionId>/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/azurestorage12345/blobServices/default/containers/blob-container-01
DisplayName : User
SignInName : user@contoso.com
RoleDefinitionName : Storage Blob Data Reader
RoleDefinitionId : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
ObjectId : <principalId>
ObjectType : User
CanDelegate : False
Description :
ConditionVersion :
Condition :
scope的格式
如果使用命令行分配角色,需要明确scope。在命令行中,scope表示为长字符串,用于识别角色分配的精确scope。在Azure portal中scope id
往往用resource id
来表示。
scope包含了一系列的字段,用斜线/
做分割。可将该字符串想象成如下分解,其中用大括号{}
标识的是可以自定义的内容。
/subscriptions
/{subscriptionId}
/resourcegroups
/{resourceGroupName}
/providers
/{providerName}
/{resourceType}
/{resourceSubType1}
/{resourceSubType2}
/{resourceName}
-
{subscriptionId}
:subscription ID/GUID -
{resourceGroupName}
:包含的resource group的名字 -
{providerName}
:资源供应者名字,对应的后面{resourceType}
和{resourceSubType*}
提供进一步的resource provider信息 -
{resourceName}
:特定resource的最后一部分字符串
Management groups比其他scope有着最广泛的scope。Management group的scope有下列形式:
/providers
/Microsoft.Management
/managementGroups
/{managmentGroupName}
Steps to assign an Azure role
(2024.06.24 Mon)
- 确定谁需要access:user? group? service principal? or manged identity?这四者合称security principal。
- 选定合适的角色:可从Azure built-in roles中找,优先管理者角色(privileged administrator roles)包括Contributor,Owner,RBAC administrator和user access administrator。若超出built-in roles的范畴,可自定义角色。
- 确定scope
- 检查角色和scope
- 分配角色:一旦确定了security principal,角色和scope,即可分配角色。方式包括,portal, PowerShell,CLI,SDKs和REST APIs。
每个subscription中有4000个角色分配,每个management group中有500个角色分配。具体数字可查RBAC limits。
How Azure RBAC determines if a user has access to a resource
placeholder
Reference
- Azure official website