首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用OOS实现RAM权限审批流授权及反授权的概念验证

使用OOS实现RAM权限审批流授权及反授权的概念验证

作者头像
繁华是客
发布2025-07-03 15:01:00
发布2025-07-03 15:01:00
1780
举报

我们通常使用第三方软件或自研的方式来实现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功能

代码语言:javascript
复制

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

代码语言:javascript
复制
{
  "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"
    }
  ]
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-06-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 添加等待及反授权
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档