You need to enable JavaScript to run this app.
导航

管理员账号如何获取成员账号STS?

最近更新时间2023.04.12 11:39:00

首次发布时间2022.09.06 17:40:48

为了方便管理员账号跨账号访问/操作成员账号资源,企业组织基于访问控制(IAM)的角色扮演(AssumeRole)能力提供了企业组织管理员账号登录成员账号的功能。

企业组织默认流程

当成员账号(创建或邀请)加入组织时,组织会在成员账号中创建一个名为OrganizationAccessControlRole的角色,该角色拥有AdministratorAccess权限,并授信给组织管理员来扮演该角色。

登录成员账号

当组织管理员通过AssumeRole接口来扮演成员账号的OrganizationAccessControlRole角色时就拥有了成员账号的AdministratorAccess权限。

AssumeRole接口文档可参考AssumeRole(通过角色扮演获取临时安全令牌)
可直接使用公开的SDK:https://github.com/volcengine/volc-sdk-golang/tree/main/service/sts

示例

以下是一个精简的请求示例代码:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "strconv"
    "testing"

    "github.com/volcengine/volc-sdk-golang/base"
)

const OrgRoleName = "OrganizationAccessControlRole"

func AssumeRole() ([]byte, error) {
    query := url.Values{}
    query.Add("Action", "AssumeRole")
    query.Add("Version", "2018-01-01")
    query.Add("RoleTrn", fmt.Sprintf("trn:iam::%d:role/%s", 2100054255, OrgRoleName)) // 账号替换为成员账号ID
    query.Add("RoleSessionName", "CustomSessionName")                                 // 自定义的SessionName
    query.Add("DurationSeconds", strconv.Itoa(60*60*12))                              // 临时秘钥时长,最小900s,默认3600s,最大3600*12s

    req, err := http.NewRequest("GET", "//openAPI域名"+query.Encode(), nil)
    if err != nil {
        return nil, fmt.Errorf("NewRequest err: %v", err)
    }

    credentials := base.Credentials{
        // 管理员账号下子用户的AccessKey,子用户需要有STSAssumeRoleAccess权限。
        AccessKeyID:     "AKLT************jZjgx",
        // 管理员账号下子用户的SecretAccessKey
        SecretAccessKey: "TkRrd01************pOalkzW",
        Service:         "sts",
        Region:          "cn-north-1",
    }
    credentials.Sign(req)

    resp, err := http.DefaultClient.Do(req)
    if resp != nil && resp.Body != nil {
        defer resp.Body.Close()
    }
    if err != nil {
        return nil, fmt.Errorf("DoRequest err: %v", err)
    }

    return ioutil.ReadAll(resp.Body)
}

AssumeRole返回示例:

{
    "ResponseMetadata": {
        "RequestId": "20220530183227010225243153017569B8",
        "Action": "AssumeRole",
        "Version": "2018-01-01",
        "Service": "sts",
        "Region": "cn-north-1"
    },
    "Result": {
        "AssumeRoleUser": {
            "Trn": "trn:sts::2100054255:assumed-role/OrganizationAccessControlRole/CustomSessionName",
            "AssumedRoleId": "69611:CustomSessionName"
        },
        "Credentials": {
            "ExpiredTime": "2022-05-31T06:32:27+08:00",
            "CurrentTime": "2022-05-30T18:32:27+08:00",
            "AccessKeyId": "AKTPM*****************kYmY",
            "SecretAccessKey": "TkRrd**************pOalkzW",
            "SessionToken":"buTNhY2NiZTRlZGViODUDdXN0b21TZXNzaW9uTmFtZS"
        }
    }
}

AssumeRole返回的AccessKeyId,SecretAccessKey,SessionToken用于调用其他OpenAPI。