使用OOS实现RAM权限审批流授权及反授权的概念验证
我们通常使用第三方软件或自研的方式来实现RAM账户的授权审批流,但是我们如果担心第三方软件泄露,也担心自研安全性无法保证的话,有没有办法实现呢?
用户希望User A申请,User B审批通过后,授权User A特定策略(可以是自定义策略,也可以是系统策略)。然后等待一段时间后(例如1小时)用户操作已完成,自动反授权。
以下是参考文档:
使用OOS审批授权RAM用户(子账号)RAM权限
添加等待及反授权
根据上述文档复制一个OOS出来后,增加等待任务。
我们不能通过复制YAML内授权用户系统策略的Create Stack来实现反授权。因为他是ROS“创建资源栈”,而创建本身不包含这类删除类动作。故而ROS的Create Stack不支持DetachPolicyFromUser的操作,所以你不可以通过复制原模板内的createStack,稍微修改成DetachPolicyFromUser来实现自动撤销授权。
。同时我在直接使用RAM的DetachPolicyFromUser API来实现的时候也报错。原因是后台有白名单机制,不是所有接口都能调。最后我使用了Delete Stack删除资源栈的方式来实现。
资源栈在创建的时候会有一个StackID, 我将这个输出的stackID回填到Delete Stack的stackID参数里,即可将曾经生成的资源栈删除。也就间接实现了DetachPolicyFromUser的结果。同时也感谢上面的示例中直接将该数据输出,如果靠我在控制台编写,我真的无法搞出来。
OOS审批会发URL给钉钉,钉钉机器人上只需要限定内容有”ali”即可。当然你可以在yaml内编辑内容来进行更精细化筛选避免地址被攻击。
权限上执行用户有AliyunROSReadOnlyAccess、AliyunOOSReadOnlyAccess以及ros:CreateStack和ros:DeleteStack即可。他在你权限不够的时候会提示你添加自定义策略的YAML。
相对于原版,我删除了at功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
| FormatVersion: OOS-2019-06-01 Description: 审批通过后授权给创建执行的子用户 Parameters: policyType: Label: 权限策略类型 Description: 将授予的权限策略类型,可选类型为系统权限或自定义权限 Type: String AllowedValues: - Custom - System policyName: Label: 权限策略名称 Type: String approvers: Label: 可以审批授权的用户 Description: 用户名是RAM子用户名称中@前面的部分,比如RAM子用户为user001@companyAlias.onaliyun.com,那么列表中填写user001即可 Type: List AssociationProperty: ALIYUN::RAM::User minRequiredApprovals: Label: 最低需要通过审批的数量 Type: Number Default: 1 OOSAssumeRole: Label: OOS扮演的RAM角色 Type: String Default: '' RamRole: '{{ OOSAssumeRole }}' Tasks: - Name: approveAttachPolicy Action: ACS::Approve Description: 审批后授权 Properties: NotifyType: WebHook WebHook: URI: https://oapi.dingtalk.com/robot/send?access_token=abcdedf Headers: Content-Type: application/json Content: msgtype: text text: content: | Notice: Please approve the task execution to attach {{policyType}} policy {{policyName}} for target user {{ACS::ExecuteUser}} sent by {{ACS::RegionId}} oos {{ACS::ExecutionId}} Outputs: {} - Name: checkPolicyExist Action: ACS::CheckFor Description: 确认权限策略已存在 Properties: Service: RAM API: GetPolicy PropertySelector: .DefaultPolicyVersion != null|tostring DesiredValues: - 'true' Parameters: PolicyType: '{{ policyType }}' PolicyName: '{{ policyName }}' RegionId: ap-southeast-1 Outputs: policyDocumentToAttach: Type: Json ValueSelector: .DefaultPolicyVersion.PolicyDocument - Name: createStack Action: ACS::Template Description: 通过Ros资源栈为角色授权 Properties: TemplateName: ACS::ROS::CreateStack Parameters: stackName: Fn::Replace: - .: _ - OOS-{{ACS::ExecutionId}} disableRollback: true parameters: - ParameterKey: PolicyType ParameterValue: '{{ policyType }}' - ParameterKey: UserName ParameterValue: '{{ACS::ExecuteUser}}' - ParameterKey: PolicyName ParameterValue: '{{ policyName }}' templateBody: | { "Parameters": { "PolicyType": { "Type": "String", "Description": "Authorization policy type. Value: \"System\" or \"Custom\"." }, "UserName": { "Type": "String", "Description": "User name." }, "PolicyName": { "Type": "String", "Description": "Authorization policy name." } }, "ROSTemplateFormatVersion": "2015-09-01", "Outputs": {}, "Resources": { "AttachPolicyToUser": { "Type": "ALIYUN::RAM::AttachPolicyToUser", "Properties": { "PolicyType": { "Ref": "PolicyType" }, "UserName": { "Ref": "UserName" }, "PolicyName": { "Ref": "PolicyName" } } } }, "Metadata": { "ALIYUN::ROS::Interface": { "TemplateTags": [ "acs:integrate:oos:ram_approve_attach_policy_to_user" ] } } } Outputs: stackId: Type: String ValueSelector: stackId - Action: ACS::Sleep Name: Sleep Description: '' Properties: Duration: PT1M Outputs: {} - Action: ACS::ROS::DeleteStack Name: DeleteStack Description: ROS 资源栈删除 - 实现RAM反授权等同DetachPolicyFromUser Properties: regionId: ap-southeast-1 stackId: '{{createStack.stackId}}' retainAllResources: false Outputs: {} Outputs: statement: Type: Json Value: '{{ checkPolicyExist.policyDocumentToAttach }}' stackId: Type: String Value: '{{createStack.stackId}}'
|
其他
ROS_Create_Delete_Stack 自定义策略,用于关联到执行用户,使得用户可以有ROS资源栈创建和删除权限。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| { "Version": "1", "Statement": [ { "Action": "ram:GetPolicy", "Resource": "*", "Effect": "Allow" }, { "Action": [ "ros:CreateStack", "ros:DeleteStack", "ros:GetStack" ], "Resource": "*", "Effect": "Allow" }, { "Action": "oos:StartExecution", "Resource": "*", "Effect": "Allow" } ] }
|
ROS模板编写的一些参考
参考AttachPolicyToGroup用处感觉比参考AttachPolicyToUser好。但是实际上我编写OOS,然后嵌入ROS,不成功。
ALIYUN::RAM::AttachPolicyToGroup