使用OOS实现RAM权限审批流授权及自动化撤销授权的概念验证

简介: 本方案通过阿里云OOS与ROS联动,实现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功能


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资源栈创建和删除权限。

{
   
  "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

相关文章
|
应用服务中间件 nginx
|
11月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2025 年 7 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
|
机器学习/深度学习 TensorFlow API
TensorFlow 2.0 快速入门指南:第一部分
TensorFlow 2.0 快速入门指南:第一部分
523 0
|
开发工具 git
git push origin master提交报错解决办法
git push origin master提交报错解决办法
951 0
|
存储 人工智能 城市大脑
阿里云OpenTrek,七年封装再开放
七年砥砺琢磨的产业智能技术,一朝全部输出。2022阿里云合作伙伴大会上,产业智能OpenTrek平台的“行业数据平台能力”和“行业智能引擎能力”面向合作伙伴全面开放,至此,阿里云补上了产业数字化的又一块关键拼图——OpenTrek。
阿里云OpenTrek,七年封装再开放
|
Java Windows Spring
Springboot开启远程调试
远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码( 前提是本地 的代码必须和远程服务器运行的代码一致 )中设置断点,每当有请求到远程服务器时时能够在本地知道 远程服务端的此时的内部状态
740 0
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
13961 46
|
关系型数据库 MySQL Linux
源码包与RPM包的区别
<p></p> <p style="padding-top:0px; padding-bottom:0px; margin-top:8px; margin-bottom:8px; line-height:23px; letter-spacing:0.5px; font-size:13px; word-wrap:break-word; word-break:break-all; color
3276 0
|
存储 监控 异构计算
【Python】GPU内存监控脚本
【Python】GPU内存监控脚本