美文网首页
Azure Role Base Access Control (

Azure Role Base Access Control (

作者: Mc杰夫 | 来源:发表于2024-06-22 13:01 被阅读0次

    基本

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

    相关文章

      网友评论

          本文标题:Azure Role Base Access Control (

          本文链接:https://www.haomeiwen.com/subject/zzgkcjtx.html