Azure Role Base Access Control (RBAC), since 2024-06-23

基本

云平台资源的接入管理(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)

  1. 确定谁需要access:user? group? service principal? or manged identity?这四者合称security principal。
  2. 选定合适的角色:可从Azure built-in roles中找,优先管理者角色(privileged administrator roles)包括Contributor,Owner,RBAC administrator和user access administrator。若超出built-in roles的范畴,可自定义角色。
  3. 确定scope
  4. 检查角色和scope
  5. 分配角色:一旦确定了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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容