为了方便管理员账号跨账号访问/操作成员账号资源,企业组织基于访问控制(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。