使用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

  • 标题: 使用OOS实现RAM权限审批流授权及反授权的概念验证
  • 作者: 暗香疏影
  • 创建于 : 2025-06-30 10:00:00
  • 更新于 : 2025-06-30 18:30:54
  • 链接: https://blog.23ikr.com/2025/06/30/2025-06-30-OOS-RAM-auto-grant-auto-revoke/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
使用OOS实现RAM权限审批流授权及反授权的概念验证