您可以通過STS服務為其他使用者頒發一個臨時訪問憑證,使用者通過臨時訪問憑證可以在限定的有效期間內,以符合策略規定的許可權訪問Tablestore資源。超過有效期間後,該憑證自動失效,無法繼續通過該憑證訪問Tablestore資源,確保了存取控制的靈活性和時效性。
步驟一:建立RAM使用者
使用阿里雲帳號(主帳號)或Resource Access Management員登入RAM控制台。
在左側導覽列,選擇 。
在使用者頁面,單擊建立使用者。
在建立使用者頁面的使用者帳號資訊地區,設定使用者基本資料。
登入名稱稱:可包含英文字母、數字、半形句號(.)、短劃線(-)和底線(_),最多64個字元。
顯示名稱:最多包含128個字元或漢字。
標籤:單擊,然後輸入標籤鍵和標籤值。為RAM使用者綁定標籤,便於後續基於標籤的使用者管理。
說明單擊添加使用者,可以大量建立多個RAM使用者。
在訪問方式地區,選中使用永久AccessKey訪問,然後單擊确定。
在儲存AccessKey資訊對話方塊,單擊確定。
單擊操作列的複製,儲存存取金鑰(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角色授予Table Store的唯讀許可權
為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 填寫Table Store執行個體名稱。
String instanceName = "yourInstance";
// yourEndpoint 填寫Table Store執行個體的訪問地址。例如 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();
}
}