全部产品
Search
文档中心

使用OOS审批授权子账号RAM权限

更新时间: 2020-09-25

背景

当通过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。

操作步骤

在本文提供两个参考模版引导。一类是面向已存在权限策略的场景,即系统权限策略和已创建对自定义权限策略的授权。另一类是面向尚不存在权限策略的场景,即自定义策略的创建和授权。

已存在权限策略的授权

如下操作提示中包括三阶段,两类身份,分别对应着权限管理员配置审批授权模版,申请权限的员工申请权限,权限管理员审批授权。

权限管理员

  1. 登录OOS控制台
  2. 单击左上角,确认已切换到目标地域oos

  1. 便于权限申请者创建执行,防止审批信息被误改。此时您需根据的实际情况,修改公共模版,先将审批管理相关信息固定到模版中,并删除其对应的模版参数定义,最后在我的模版中创建模版,下面将介绍如何固定审批信息。
  2. 单击我的模版,单击创建模版,单击公共模版oos

  3. 在搜索框中输入ACS-RAM-ApproveAttachPolicyToUser,并选取搜索结果。oos

  4. 单击YAMLoos

  5. 首先修改模版中的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

image

8. 模版中的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 # 请根据您实际情况进行更改

  1. 接下来,请移步到模版的参数部分,将如下截图内选中的,且未被引用的参数定义内容删除掉。

image

  1. 最终模版的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}}'

  1. 完成模版修改,输入模版名称。

本示例命名为copy-ACS-RAM-ApproveAttachPolicyToUser。

  1. 单击创建模版

权限申请者

  1. 登录OOS控制台
  2. 单击左上角,确认已切换到目标地域
  3. 单击我的模版,找到已创建的模版copy-ACS-RAM-ApproveAttachPolicyToUser,单击创建执行
  4. 单击下一步:设置参数。根据实际情况,填写将申请的权限类型policyType和要申请的权限名称policyName

此部分以系统权限AliyunECSReadOnlyAccess为例。

image

  1. 单击下一步:确定。
  2. 单击创建执行。创建执行后,您获取WebHook路径的钉钉群中会有审批通知,权限管理员用户可通过该通知审批您的授权申请,若申请通过,您会立即被授权。

权限管理员

  1. 权限申请者创建执行后,您可在其获取WebHook路径钉钉群中查看到审批通知。
  2. image
  3. 如果您允许授权,则请访问审批通知的link,并单击审批步骤>同意步骤执行>确定

image

4. 您可通过执行详情,查看授权任务执行情况,若成功,则创建执行的RAM用户已被授予相应权限。oos

创建自定义权限策略并授权

如下操作提示中包括三阶段,两类身份,分别对应着权限管理员配置审批授权模版,申请权限的员工申请权限,权限管理员审批授权。

权限管理员

  1. 登录OOS控制台
  2. 单击左上角,确认已切换到目标地域
  1. 便于权限申请者创建执行,防止审批信息被误改。可参考上文将ACS-RAM-ApproveAttachCustomPolicyToUser审批信息固定。
  2. 根据ACS-RAM-ApproveAttachCustomPolicyToUser创建的新模版,本示例命名为copy-ACS-RAM-ApproveAttachCustomPolicyToUser。

权限申请者

  1. 登录OOS控制台
  2. 单击左上角,确认已切换到目标地域
  3. 单击我的模版,找到已创建的模版copy-ACS-RAM-ApproveAttachCustomPolicyToUser,单击创建执行。
  4. 单击下一步:设置参数。根据实际情况,填写将申请的权限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"
        }
    ]
}

image

  1. 单击下一步:确定。
  2. 单击创建执行。创建执行后,您获取WebHook路径的钉钉群中会有审批通知,权限管理员用户可通过该通知审批您的授权申请,若申请通过,您会立即被授权。

权限管理员

  1. 权限申请者创建执行后,您可在其获取WebHook路径钉钉群中查看到审批通知。
  2. image
  3. 如果您允许授权,则请访问审批通知的link,并单击审批步骤>同意步骤执行>确定

image

4. 您可通过执行详情,查看授权任务执行情况,若成功,则创建执行的RAM用户已被授予相应权限。oos

总结

本文提到的两个可参考的模版,可保证授权的可靠性。另外如果您将授予的权限是未创建的,参考审批通过后授予自定义权限给创建执行的子用户模版,可免去授予不存在的自定义权限策略的繁琐操作,您仅需一步创建执行,即可完成授权的所有操作,无需再对控制台中权限策略、用户等点来点去。