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

使用 STS 临时访问凭证发起请求

最近更新时间2023.06.26 13:37:18

首次发布时间2023.06.26 13:37:18

出于信息安全的考虑,建议您通过 STS 服务来申请临时访问凭证,使指定 IAM 用户在凭证有效期内访问权限范围内的 veImageX 资源。临时访问凭证包括临时访问密钥(AccessKeyId 和 AccessKeySecret)和安全令牌(SecurityToken),以下为您介绍临时访问凭证的适用场景和发起请求的操作步骤。

使用场景

主要用于授权第三方临时访问 veImageX,通常是在移动 APP 或 PC 客户端上传文件至 veImageX 的场景,为了保障您的信息安全,使上传资源免受到污染。建议不要将火山引擎主账号和 IAM 用户访问密钥保存在客户端代码中,您可以由服务端签出临时凭证,并下发至客户端,为您的第三方应用或 IAM 子账号签发临时访问凭证。该方式的优势如下所示:

  • 安全性高:严格限制时效、限制访问对象和使用次数。

  • 使用简单:通过 AK/SK 按标准方法签出即可。

  • 配置灵活:可以对使用参数灵活的签名和验签。

使用流程

alt

操作步骤

Step 1:创建 IAM 用户并授予 STSAssumeRoleAccess 权限

  1. 使用主账户登录 veImageX 控制台,单击右上角个人中心,找到访问控制,单击并进入该页面。

  2. 在访问控制-用户页面,单击新建用户按钮,每个新建的用户即为一个子账号。

  3. 在创建用户页面,您可以根据实际情况选择新建用户方式。以下以通过用户名创建方式为例:

    1. 基本信息设置

      配置项说明
      用户名您可自定义用户名,以 veImageXSTS 为例。
      编程访问选择 开启
    2. 权限设置

      配置项说明
      添加权限策略选择 STSAssumeRoleAccess
      作用范围选择 全局
    3. 审阅

      校验用户名是否正确后,单击提交按钮,完成用户创建配置。

  4. 返回用户页面,单击操作列管理按钮。

  5. 选择密钥,单击新建密钥按钮,查看并记录 IAM 用户访问 Access Key ID 和 Secret Access Key。

Step 2:创建 IAM 角色并授予 veImageX 权限

创建一个角色,您可仅授予其必需的权限,服务端子账号通过角色扮演接口获取到角色所属账号的临时安全令牌,从而以角色所属账号的身份来访问资源。

  1. 使用主账户登录访问控制控制台,进入身份管理-角色页面。

  2. 单击新建角色按钮,参考以下内容完成配置。

    1. 选择信任身份

      配置项说明
      选择信任身份类型选择 账号
      选择身份选择 当前账号
    2. 配置角色信息

      配置项说明
      角色名您可自定义用户名,以 veImageXSTS 为例。
    3. 添加权限

      配置项说明
      选择策略选择 ImageXDefaultAccess
      作用范围选择 全局
  3. 单击提交按钮,保存当前配置。

  4. 在角色页面,单击操作列管理按钮。

  5. 在角色详情页面,单击信任关系-编辑信任策略。

    将下图的root替换user/&{IAMUserName},其中IAMUserNameStep 1 中创建的用户名veImageXSTS。该策略表示此 IAM 角色可以被火山引擎账号(AccountID=2100*****)下的 IAM 用户 veImageXSTS 扮演。

    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "sts:AssumeRole"
                ],
                "Principal": {
                    "IAM": [
                        "trn:iam::2100******:user/veImageXSTS"
                    ]
                }
            }
        ]
    }
    

Step 3:通过 AssumeRole 获取临时访问凭证

请以 IAM 用户调用 AssumeRole 接口文档 生成临时访问凭证(包含 AccessKeyIdSecretAccessKeySessionToken),从而以角色所属账号的身份来访问云资源。

您也可以通过 AssumeRole SDK 获取临时访问凭证,如 Python SDKJava 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"
        }
    }
}

Step 4:使用临时访问凭证上传文件至 veImageX

在完成相关服务配置后,您可通过服务端 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)
        }
}