出于信息安全的考虑,建议您通过 STS 服务来申请临时访问凭证,使指定 IAM 用户在凭证有效期内访问权限范围内的 veImageX 资源。临时访问凭证包括临时访问密钥(AccessKeyId 和 AccessKeySecret)和安全令牌(SecurityToken),以下为您介绍临时访问凭证的适用场景和发起请求的操作步骤。
主要用于授权第三方临时访问 veImageX,通常是在移动 APP 或 PC 客户端上传文件至 veImageX 的场景,为了保障您的信息安全,使上传资源免受到污染。建议不要将火山引擎主账号和 IAM 用户访问密钥保存在客户端代码中,您可以由服务端签出临时凭证,并下发至客户端,为您的第三方应用或 IAM 子账号签发临时访问凭证。该方式的优势如下所示:
安全性高:严格限制时效、限制访问对象和使用次数。
使用简单:通过 AK/SK 按标准方法签出即可。
配置灵活:可以对使用参数灵活的签名和验签。
STSAssumeRoleAccess
权限使用主账户登录 veImageX 控制台,单击右上角个人中心,找到访问控制,单击并进入该页面。
在访问控制-用户页面,单击新建用户按钮,每个新建的用户即为一个子账号。
在创建用户页面,您可以根据实际情况选择新建用户方式。以下以通过用户名创建方式为例:
基本信息设置
配置项 | 说明 |
---|---|
用户名 | 您可自定义用户名,以 veImageXSTS 为例。 |
编程访问 | 选择 开启 |
权限设置
配置项 | 说明 |
---|---|
添加权限策略 | 选择 STSAssumeRoleAccess |
作用范围 | 选择 全局 |
审阅
校验用户名是否正确后,单击提交按钮,完成用户创建配置。
返回用户页面,单击操作列管理按钮。
选择密钥,单击新建密钥按钮,查看并记录 IAM 用户访问 Access Key ID 和 Secret Access Key。
创建一个角色,您可仅授予其必需的权限,服务端子账号通过角色扮演接口获取到角色所属账号的临时安全令牌,从而以角色所属账号的身份来访问资源。
使用主账户登录访问控制控制台,进入身份管理-角色页面。
单击新建角色按钮,参考以下内容完成配置。
选择信任身份
配置项 | 说明 |
---|---|
选择信任身份类型 | 选择 账号 |
选择身份 | 选择 当前账号 |
配置角色信息
配置项 | 说明 |
---|---|
角色名 | 您可自定义用户名,以 veImageXSTS 为例。 |
添加权限
配置项 | 说明 |
---|---|
选择策略 | 选择 ImageXDefaultAccess |
作用范围 | 选择 全局 |
单击提交按钮,保存当前配置。
在角色页面,单击操作列管理按钮。
在角色详情页面,单击信任关系-编辑信任策略。
将下图的root
替换user/&{IAMUserName}
,其中IAMUserName
为 Step 1 中创建的用户名veImageXSTS
。该策略表示此 IAM 角色可以被火山引擎账号(AccountID=2100*****)下的 IAM 用户 veImageXSTS
扮演。
{ "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Principal": { "IAM": [ "trn:iam::2100******:user/veImageXSTS" ] } } ] }
请以 IAM 用户调用 AssumeRole 接口文档 生成临时访问凭证(包含 AccessKeyId
、SecretAccessKey
和 SessionToken
),从而以角色所属账号的身份来访问云资源。
您也可以通过 AssumeRole SDK 获取临时访问凭证,如 Python SDK、Java SDK。
GET /?RoleTrn=trn:iam::2100******:role/veImageXSTS&RoleSessionName=imagex_session&Action=AssumeRole&Version=2018-01-01 HTTP/1.1 Accept: application/json Content-Type: application/x-www-form-urlencoded Host: open.volcengineapi.com X-Date: 发请求时指定 Authorization: 待签算(此处用IAM用户veImageXSTS的密钥)
{ "ResponseMetadata": { "RequestId": "20210412725429273501625**", "Action": "AssumeRole", "Version": "2018-01-01", "Service": "sts" }, "Result": { "Credentials": { "CurrentTime": "2023-04-03T11:30:00+08:00", "ExpiredTime": "2023-04-03T12:30:00+08:00", "AccessKeyId": "AKTP8shJDSYGbi8*****", "SecretAccessKey": "TVRUSGNCLhdsgTSDCXPJDJSAJNNNCbE1E****", "SessionToken": "STSeyJBY2NvdW50SWklkZW50aXR5VHlwZSI6NCwiSWRlbnRpdHlJZCI6MzAyMTcsIkNoYW5uZWwiOiJyZXNvdXJjZSIsIkFjY2Vzc0tleUlkIjoiQUtUUE9EZzBNelZrWlRNMVlqQXlOR05sWkdGbU0yVTNaVEl6T0RnMlpEY3hNRGciLCJTaWduZWRTZWNyZXRBY2Nlc3NLZXkiOiJHSHRuc2Q1b3BOOThUeUNrckVuMVAxTDd1ZzBXczZFMytzTktDMDJQT01lNzFMOUloNzhYaDB5VXE4Ni9JMW8reEZxTmtkK01tVUR0cjRHR0NodXJQdz09IiwiRXhwaXJlZFRpbWUiOjE2MTgxOTk4MjksIlBvbGljeVN0cmluZyI6IiIsIlNpZ25hdHVyZSI6IjdiZTEzNTU1MDM5NzcyM2VkMDQxYmVkNTIyNzU4YmMyNjQ3YzRmNzZiNmRjYTViNzVhZDUyOTMwYTg1NjE5ZGEiLCJTZXNzaW9uTmFtZSI6ImNlc2hpYXNzdW1****" }, "AssumedRoleUser": { "Trn": "trn:sts::2100******:assumed-role/veImageXSTS/imagex_session", "AssumedRoleId": "**:imagex_session" } } }
在完成相关服务配置后,您可通过服务端 SDK 或上传 SDK 向 veImageX 上传任意合法资源。以下为 GO 的 Demo 示例:
说明
临时安全令牌默认有效期为 1 小时,到期后请及时更新临时安全令牌。
您可以通过 AssumeRole 的 DurationSeconds 参数设置临时安全令牌的有效期。DurationSeconds 参数单位为秒,最大可设置 12 小时。
package main import ( "fmt" "os" "github.com/volcengine/volc-sdk-golang/base" "github.com/volcengine/volc-sdk-golang/service/imagex" ) // 上传文件 func main() { // 默认 ImageX 实例为 `cn-north-1`,如果您想使用其他区域的实例,请使用 `imagex.NewInstanceWithRegion(区域名)` 显式指定区域 instance := imagex.DefaultInstance instance.SetCredential(base.Credentials{ //使用 Step 3 获取的临时访问凭证 AccessKeyID: "AKTP8shJDSYGbi8*****", SecretAccessKey: "TVRUSGNCLhdsgTSDCXPJDJSAJNNNCbE1E****", SessionToken: "STSeyJBY2NvdW50SWklkZW50aXR5VHlwZSI6NCwiSWRlbnRpdHlJZCI6MzAyMTcsIkNoYW5uZWwiOiJyZXNvdXJjZSIsIkFjY2Vzc0tleUlkIjoiQUtUUE9EZzBNelZrWlRNMVlqQXlOR05sWkdGbU0yVTNaVEl6T0RnMlpEY3hNRGciLCJTaWduZWRTZWNyZXRBY2Nlc3NLZXkiOiJHSHRuc2Q1b3BOOThUeUNrckVuMVAxTDd1ZzBXczZFMytzTktDMDJQT01lNzFMOUloNzhYaDB5VXE4Ni9JMW8reEZxTmtkK01tVUR0cjRHR0NodXJQdz09IiwiRXhwaXJlZFRpbWUiOjE2MTgxOTk4MjksIlBvbGljeVN0cmluZyI6IiIsIlNpZ25hdHVyZSI6IjdiZTEzNTU1MDM5NzcyM2VkMDQxYmVkNTIyNzU4YmMyNjQ3YzRmNzZiNmRjYTViNzVhZDUyOTMwYTg1NjE5ZGEiLCJTZXNzaW9uTmFtZSI6ImNlc2hpYXNzdW1****", }) params := &imagex.ApplyUploadImageParam{ ServiceId: "service id", // 服务 ID // StoreKeys: []string{"example.jpg"}, // 指定文件存储名 } // 读取文件 dat, err := os.ReadFile("image file") if err != nil { fmt.Printf("read file from %s error %v", "", err) os.Exit(-1) } // 上传文件 resp, err := instance.UploadImages(params, [][]byte{dat}) if err != nil { fmt.Printf("error %v", err) } else { fmt.Printf("success %v", resp) } }