Azure实践之Policy与Role assignment结合应用

今天再来与各位分享一篇关于Azure Policy的应用,Policy的作用之前已经有过一次介绍,没看过的朋友可以移步之前的博客

使用Azure Polcy强制禁止非托管磁盘VM

http://blog.51cto.com/mxyit/2347943

 

今天要分享的主题是如何用Policy限制Azure中的role assignment,可能很多人一提到Role Assignment,第一反应就会是RBAC。这其实很正常,因为Role assignment确实是属于RBAC的范畴,那么RBAC和Polcicy的区别到底是什么?主要有两点


  • RBAC 关注不同范围内的用户操作。 你可能会被添加到资源组的参与者角色,可对该资源组做出更改。

  • 策略关注部署期间的资源属性,以及现有资源。 Policy 控制属性,例如资源的类型或位置



很多人一提到要限制role assignment第一反应也是用RBAC来实现,但是其实,用Policy来实现这个需求有可能还会更简单

 

之前有客户提到过这样一种情况,企业中Azure环境权限分配很混乱,有权限的人私自为其他账号添加owner权限,这些人又私自为其他人添加owner权限,导致权限已经泛滥,客户花了很大的精力才把权限慢慢回收回来,同时为了便于管理,客户也希望能限制为用户添加owner权限,为此,其中一种解决办法就是可以通过Policy实现。Policy可以做到只允许用户assign特定的一些role,比如只可以分批contributor或者reader这种角色,owner这种角色不允许assign,这样可以从技术手段上杜绝权限泛滥的可能

 

下边来看下具体如何实现,Policy的核心实际上就是定义rules的JSON文件,

可以看到其实实现我们的需求并不复杂,下边的policy意思就是,如果Role ID不在roleDefinitionIds这个数组中,则拒绝添加,Role ID是什么概念呢?其实Azure中每个Role都是有一个独立的ID的,想要查询这个ID其实很简单,下边提供两种方法


1:通过PowerShell

Get-AzureRmRoleDefinition|ft name,id -AutoSize


image001.png



2:直接在网页中查找

https://docs.microsoft.com/zh-cn/azure/role-based-access-control/built-in-roles#reader


{

 

         "if": {

 

                "allOf": [

 

                    {

 

                        "field": "type",

 

                        "equals": "Microsoft.Authorization/roleAssignments"

 

                    },

 

                    {

 

                        "not": {

 

                            "field": "Microsoft.Authorization/roleAssignments/roleDefinitionId",

 

                            "in": "[parameters('roleDefinitionIds')]"

 

                        }

 

                    }

 

                ]

 

            },

 

       "then": {

 

              "effect": "deny"

 

       }

 

}


有了Role ID之后来看一下,首先我们需要将允许添加的role id添加到数组中,比如如果只允许添加contributor和reader权限,则可以将这两个ID添加到一个数组

[string[]]$ids="acdd72a7-3385-48ef-bd42-f606fba81ae7"

$ids+="b24988ac-6180-42a0-ab88-20f7382dd24c"

image003.png



之后开始定义Role definition,包含rules定义的JSON文件已经放在restrict-roleassignment-owner2这个文件中,另外因为role id是一个可变的参数,因此在parameter参数中需要定义好参数的类型等属性

image005.png



可以看到这个parameter是一个array,也就是数组类型,也符合我们的需求

{

 

       "roleDefinitionIds": {

 

              "type": "array",

 

              "metadata": {

 

                     "description": "The list of role definition Ids",

 

                     "displayName": "Approved Role Definitions"

 

              }

 

       }

 

}


定义好之后可以开始分配这个policy了,在scope中可以灵活选择需要assign到哪个级别,可以选择订阅或者单独某个资源或者资源组都可以,这里直接选择将policy分配到订阅级别

image007.png


定义好之后来做个最终的测试,策略已经生效了!在assign role的时候尝试assign owner,但是已经提示policy禁止这么做了

image009.png


猜你喜欢

转载自blog.51cto.com/mxyit/2349916