您可以通过STS服务为其他用户颁发一个临时访问凭证,用户通过临时访问凭证可以在限定的有效期内,以符合策略规定的权限访问Tablestore资源。超过有效期后,该凭证自动失效,无法继续通过该凭证访问Tablestore资源,确保了访问控制的灵活性和时效性。
步骤一:创建RAM用户
使用阿里云账号(主账号)或RAM管理员登录RAM控制台。
在左侧导航栏,选择 。
在用户页面,单击创建用户。
在创建用户页面的用户账号信息区域,设置用户基本信息。
登录名称:可包含英文字母、数字、半角句号(.)、短划线(-)和下划线(_),最多64个字符。
显示名称:最多包含128个字符或汉字。
标签:单击,然后输入标签键和标签值。为RAM用户绑定标签,便于后续基于标签的用户管理。
说明单击添加用户,可以批量创建多个RAM用户。
在访问方式区域,选择OpenAPI调用访问,然后单击确定。
根据界面提示,完成安全验证。
单击复制,保存访问密钥(AccessKey ID和AccessKey Secret)。
重要RAM用户的AccessKey Secret只在创建时显示,不支持查看,请妥善保管。
步骤二:为RAM用户授予请求AssumeRole的权限
创建RAM用户后,您需要授予RAM用户通过扮演角色来调用STS服务的权限。
单击已创建RAM用户右侧对应的添加权限。
在新增授权页面,选择AliyunSTSAssumeRoleAccess系统策略。
说明授予RAM用户调用STS服务AssumeRole接口的固定权限是AliyunSTSAssumeRoleAccess,与后续获取临时访问凭证以及通过临时访问凭证发起Tablestore请求所需权限无关。
单击确认新增授权。
步骤三:创建RAM角色
您需要创建RAM角色,用于定义RAM角色被扮演时,可以获得Tablestore服务的哪些访问权限。
在左侧导航栏,选择身份管理>角色。
单击创建角色,选择可信实体类型为阿里云账号,单击下一步。
在创建角色对话框,角色名称填写为RamTablestoreTest,选择信任的云账号为当前云账号。
单击完成。角色创建完成后,单击关闭。
在角色页面,搜索框输入角色名称RamTablestoreTest,然后单击RamTablestoreTest。
单击ARN右侧的复制,保存角色的ARN。
步骤四:为RAM角色授予表格存储的只读权限
为RAM角色附加一个或多个权限策略,明确RAM角色在被扮演时所能拥有的Tablestore资源访问权限。例如,如果希望RAM用户在扮演该角色后只能从Tablestore读取数据,则需要为角色添加只读权限的策略。
创建自定义权限策略。
在左侧导航栏,选择权限管理>权限策略。
在权限策略页面,单击创建权限策略。
在创建权限策略页面,单击脚本编辑。具体配置示例如下。
警告以下示例仅供参考。您需要根据实际需求配置更细粒度的授权策略,防止出现权限过大的风险。更细粒度的授权策略配置,请参见自定义RAM Policy。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ots:BatchGet*", "ots:Describe*", "ots:Get*", "ots:List*", "ots:Consume*", "ots:Search", "ots:ComputeSplitPointsBySize" ], "Resource": [ "acs:ots:*:*:instance/ram-test-app*" ], "Condition": {} } ] }
策略配置完成后,单击继续编辑基本信息。
在基本信息区域,填写策略名称为RamTestPolicy,然后单击确定。
为RAM角色RamTablestoreTest授予自定义权限策略。
在左侧导航栏,选择
。在角色页面,找到目标RAM角色RamTablestoreTest。
单击RAM角色RamTablestoreTest右侧的新增授权。
在添加权限页面下的自定义策略页签,选择已创建的自定义权限策略RamTestPolicy。
单击确定。
步骤五:使用RAM用户扮演RAM角色获取临时访问凭证
为角色授予只读的权限后,RAM用户需要通过扮演角色来获取临时访问凭证。临时访问凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间(Expiration)。
使用STS SDK
您可以使用STS SDK来获取临时访问凭证。
Java
本文以Java为例,说明如何使用STS SDK获取临时访问凭证。
SDK 安装信息
SDK 包名称:com.aliyun/sts20150401
SDK包版本:1.1.4
SDK 包管理平台:maven
SDK 安装命令:
<dependency> <groupId>com.aliyun</groupId> <artifactId>sts20150401</artifactId> <version>1.1.4</version> </dependency>
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>使用AK&SK初始化账号Client</p>
*
* @return Client
* @throws Exception
*/
public static com.aliyun.sts20150401.Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Endpoint 请参考 https://api.aliyun.com/product/Sts
config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
return new com.aliyun.sts20150401.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.sts20150401.Client client = Sample.createClient();
com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest()
// 临时访问凭证的有效时间,单位为秒。最小值为900,最大值以当前角色设定的最大会话时间为准。当前角色最大会话时间取值范围为3600秒~43200秒,默认值为3600秒。
.setDurationSeconds(3600L)
// 角色外部 ID。该参数为外部提供的用于表示角色的参数信息,主要功能是防止混淆代理人问题。
//.setExternalId(null)
// 为STS Token额外添加的一个权限策略,进一步限制STS Token的权限。
//.setPolicy(null)
// 必填,请确保代码运行环境设置了环境变量 TABLESTORE_STS_ROLE_ARN。即步骤3生成的RAM角色的RamRoleArn。
.setRoleArn(System.getenv("TABLESTORE_STS_ROLE_ARN"))
// 自定义角色会话名称,用来区分不同的令牌。
.setRoleSessionName("yourRoleSessionName");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
client.assumeRoleWithOptions(assumeRoleRequest, runtime);
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
Go
本文以Go为例,说明如何使用STS SDK获取临时访问凭证。
SDK 安装信息
SDK 包名称:github.com/alibabacloud-go/sts-20150401/v2
SDK包版本:v2.0.2
SDK 包管理平台:github
SDK 安装命令:
go get github.com/alibabacloud-go/sts-20150401/v2
package main
import (
"encoding/json"
"strings"
"fmt"
"os"
sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
// Description:
//
// 使用AK&SK初始化账号Client
//
// @return Client
//
// @throws Exception
func CreateClient () (_result *sts20150401.Client, _err error) {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
config := &openapi.Config{
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
}
// Endpoint 请参考 https://api.aliyun.com/product/Sts
config.Endpoint = tea.String("sts.cn-hangzhou.aliyuncs.com")
_result = &sts20150401.Client{}
_result, _err = sts20150401.NewClient(config)
return _result, _err
}
func _main (args []*string) (_err error) {
client, _err := CreateClient()
if _err != nil {
return _err
}
assumeRoleRequest := &sts20150401.AssumeRoleRequest{
// 必填,请确保代码运行环境设置了环境变量 TABLESTORE_STS_ROLE_ARN。即步骤3生成的RAM角色的RamRoleArn。
RoleArn: tea.String(os.Getenv("TABLESTORE_STS_ROLE_ARN")),
// 临时访问凭证的有效时间,单位为秒。最小值为900,最大值以当前角色设定的最大会话时间为准。当前角色最大会话时间取值范围为3600秒~43200秒,默认值为3600秒。
DurationSeconds: tea.Int64(3600),
// 为STS Token额外添加的一个权限策略,进一步限制STS Token的权限。
//Policy: ,
// 自定义角色会话名称,用来区分不同的令牌。
RoleSessionName: tea.String("yourRoleSessionName"),
// 角色外部 ID。该参数为外部提供的用于表示角色的参数信息,主要功能是防止混淆代理人问题
//ExternalId: ,
}
runtime := &util.RuntimeOptions{}
tryErr := func()(_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
// 复制代码运行请自行打印 API 的返回值
_, _err = client.AssumeRoleWithOptions(assumeRoleRequest, runtime)
if _err != nil {
return _err
}
return nil
}()
if tryErr != nil {
var error = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
error = _t
} else {
error.Message = tea.String(tryErr.Error())
}
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
fmt.Println(tea.StringValue(error.Message))
// 诊断地址
var data interface{}
d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
d.Decode(&data)
if m, ok := data.(map[string]interface{}); ok {
recommend, _ := m["Recommend"]
fmt.Println(recommend)
}
_, _err = util.AssertAsString(error.Message)
if _err != nil {
return _err
}
}
return _err
}
func main() {
err := _main(tea.StringSlice(os.Args[1:]))
if err != nil {
panic(err)
}
}
Python
本文以Python为例,说明如何使用STS SDK获取临时访问凭证。
SDK 安装信息
SDK 包名称:alibabacloud_sts20150401
SDK包版本:1.1.4
SDK 包管理平台:pypi
SDK 安装命令:
pip install alibabacloud_sts20150401==1.1.4
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import sys
from typing import List
from alibabacloud_sts20150401.client import Client as Sts20150401Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_sts20150401 import models as sts_20150401_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> Sts20150401Client:
"""
使用AK&SK初始化账号Client
@return: Client
@throws Exception
"""
# 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
config = open_api_models.Config(
# 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。,
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
)
# Endpoint 请参考 https://api.aliyun.com/product/Sts
config.endpoint = f'sts.cn-hangzhou.aliyuncs.com'
return Sts20150401Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
assume_role_request = sts_20150401_models.AssumeRoleRequest(
# 临时访问凭证的有效时间,单位为秒。最小值为900,最大值以当前角色设定的最大会话时间为准。当前角色最大会话时间取值范围为3600秒~43200秒,默认值为3600秒。
duration_seconds=3600,
# 角色外部ID。该参数为外部提供的用于表示角色的参数信息,主要功能是防止混淆代理人问题。
# external_id=None,
# 为STS Token额外添加的一个权限策略,进一步限制STS Token的权限。
# policy=None,
# 必填,请确保代码运行环境设置了环境变量 TABLESTORE_STS_ROLE_ARN。即步骤3生成的RAM角色的RamRoleArn。
role_arn=os.environ['TABLESTORE_STS_ROLE_ARN'],
# 自定义角色会话名称,用来区分不同的令牌。
role_session_name="yourRoleSessionName"
)
runtime = util_models.RuntimeOptions()
try:
# 复制代码运行请自行打印 API 的返回值
client.assume_role_with_options(assume_role_request, runtime)
except Exception as error:
# 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
# 错误 message
print(error.message)
# 诊断地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
@staticmethod
async def main_async(
args: List[str],
) -> None:
client = Sample.create_client()
assume_role_request = sts_20150401_models.AssumeRoleRequest()
runtime = util_models.RuntimeOptions()
try:
# 复制代码运行请自行打印 API 的返回值
await client.assume_role_with_options_async(assume_role_request, runtime)
except Exception as error:
# 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
# 错误 message
print(error.message)
# 诊断地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])
Node.js
本文以Node.js为例,说明如何使用STS SDK获取临时访问凭证。
SDK 安装信息
SDK 包名称:@alicloud/sts20150401
SDK包版本:1.1.4
SDK 包管理平台:npm
SDK 安装命令:
npm install @alicloud/sts20150401@1.1.4
'use strict';
const Sts20150401 = require('@alicloud/sts20150401');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');
class Client {
/**
* 使用AK&SK初始化账号Client
* @return Client
* @throws Exception
*/
static createClient() {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
let config = new OpenApi.Config({
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
});
// Endpoint 请参考 https://api.aliyun.com/product/Sts
config.endpoint = `sts.cn-hangzhou.aliyuncs.com`;
return new Sts20150401.default(config);
}
static async main(args) {
let client = Client.createClient();
let assumeRoleRequest = new Sts20150401.AssumeRoleRequest({
// 临时访问凭证的有效时间,单位为秒。最小值为900,最大值以当前角色设定的最大会话时间为准。当前角色最大会话时间取值范围为3600秒~43200秒,默认值为3600秒。
durationSeconds: 3600,
// 角色外部ID。该参数为外部提供的用于表示角色的参数信息,主要功能是防止混淆代理人问题。
//externalId: null,
// 为STS Token额外添加的一个权限策略,进一步限制STS Token的权限。
//policy: null,
// 必填,请确保代码运行环境设置了环境变量 TABLESTORE_STS_ROLE_ARN。即步骤3生成的RAM角色的RamRoleArn。
roleArn: process.env.TABLESTORE_STS_ROLE_ARN,
//自定义角色会话名称,用来区分不同的令牌。
roleSessionName: 'yourRoleSessionName'
});
let runtime = new Util.RuntimeOptions({ });
try {
// 复制代码运行请自行打印 API 的返回值
await client.assumeRoleWithOptions(assumeRoleRequest, runtime);
} catch (error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
console.log(error.message);
// 诊断地址
console.log(error.data["Recommend"]);
Util.default.assertAsString(error.message);
}
}
}
exports.Client = Client;
Client.main(process.argv.slice(2));
PHP
本文以PHP为例,说明如何使用STS SDK获取临时访问凭证。
SDK 安装信息
SDK 包名称:alibabacloud/sts-20150401
SDK包版本:1.1.4
SDK 包管理平台:packagist
SDK 安装命令:
composer require alibabacloud/sts-20150401 1.1.4
<?php
namespace AlibabaCloud\SDK\Sample;
use AlibabaCloud\SDK\Sts\V20150401\Sts;
use \Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use AlibabaCloud\Tea\Utils\Utils;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Sts\V20150401\Models\AssumeRoleRequest;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
class Sample {
/**
* 使用AK&SK初始化账号Client
* @return Sts Client
*/
public static function createClient(){
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
$config = new Config([
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
"accessKeyId" => getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
"accessKeySecret" => getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
]);
// Endpoint 请参考 https://api.aliyun.com/product/Sts
$config->endpoint = "sts.cn-hangzhou.aliyuncs.com";
return new Sts($config);
}
/**
* @param string[] $args
* @return void
*/
public static function main($args){
$client = self::createClient();
$assumeRoleRequest = new AssumeRoleRequest([
// 临时访问凭证的有效时间,单位为秒。最小值为900,最大值以当前角色设定的最大会话时间为准。当前角色最大会话时间取值范围为3600秒~43200秒,默认值为3600秒。
"durationSeconds" => 3600,
// 自定义角色会话名称,用来区分不同的令牌。
"roleSessionName" => "yourRoleSessionName",
// 必填,请确保代码运行环境设置了环境变量 TABLESTORE_STS_ROLE_ARN。即步骤3生成的RAM角色的RamRoleArn。
"roleArn" => getenv("TABLESTORE_STS_ROLE_ARN"),
]);
$runtime = new RuntimeOptions([]);
try {
// 复制代码运行请自行打印 API 的返回值
$client->assumeRoleWithOptions($assumeRoleRequest, $runtime);
}
catch (Exception $error) {
if (!($error instanceof TeaError)) {
$error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
}
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
var_dump($error->message);
// 诊断地址
var_dump($error->data["Recommend"]);
Utils::assertAsString($error->message);
}
}
}
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
require_once $path;
}
Sample::main(array_slice($argv, 1));
使用REST API
您可以通过调用STS服务的AssumeRole - 获取扮演角色的临时身份凭证接口来获取临时访问凭证。
步骤六:使用STS临时访问凭证请求Tablestore列出表名称
临时访问凭证有效期(Expiration)到期之前,列出表名称的Java示例代码如下:
临时访问凭证过期时间格式是UTC,比北京时间晚8小时。例如,临时访问凭证过期时间是2024-04-18T11:33:40Z,说明临时访问凭证将在北京时间2024年4月18日19时33分40秒之前过期。
临时访问凭证没有明确的使用次数限制。
列出表名称的Java示例代码如下:
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProviderFactory;
import com.alicloud.openservices.tablestore.core.auth.EnvironmentVariableCredentialsProvider;
import com.alicloud.openservices.tablestore.model.ListTableResponse;
public class StsAccessKeySample {
public static void main(String[] args) {
// yourInstance 填写表格存储实例名称。
String instanceName = "yourInstance";
// yourEndpoint 填写表格存储实例的访问地址。例如 https://yourInstance.cn-hangzhou.ots.aliyuncs.com。
String endPoint = "yourEndpoint";
// 强烈建议不要把访问凭证保存到工程代码里,否则可能导致访问凭证泄露,威胁您账号下所有资源的安全。
// 本代码示例以从环境变量中获取访问凭证为例。运行本代码示例之前,请先配置环境变量:TABLESTORE_ACCESS_KEY_ID、TABLESTORE_ACCESS_KEY_SECRET和TABLESTORE_SESSION_TOKEN。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 创建OTSClient实例
SyncClient client = new SyncClient(endPoint, credentialsProvider, instanceName, null, new ResourceManager(null, null));
//查询表名称
ListTableResponse listTableResponse = client.listTable();
listTableResponse.getTableNames().forEach(System.out::println);
// 关闭OTSClient
client.shutdown();
}
}