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