我们通常使用第三方软件或自研的方式来实现RAM账户的授权审批流,但是我们如果担心第三方软件泄露,也担心自研安全性无法保证的话,有没有办法实现呢? 用户希望User A申请,User B审批通过后,授权User A特定策略(可以是自定义策略,也可以是系统策略)。然后等待一段时间后(例如1小时)用户操作已完成,自动反授权。 以下是参考文档: 使用OOS审批授权RAM用户(子账号)RAM权限
根据上述文档复制一个OOS出来后,增加等待任务。 我们不能通过复制YAML内授权用户系统策略的createStack来实现反授权。因为他是通过ROS来实现的,而ROS的Create Stack不支持DetachPolicyFromUser的操作,所以你不可以通过复制原模板内的createStack,稍微修改成DetachPolicyFromUser来实现自动撤销授权。 。同时我在直接使用DetachPolicyFromUser API来实现的时候也报错。最后我使用了deleteStack 删除资源栈的方式来实现。
资源栈在创建的时候会有一个StackID, 我将这个输出的stackID回填到DeleteStack 的stackID参数里,即可将曾经生成的资源栈删除。也就间接实现了DetachPolicyFromUser的结果。
OOS审批会发URL给钉钉,钉钉机器人上只需要限定内容有”ali”即可。当然你可以在yaml内编辑内容。
权限上执行用户有AliyunROSReadOnlyAccess、AliyunOOSReadOnlyAccess以及ros:CreateStack和ros:DeleteStack即可。他在你权限不够的时候会提示你添加自定义策略的YAML。
相对于原版,我删除了at功能
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
{
"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"
}
]
}