背景
当通过RAM控制台或OpenApi为RAM用户授权时,权限是即时生效的,这样对于频繁授权或者高权限授予场景来讲,完全没法保障安全性。就此,本文引入一种高效的授权审批保障机制,即运维编排(OOS)的审批授权存在的权限和审批授权未存在的权限。通过参考这两个模版可创建适用于您的模版,这样贵司的普通用户通过创建执行来申请权限,接着权限管理员用户会收到审批通知,管理员审批通过后,创建执行的普通用户即可获得授权。
准备工作
- 管理员的RAM账号(用户)。该账号需具备RAM授权的权限策略,该用户名称供设置approvers默认参数时使用,如不具备,可参考创建RAM用户进行创建并通过为RAM用户授权来授予其AliyunRAMFullAccess权限策略。
- 权限申请者的RAM账号。如还没有,可参考创建RAM用户进行创建,且该账号需具备OOS执行权限,如不具备,可参考用户访问OOS的权限设置。
- RAM权限策略。对于系统/自定义类型的权限策略均可通过策略管理查询到,如果想授予的是自定义类型权限策略,且其不存在,可参考本文的操作步骤-创建自定义权限策略并授权来完成授权。
- 一个钉钉群,该群内有具备管理员权限的员工(此权限指员工的阿里云账号权限),由于审批通知要发送到钉钉群中,所以需要从审批管理员所在的某个钉钉群获取WebHookUrl,这样当有人申请权限时,OOS就会调用WebHookUrl来通知管理员进行审批授权。 获取WebHook请参考,钉钉群助手WebHook路径获取。获取到WebHookUrl后请保存好,待后续步骤使用,WebHookUrl形如https://oapi.dingtalk.com/robot/send?access_token=1234zxcvbnm67890。
操作步骤
在本文提供两类场景的操作引导,且两类场景对应着两个参考模版。一类是面向已存在权限策略的场景,即系统权限策略和已创建对自定义权限策略的授权。另一类是面向尚不存在权限策略的场景,即自定义策略的创建和授权。
已存在权限策略的授权
如下操作提示中包括三阶段,两类身份,分别对应着权限管理员配置审批授权模版,申请权限的员工申请权限,权限管理员审批授权。
权限管理员
- 登录OOS控制台。
- 单击左上角,确认已切换到目标地域。
- 便于权限申请者创建执行,防止审批信息被误改。此时您需根据的实际情况,修改公共模版,先将审批管理相关信息固定到模版中,并删除其对应的模版参数定义,最后在我的模版中创建模版,下面将介绍如何固定审批信息。
- 单击我的模版,单击创建模版,单击公共模版。
- 在搜索框中输入
ACS-RAM-ApproveAttachPolicyToUser
,并选取搜索结果。 - 单击YAML。
-
首先修改模版中的approveAttachPolicy任务,将下图红框的参数引用改为固定值。
- 其中Approvers表示审批管理员的阿里云账号名称,其后面引用的
'{{approvers}}'
请修改成管理员账号的名称,如改成['zhangsan']
。 - 其中MinRequiredApprovals表示最少需要几个审批者同意后,方审批通过,其后面引用的
'{{minRequiredApprovals}}'
请修改为要求的最低审批通过人数,如改成1
。 - 其中URI表示webHook的统一资源标识符,其后面引用的
'{{webhookUrl}}'
请修改为您在准备工作中获取到的webHookUrl,如改成'https://oapi.dingtalk.com/robot/send?access_token=1234zxcvaksdq31414'
。 - 其中atMobiles表示在发送审批通知时,钉钉群内将被@的用户,其后面引用的
'{{atMobiles}}'
请修改为审批管理员注册钉钉账号使用的手机号码,如改成['13812345678']
。 - 其中isAtAll表示当发送审批通知时,是否@钉钉群内所有用户,其后面引用的
'{{atAll}}'
可根据实际需求修改为false
或者true
,如改成false
。
- 其中Approvers表示审批管理员的阿里云账号名称,其后面引用的
- 模版中的approveAttachPolicy任务参数固定后,任务脚本样式如下。
Tasks:
- Name: approveAttachPolicy
Action: 'ACS::Approve'
Description:
en: Approve task add policy.
zh-cn: 审批后授权。
Properties:
Approvers: ['zhangsan']
MinRequiredApprovals: 1
NotifyType: WebHook
WebHook:
URI: 'https://oapi.dingtalk.com/robot/send?access_token=1234zxcvaksdq31414'
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}}.
at:
atMobiles: ['13812345678']
isAtAll: false # 请根据您实际情况进行更改
- 接下来,请移步到模版的参数部分,将如下截图内选中的,且未被引用的参数定义内容删除掉。
- 最终模版的YAML脚本样式如下。
FormatVersion: OOS-2019-06-01
Description:
en: Attach policy to user that template executed by after approving.
zh-cn: 审批通过后授权给创建执行的子用户。
name-en: ACS-RAM-ApproveAttachPolicyToUser
name-zh-cn: 审批通过后授权给创建执行的子用户
categories:
- security
Parameters:
policyType:
Description:
en: 'The ploicy type to add,the optioanl is Custom or System.'
zh-cn: 将授予的权限策略类型,可选类型为系统权限或自定义权限。
Type: String
AllowedValues:
- Custom
- System
policyName:
Description:
en: The ploicy to add.
zh-cn: 将授予的权限策略名称。
Type: String
OOSAssumeRole:
Description:
en: The RAM role to be assumed by OOS.
zh-cn: OOS扮演的RAM角色。
Type: String
Default: OOSServiceRole
RamRole: '{{ OOSAssumeRole }}'
Tasks:
- Name: approveAttachPolicy
Action: 'ACS::Approve'
Description:
en: Approve task add policy.
zh-cn: 审批后授权。
Properties:
Approvers: ['zhangsan']
MinRequiredApprovals: 1
NotifyType: WebHook
WebHook:
URI: 'https://oapi.dingtalk.com/robot/send?access_token=1234zxcvaksdq31414'
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}}.
at:
atMobiles: ['13812345678']
isAtAll: false # 请根据您实际情况进行更改
- Name: checkPolicyExist
Action: 'ACS::CheckFor'
Description:
en: Check for the existence of policy.
zh-cn: 确认权限策略已存在。
Properties:
Service: RAM
API: GetPolicy
Parameters:
PolicyType: '{{ policyType }}'
PolicyName: '{{ policyName }}'
DesiredValues:
- 'true'
PropertySelector: .DefaultPolicyVersion != null|tostring
Outputs:
policyDocumentToAttach:
Type: Json
ValueSelector: .DefaultPolicyVersion.PolicyDocument
- Name: createStack
Action: 'ACS::Template'
Description:
en: Attach policy by Ros resource stack.
zh-cn: 通过Ros资源栈为角色授权。
Properties:
TemplateName: 'ACS::ROS::CreateStack'
Parameters:
stackName: '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"
}
}
}
}
}
Outputs:
stackId:
Type: String
ValueSelector: stackId
Outputs:
statement:
Type: Json
Value: '{{ checkPolicyExist.policyDocumentToAttach }}'
stackId:
Type: String
Value: '{{createStack.stackId}}'
- 完成模版修改,输入模版名称。
本示例命名为copy-ACS-RAM-ApproveAttachPolicyToUser。
权限申请者
- 登录OOS控制台。
- 单击左上角,确认已切换到目标地域。
- 单击我的模版,找到已创建的模版copy-ACS-RAM-ApproveAttachPolicyToUser,单击创建执行。
- 单击下一步:设置参数。根据实际情况,填写将申请的权限类型policyType和要申请的权限名称policyName。
此部分以系统权限AliyunECSReadOnlyAccess为例。
- 单击下一步:确定。
- 单击创建执行。创建执行后,您获取WebHook路径的钉钉群中会有审批通知,权限管理员用户可通过该通知审批您的授权申请,若申请通过,您会立即被授权。
权限管理员
- 权限申请者创建执行后,您可在其获取WebHook路径钉钉群中查看到审批通知。
- 如果您允许授权,则请访问审批通知的link,并单击审批步骤>同意步骤执行>确定。
- 您可通过执行详情,查看授权任务执行情况,若成功,则创建执行的RAM用户已被授予相应权限。
创建自定义权限策略并授权
如下操作提示中包括三阶段,两类身份,分别对应着权限管理员配置审批授权模版,申请权限的员工申请权限,权限管理员审批授权。
权限管理员
- 登录OOS控制台。
- 单击左上角,确认已切换到目标地域。
- 便于权限申请者创建执行,防止审批信息被误改。可参考上文将
ACS-RAM-ApproveAttachCustomPolicyToUser
审批信息固定。 - 根据
ACS-RAM-ApproveAttachCustomPolicyToUser
创建的新模版,本示例命名为copy-ACS-RAM-ApproveAttachCustomPolicyToUser。
权限申请者
- 登录OOS控制台。
- 单击左上角,确认已切换到目标地域。
- 单击我的模版,找到已创建的模版copy-ACS-RAM-ApproveAttachCustomPolicyToUser,单击创建执行。
- 单击下一步:设置参数。根据实际情况,填写将申请的权限JSON脚本policyDocument和权限名称policyName。
此部分使用的policyDocument示例脚本如下,其代表ECS的只读权限,关于如何编写权限脚本可参考权限策略语法和结构。
{
"Version": "1",
"Statement": [
{
"Action": "ecs:Describe*",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "ecs:List*",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"vpc:DescribeVpcs",
"vpc:DescribeVSwitches"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
- 单击下一步:确定。
- 单击创建执行。创建执行后,您获取WebHook路径的钉钉群中会有审批通知,权限管理员用户可通过该通知审批您的授权申请,若申请通过,您会立即被授权。
权限管理员
- 权限申请者创建执行后,您可在其获取WebHook路径钉钉群中查看到审批通知。
- 如果您允许授权,则请访问审批通知的link,并单击审批步骤>同意步骤执行>确定。
- 您可通过执行详情,查看授权任务执行情况,若成功,则创建执行的RAM用户已被授予相应权限。
总结
本文提到的两个可参考的模版,可保证授权的可靠性。另外如果您将授予的权限是未创建的,参考审批通过后授予自定义权限给创建执行的子用户模版,可免去授予不存在的自定义权限策略的繁琐操作,您仅需一步创建执行,即可完成授权的所有操作,无需再对控制台中权限策略、用户等点来点去。