全部产品
Search
文档中心

表格存储:配置访问凭证

更新时间:Jun 10, 2026

不同部署环境对凭证的安全性、有效期和轮转方式有不同要求。表格存储提供 AK、STS Token、ECSRAMRole 等多种凭证配置方式,覆盖从开发测试到生产部署的各类场景。

访问凭证选型

表格存储支持 AccessKey(简称 AK)、STS Token 等多种访问凭证类型及配置方式。不同配置方式的适用场景和 SDK 支持情况如下表所示。

访问凭证配置方式

适用场景

是否需要提供前置的 AK 或 STS Token

底层实现基于的凭证

凭证有效期

凭证轮转或刷新方式

SDK 支持情况

使用RAM用户的AK

运行在安全稳定且不易受外部攻击的环境中的应用,无需频繁轮转凭证即可长期访问云服务

是

AK

长期

手动轮转

Java、Go、Python、Node.js、.NET、PHP

使用STS临时访问凭证

运行在不可信环境中的应用,需要控制访问的有效期和权限

是

STS Token

临时

手动刷新

Java、Go、Python、Node.js、PHP

使用RAMRoleARN

需要跨阿里云账号授权访问云服务的应用

是

STS Token

临时

自动刷新

Java

使用ECSRAMRole

运行在阿里云 ECS 实例、ECI 实例或容器服务 Kubernetes 版 Worker 节点中的应用

否

STS Token

临时

自动刷新

Java

使用OIDCRoleARN

运行在容器服务 Kubernetes 版 Worker 节点中的不可信应用

否

STS Token

临时

自动刷新

Java

使用函数计算上下文中的Credentials

运行在函数计算中的应用

否

STS Token

临时

无需刷新

Java、Python

使用CredentialsURI

需要从外部系统获取访问凭证的应用

否

STS Token

临时

自动刷新

Java

使用自动轮转的AK

运行在面临 AK 泄露风险的环境中的应用,需要频繁轮转凭证以长期访问云服务

否

AK

长期

自动轮转

Java

使用自定义访问凭证

以上方式均不满足时,可自定义凭证获取方式

自定义

自定义

自定义

自定义

Java

使用API Key

知识存储服务和记忆存储服务的 AI 应用集成场景,无需管理 AK/SK

否

API Key

可配置

手动吊销重建

Python、TypeScript

访问凭证配置方式

根据上方选型表确定适合业务场景的配置方式后,参阅对应章节获取操作步骤和代码示例。

使用RAM用户的AK

使用 RAM 用户的 AK(Access Key ID、Access Key Secret)配置访问凭证。该方式需要手动维护 AK,存在安全风险且维护复杂度较高。

重要

阿里云账号拥有资源的全部权限,AK 一旦泄露会给系统带来巨大风险,不建议使用。推荐使用最小化授权的 RAM 用户 AK。获取 RAM 用户 AK 的操作,请参见使用RAM用户访问密钥访问表格存储。

支持通过环境变量和静态凭证两种途径配置。具体如下:

环境变量

  1. 配置环境变量。配置完成后请重启或刷新编译运行环境,包括 IDE、命令行界面、其他桌面应用程序及后台服务,确保最新的系统环境变量成功加载。

    Linux

    1. 执行以下命令,将环境变量追加到 ~/.bashrc 文件中。

      echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. 执行以下命令使变更生效。

      source ~/.bashrc
    3. 执行以下命令检查环境变量是否生效。

      echo $TABLESTORE_ACCESS_KEY_ID
      echo $TABLESTORE_ACCESS_KEY_SECRET

    macOS

    1. 在终端中执行以下命令,查看默认 Shell 类型。

      echo $SHELL
    2. 根据默认 Shell 类型进行操作。

      Zsh

      1. 执行以下命令,将环境变量追加到 ~/.zshrc 文件中。

        echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. 执行以下命令使变更生效。

        source ~/.zshrc
      3. 执行以下命令检查环境变量是否生效。

        echo $TABLESTORE_ACCESS_KEY_ID
        echo $TABLESTORE_ACCESS_KEY_SECRET

      Bash

      1. 执行以下命令,将环境变量追加到 ~/.bash_profile 文件中。

        echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. 执行以下命令使变更生效。

        source ~/.bash_profile
      3. 执行以下命令检查环境变量是否生效。

        echo $TABLESTORE_ACCESS_KEY_ID
        echo $TABLESTORE_ACCESS_KEY_SECRET

    Windows

    CMD

    1. 在 CMD 中运行以下命令设置环境变量。

      setx TABLESTORE_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx TABLESTORE_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. 重启 CMD 后,运行以下命令检查环境变量是否生效。

      echo %TABLESTORE_ACCESS_KEY_ID%
      echo %TABLESTORE_ACCESS_KEY_SECRET%

    PowerShell

    1. 在 PowerShell 中运行以下命令。

      [Environment]::SetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. 运行以下命令检查环境变量是否生效。

      [Environment]::GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. 通过环境变量传递凭证信息。

    Java

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProviderFactory;
    import com.alicloud.openservices.tablestore.core.auth.EnvironmentVariableCredentialsProvider;
    
    public class AkDemoTest {
        public static void main(String[] args) throws Exception {
            {
                // 示例1:从环境变量中获取凭证
                EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
                // 使用credentialsProvider进行后续操作...
            }
            {
                // 示例2:从环境变量中获取accessKeyId、accessKeySecret
                final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
                final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
                // 使用accessKeyId、accessKeySecret进行后续操作...
            }
        }
    }

    Python

    # -*- coding: utf-8 -*-
    import os
    
    access_key_id = os.getenv("TABLESTORE_ACCESS_KEY_ID")
    access_key_secret = os.getenv("TABLESTORE_ACCESS_KEY_SECRET")

    Go

    accessKeyId := os.Getenv("TABLESTORE_ACCESS_KEY_ID")
    accessKeySecret := os.Getenv("TABLESTORE_ACCESS_KEY_SECRET")

    Node.js

    var accessKeyId = process.env.TABLESTORE_ACCESS_KEY_ID;
    var secretAccessKey = process.env.TABLESTORE_ACCESS_KEY_SECRET;

    PHP

    $accessKeyId = getenv('TABLESTORE_ACCESS_KEY_ID');
    $accessKeySecret = getenv('TABLESTORE_ACCESS_KEY_SECRET');

    .NET

    // 从环境变量中获取访问凭证。
    var AccessKeyId = Environment.GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID");
    var AccessKeySecret = Environment.GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET");

静态凭证

可以在代码中使用变量来引用凭证,这些变量在运行时会被环境变量、配置文件或其他外部数据源中的实际凭证值填充。

以下操作步骤以配置文件为例,介绍在常用表格存储 SDK 中使用静态凭证的操作。

  1. 创建配置文件 config.ini。

    [configName]
    TABLESTORE_ACCESS_KEY_ID = your_access_key_id
    TABLESTORE_ACCESS_KEY_SECRET = your_access_key_secret
  2. 使用配置文件传递凭证信息。

    Java

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
    import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
    import java.io.FileInputStream;
    import java.util.Properties;
    
    public class AkDemoTest {
        public static void main(String[] args) throws Exception {
            Properties properties = new Properties();
            // 设置config.ini文件路径,请以实际路径为准
            String configFilePath = "config.ini";
    
            // 读取配置文件
            FileInputStream input = new FileInputStream(configFilePath);
            properties.load(input);
            input.close();
    
            // 从配置文件中获取AK和SK
            String accessKeyId = properties.getProperty("TABLESTORE_ACCESS_KEY_ID");
            String accessKeySecret = properties.getProperty("TABLESTORE_ACCESS_KEY_SECRET");
    
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
    
            // 使用credentialsProvider进行后续操作...
        }
    }

    Python

    # -*- coding: utf-8 -*-
    import configparser
    
    # 读取配置文件
    config = configparser.ConfigParser()
    # 假设config.ini位于脚本同级目录下,请以实际路径为准
    config.read('config.ini')
    
    # 从配置文件中获取Access Key ID和Access Key Secret
    access_key_id = config.get('configName', 'TABLESTORE_ACCESS_KEY_ID')
    access_key_secret = config.get('configName', 'TABLESTORE_ACCESS_KEY_SECRET')

    Go

    // 读取配置文件,请以实际路径为准
    config, err := ini.Load("config.ini")
    if err != nil {
        fmt.Println("无法读取配置文件:", err)
    }
    
    // 从配置文件中获取Access Key ID和Access Key Secret
    access_key_id := config.Section("configName").Key("TABLESTORE_ACCESS_KEY_ID").String()
    access_key_secret := config.Section("configName").Key("TABLESTORE_ACCESS_KEY_SECRET").String()

    PHP

    try {
        // 读取配置文件,假设config.ini位于脚本同级目录下,请以实际路径为准
        $config = parse_ini_file('config.ini');
        // 获取AK和SK信息
        $accessKeyId = $config['TABLESTORE_ACCESS_KEY_ID'];
        $accessKeySecret = $config['TABLESTORE_ACCESS_KEY_SECRET'];
    }catch (Exception $e) {
        printf($e->getMessage() . "\n");
        return;
    }

使用STS临时访问凭证

通过 STS 服务获取的临时身份凭证(Access Key ID、Access Key Secret 和 Security Token)配置访问凭证。该方式需要手动维护 STS Token,存在安全风险且维护复杂度较高。多次临时访问表格存储时,需手动刷新 STS Token。STS 临时访问凭证的获取方式请参见使用STS临时访问凭证访问表格存储。

该方式支持通过环境变量和静态凭证两种途径配置临时访问凭证。具体如下:

环境变量

  1. 配置环境变量。配置完成后请重启或刷新编译运行环境,包括 IDE、命令行界面、其他桌面应用程序及后台服务,确保最新的系统环境变量成功加载。

    Linux

    1. 执行以下命令,将环境变量追加到 ~/.bashrc 文件中。

      echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_STS_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_STS_ACCESS_KEY_SECRET'" >> ~/.bashrc
      echo "export TABLESTORE_SESSION_TOKEN='YOUR_STS_TOKEN'" >> ~/.bashrc
    2. 执行以下命令使变更生效。

      source ~/.bashrc
    3. 执行以下命令检查环境变量是否生效。

      echo $TABLESTORE_ACCESS_KEY_ID
      echo $TABLESTORE_ACCESS_KEY_SECRET
      echo $TABLESTORE_SESSION_TOKEN

    macOS

    1. 在终端中执行以下命令,查看默认 Shell 类型。

      echo $SHELL
    2. 根据默认 Shell 类型进行操作。

      Zsh

      1. 执行以下命令,将环境变量追加到 ~/.zshrc 文件中。

        echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_STS_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_STS_ACCESS_KEY_SECRET'" >> ~/.zshrc
        echo "export TABLESTORE_SESSION_TOKEN='YOUR_STS_TOKEN'" >> ~/.zshrc
      2. 执行以下命令使变更生效。

        source ~/.zshrc
      3. 执行以下命令检查环境变量是否生效。

        echo $TABLESTORE_ACCESS_KEY_ID
        echo $TABLESTORE_ACCESS_KEY_SECRET
        echo $TABLESTORE_SESSION_TOKEN

      Bash

      1. 执行以下命令,将环境变量追加到 ~/.bash_profile 文件中。

        echo "export TABLESTORE_ACCESS_KEY_ID='YOUR_STS_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export TABLESTORE_ACCESS_KEY_SECRET='YOUR_STS_ACCESS_KEY_SECRET'" >> ~/.bash_profile
        echo "export TABLESTORE_SESSION_TOKEN='YOUR_STS_TOKEN'" >> ~/.bash_profile
      2. 执行以下命令使变更生效。

        source ~/.bash_profile
      3. 执行以下命令检查环境变量是否生效。

        echo $TABLESTORE_ACCESS_KEY_ID
        echo $TABLESTORE_ACCESS_KEY_SECRET
        echo $TABLESTORE_SESSION_TOKEN

    Windows

    CMD

    1. 在 CMD 中运行以下命令设置环境变量。

      setx TABLESTORE_ACCESS_KEY_ID "YOUR_STS_ACCESS_KEY_ID"
      setx TABLESTORE_ACCESS_KEY_SECRET "YOUR_STS_ACCESS_KEY_SECRET"
      setx TABLESTORE_SESSION_TOKEN "YOUR_STS_TOKEN"
    2. 重启 CMD 后,运行以下命令检查环境变量是否生效。

      echo %TABLESTORE_ACCESS_KEY_ID%
      echo %TABLESTORE_ACCESS_KEY_SECRET%
      echo %TABLESTORE_SESSION_TOKEN%

    PowerShell

    1. 在 PowerShell 中运行以下命令。

      [Environment]::SetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID", "YOUR_STS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET", "YOUR_STS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("TABLESTORE_SESSION_TOKEN", "YOUR_STS_TOKEN", [EnvironmentVariableTarget]::User)
    2. 运行以下命令检查环境变量是否生效。

      [Environment]::GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("TABLESTORE_SESSION_TOKEN", [EnvironmentVariableTarget]::User)
  2. 通过环境变量传递凭证信息。

    Java

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProviderFactory;
    import com.alicloud.openservices.tablestore.core.auth.EnvironmentVariableCredentialsProvider;
    
    public class StsDemoTest {
        public static void main(String[] args) throws Exception {
            {
                // 示例1: 从环境变量中获取凭证
                EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
                // 使用credentialsProvider进行后续操作...
            }
            {
                // 示例2:从环境变量中获取accessKeyId、accessKeySecret、securityToken
                final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
                final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
                final String securityToken = System.getenv("TABLESTORE_SESSION_TOKEN");
                // 使用accessKeyId、accessKeySecret和securityToken进行后续操作...
            }
        }
    }

    Python

    # -*- coding: utf-8 -*-
    import os
    
    access_key_id = os.getenv("TABLESTORE_ACCESS_KEY_ID")
    access_key_secret = os.getenv("TABLESTORE_ACCESS_KEY_SECRET")
    sts_token = os.getenv("TABLESTORE_SESSION_TOKEN")

    Go

    accessKeyId := os.Getenv("TABLESTORE_ACCESS_KEY_ID")
    accessKeySecret := os.Getenv("TABLESTORE_ACCESS_KEY_SECRET")
    securityToken := os.Getenv("TABLESTORE_SESSION_TOKEN")

    Node.js

    var accessKeyId = process.env.TABLESTORE_ACCESS_KEY_ID;
    var secretAccessKey = process.env.TABLESTORE_ACCESS_KEY_SECRET;
    var stsToken = process.env.TABLESTORE_SESSION_TOKEN;

    PHP

    $accessKeyId = getenv('TABLESTORE_ACCESS_KEY_ID');
    $accessKeySecret = getenv('TABLESTORE_ACCESS_KEY_SECRET');
    $securityToken = getenv('TABLESTORE_SESSION_TOKEN');

静态凭证

可以在代码中使用变量来引用凭证,这些变量在运行时会被环境变量、配置文件或其他外部数据源中的实际凭证值填充。

以下操作步骤以配置文件为例,介绍在常用表格存储 SDK 中使用静态凭证的操作。

  1. 创建配置文件 config.ini。

    [configName]
    TABLESTORE_ACCESS_KEY_ID = your_sts_access_key_id
    TABLESTORE_ACCESS_KEY_SECRET = your_sts_access_key_secret
    TABLESTORE_SESSION_TOKEN = your_sts_token
  2. 使用配置文件传递凭证信息。

    Java

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
    import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
    import java.io.FileInputStream;
    import java.util.Properties;
    
    public class StsDemoTest {
        public static void main(String[] args) throws Exception {
            Properties properties = new Properties();
            // 设置config.ini文件路径,请以实际路径为准
            String configFilePath = "config.ini";
    
            // 读取配置文件
            FileInputStream input = new FileInputStream(configFilePath);
            properties.load(input);
            input.close();
    
            // 从配置文件中获取AK、SK、Token
            String accessKeyId = properties.getProperty("TABLESTORE_ACCESS_KEY_ID");
            String accessKeySecret = properties.getProperty("TABLESTORE_ACCESS_KEY_SECRET");
            String securityToken = properties.getProperty("TABLESTORE_SESSION_TOKEN");
    
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, securityToken);
            // 使用credentialsProvider进行后续操作...
        }
    }

    Python

    # -*- coding: utf-8 -*-
    import configparser
    
    # 读取配置文件
    config = configparser.ConfigParser()
    # 假设config.ini位于脚本同级目录下,请以实际路径为准
    config.read('config.ini')
    
    # 从配置文件中获取Access Key ID和Access Key Secret
    access_key_id = config.get('configName', 'TABLESTORE_ACCESS_KEY_ID')
    access_key_secret = config.get('configName', 'TABLESTORE_ACCESS_KEY_SECRET')
    security_token = config.get('configName', 'TABLESTORE_SESSION_TOKEN')

    Go

    // 读取配置文件,请以实际路径为准
    config, err := ini.Load("config.ini")
    if err != nil {
        fmt.Println("无法读取配置文件:", err)
    }
    
    // 从配置文件中获取Access Key ID和Access Key Secret
    access_key_id := config.Section("configName").Key("TABLESTORE_ACCESS_KEY_ID").String()
    access_key_secret := config.Section("configName").Key("TABLESTORE_ACCESS_KEY_SECRET").String()
    security_token := config.Section("configName").Key("TABLESTORE_SESSION_TOKEN").String()

    PHP

    try {
        // 读取配置文件,假设config.ini位于脚本同级目录下,请以实际路径为准
        $config = parse_ini_file('config.ini');
        // 获取AK、SK和TOKEN信息
        $accessKeyId = $config['TABLESTORE_ACCESS_KEY_ID'];
        $accessKeySecret = $config['TABLESTORE_ACCESS_KEY_SECRET'];
        $securityToken = $config['TABLESTORE_SESSION_TOKEN'];
    }catch (Exception $e) {
        printf($e->getMessage() . "\n");
        return;
    }

使用RAMRoleARN

使用 RAMRoleARN 配置访问凭证。该方式底层实现是 STS Token。通过指定 RAM 角色的 ARN(Alibabacloud Resource Name),Credentials 工具会向 STS 服务请求 STS Token,并在会话到期前自动刷新。此外,还可以通过为 policy 赋值来限制 RAM 角色到一个更小的权限集合。该方式需要提供 AK,存在安全风险且维护复杂度较高。获取 AK 的操作请参见创建AccessKey。获取 RAMRoleARN 的操作请参见创建RAM角色。

  1. 添加 credentials 依赖。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  2. 配置 AK 和 RAMRoleARN 作为访问凭证。

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
    import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
    import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials;
    import com.aliyun.credentials.models.CredentialModel;
    
    public class RamRoleArnAkDemoTest {
    
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // 访问凭证类型。固定为ram_role_arn
            config.setType("ram_role_arn");
            // 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通过环境变量ALIBABA_CLOUD_ROLE_ARN设置RoleArn
            config.setRoleArn("<RoleArn>");
            // 从环境变量中获取AccessKeyId
            config.setAccessKeyId(System.getenv().get("TABLESTORE_ACCESS_KEY_ID"));
            // 从环境变量中获取AccessKeySecret
            config.setAccessKeySecret(System.getenv().get("TABLESTORE_ACCESS_KEY_SECRET"));
            // 填写RAM角色的会话名称
            config.setRoleName("roleSessionName");
            // 设置更小的权限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // 设置角色会话有效期,非必填
            config.setRoleSessionExpiration(3600);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(ServiceCredentials credentials) {
                }
    
                @Override
                public ServiceCredentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // 使用credentialsProvider进行后续操作...
        }
    }

使用ECSRAMRole

使用 ECSRAMRole 配置访问凭证。该方式底层实现是 STS Token。ECSRAMRole 允许将一个角色关联到 ECS 实例、ECI 实例或容器服务 Kubernetes 版的 Worker 节点,实现在实例内部自动刷新 STS Token。该方式无需提供 AK 或 STS Token,消除了手动维护凭证的风险。获取 ECSRAMRole 的操作请参见创建RAM角色。

  1. 添加 credentials 依赖。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  2. 配置 ECSRAMRole 作为访问凭证。

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
    import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
    import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials;
    import com.aliyun.credentials.models.CredentialModel;
    
    public class EcsRamRoleDemoTest {
    
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // 访问凭证类型。固定为ecs_ram_role。
            config.setType("ecs_ram_role");
            // 为ECS授予的RAM角色的名称。可选参数。如果不设置,将自动检索。强烈建议设置,以减少请求。
            config.setRoleName("ECSRAMRole");
            // 开启ECS实例元数据加固模式。可选参数。强烈建议设置,以提高整体系统的安全性。
            config.setEnableIMDSv2(true);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider(){
                @Override
                public void setCredentials(ServiceCredentials credentials) {
                }
    
                @Override
                public ServiceCredentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return  new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // 使用credentialsProvider进行后续操作...
        }
    }

使用OIDCRoleARN

在容器服务 Kubernetes 版中设置了 Worker 节点 RAM 角色后,对应节点内 Pod 中的应用可以像 ECS 上部署的应用一样,通过元数据服务(Meta Data Server)获取关联角色的 STS Token。但如果容器集群上部署的是不可信应用(例如客户提交的应用,代码不可见),不建议通过元数据服务获取 Worker 节点关联的 STS Token。

RRSA(RAM Roles for Service Account)实现应用级别的权限隔离,让不可信应用安全获取所需凭证,同时保护其他云资源。该方式底层实现是 STS Token。阿里云容器集群会为不同的应用 Pod 创建和挂载相应的服务账户 OIDC Token 文件,并将相关配置信息注入环境变量中,Credentials 工具通过获取环境变量的配置信息,调用 STS 服务的 AssumeRoleWithOIDC 接口换取绑定角色的 STS Token。该方式无需提供 AK 或 STS Token,消除了手动维护凭证的风险。详情请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。

  1. 添加 credentials 依赖。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  2. 配置 OIDC 的 RAM 角色作为访问凭证。

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
    import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
    import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials;
    import com.aliyun.credentials.models.CredentialModel;
    
    public class OidcRoleArnDemoTest {
    
        public static void main(String[] args) {
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // 指定Credential类型,固定值为oidc_role_arn
            config.setType("oidc_role_arn");
            // RAM角色名称ARN,可以通过环境变量ALIBABA_CLOUD_ROLE_ARN设置RoleArn
            config.setRoleArn("<RoleArn>");
            // OIDC提供商ARN,可以通过环境变量ALIBABA_CLOUD_OIDC_PROVIDER_ARN设置OidcProviderArn
            config.setOidcProviderArn("<OidcProviderArn>");
            // OIDC Token文件路径,可以通过环境变量ALIBABA_CLOUD_OIDC_TOKEN_FILE设置OidcTokenFilePath
            config.setOidcTokenFilePath("<OidcTokenFilePath>");
            // 角色会话名称,可以通过环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME设置RoleSessionName
            config.setRoleSessionName("<RoleSessionName>");
            // 设置更小的权限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // 设置session过期时间
            config.setRoleSessionExpiration(3600);
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider() {
                @Override
                public void setCredentials(ServiceCredentials credentials) {
                }
    
                @Override
                public ServiceCredentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // 使用credentialsProvider进行后续操作...
        }
    }

使用函数计算上下文中的Credentials

使用函数计算上下文中的 Credentials 配置访问凭证。该方式底层实现是 STS Token。函数计算扮演函数配置的服务角色获取 STS Token,通过上下文参数 Credentials 传递给函数代码。该 Token 有效期 36 小时(不可修改),函数最大执行时间为 24 小时,因此执行期间 Token 不会过期,无需刷新。该方式无需提供 AK 或 STS Token,消除了手动维护凭证的风险。授予函数计算访问表格存储权限的操作,请参见使用函数角色授予函数计算访问其他云服务的权限。

使用Java语言实现

  1. 添加函数计算上下文依赖。

    <!-- https://mvnrepository.com/artifact/com.aliyun.fc.runtime/fc-java-core -->
    <dependency>
        <groupId>com.aliyun.fc.runtime</groupId>
        <artifactId>fc-java-core</artifactId>
        <version>1.4.1</version>
    </dependency>
  2. 使用函数计算上下文中的 Credentials 初始化凭证提供者。

    package example;
    
    import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
    import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
    import com.aliyun.fc.runtime.Context;
    import com.aliyun.fc.runtime.Credentials;
    import com.aliyun.fc.runtime.StreamRequestHandler;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    public class App implements StreamRequestHandler {
    
        @Override
        public void handleRequest(
                InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
    
            // 获取密钥信息,执行前,确保函数所在的服务配置了角色信息,并且角色需要拥有Tablestore的权限,建议直接使用AliyunFCDefaultRole角色
            Credentials creds = context.getExecutionCredentials();
    
            // 使用获取到的凭证创建凭证提供者实例
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken());
    
            // 使用credentialsProvider进行后续操作...
    
            outputStream.write(new String("done").getBytes());
        }
    }

使用Python语言实现

使用函数计算上下文中的 Credentials 获取临时访问凭证。

# -*- coding: utf-8 -*-

def handler(event, context):
    # 获取密钥信息,执行前,确保函数所在的服务配置了角色信息,并且角色需要拥有Tablestore的权限,建议直接使用AliyunFCDefaultRole角色
    creds = context.credentials

    access_key_id = creds.access_key_id
    access_key_secret = creds.access_key_secret
    security_token = creds.security_token

    # 后续操作...

    return 'success'

使用CredentialsURI

使用 CredentialsURI 配置访问凭证。该方式底层实现是 STS Token。Credentials 工具通过提供的 URI 获取 STS Token,完成凭证客户端初始化。该方式无需提供 AK 或 STS Token,消除了手动维护凭证的风险。提供 CredentialsURI 响应的后端服务需要实现 STS Token 的自动刷新逻辑,确保应用程序始终能获取到有效凭证。

  1. 为了使 Credentials 工具正确解析和使用 STS Token,URI 必须遵循以下响应协议:

    • 响应状态码:200

    • 响应体结构:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. 添加 credentials 依赖。

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>0.3.4</version>
    </dependency>
  3. 配置 CredentialsURI 作为访问凭证。

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
    import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
    import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials;
    import com.aliyun.credentials.models.CredentialModel;
    
    public class CredentialsUriDemoTest {
        public static void main(String[] args) {
    
            com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config();
            // 访问凭证类型。固定为credentials_uri
            config.setType("credentials_uri");
            // 换取凭证的URI,格式为http://local_or_remote_uri/
            config.setCredentialsUri("<local_or_remote_uri>");
    
            final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config);
    
            CredentialsProvider credentialsProvider = new CredentialsProvider() {
                @Override
                public void setCredentials(ServiceCredentials credentials) {
                }
    
                @Override
                public ServiceCredentials getCredentials() {
                    CredentialModel credential = credentialsClient.getCredential();
                    return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken());
                }
            };
            // 使用credentialsProvider进行后续操作...
        }
    }

使用自动轮转的AK

使用ClientKey配置访问凭证。使用 ClientKey 后,密钥管理服务(KMS)可以对托管的 RAM 用户 AK 进行全自动的定期轮转,将静态的 RAM 用户 AK 动态化,从而降低 AK 泄漏的风险。除定期轮转外,KMS 还支持立即轮转,在 AK 泄漏情况下可快速更换。该方式无需手动维护 AK,降低了安全性风险和维护复杂度。

  1. 添加凭据客户端依赖。

    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibabacloud-secretsmanager-client</artifactId>
        <version>1.3.7</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>4.7.0</version>
    </dependency>
  2. 创建配置文件 secretsmanager.properties。

    # 访问凭据类型,固定为client_key
    credentials_type=client_key
    
    # 读取Client Key的解密密码:支持从环境变量或者文件读取,只需设置一种
    client_key_password_from_env_variable=<your client key private key password environment variable name>
    client_key_password_from_file_path=<your client key private key password file path>
    
    # Client Key的私钥文件路径
    client_key_private_key_path=<your client key private key file path>
    
    # 关联的KMS服务地域
    cache_client_region_id=[{"regionId":"<regionId>"}]
  3. 使用配置文件传递凭证信息。

    import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
    import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
    import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials;
    import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient;
    import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder;
    import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException;
    import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo;
    import org.codehaus.jettison.json.JSONException;
    import org.codehaus.jettison.json.JSONObject;
    
    public class ClientKeyDemoTest {
    
        public static void main(String[] args) throws CacheSecretException {
            final SecretCacheClient client = SecretCacheClientBuilder.newClient();
            CredentialsProvider credentialsProvider = new CredentialsProvider() {
                @Override
                public void setCredentials(ServiceCredentials credentials) {
                }
    
                @Override
                public ServiceCredentials getCredentials() {
                    try {
                        SecretInfo secretInfo = client.getSecretInfo("<secretName>");
                        JSONObject jsonObject = new JSONObject(secretInfo.getSecretValue());
    
                        String accessKeyId = jsonObject.getString("AccessKeyId");
                        String accessKeySecret = jsonObject.getString("AccessKeySecret");
    
                        return new DefaultCredentials(accessKeyId, accessKeySecret);
                    } catch (CacheSecretException | JSONException e) {
                        return null;
                    }
                }
            };
            // 使用credentialsProvider进行后续操作...
        }
    }

使用自定义访问凭证

如果以上凭证配置方式都不满足要求,还可以通过实现 Credential Providers 接口来自定义凭证提供方式。如果底层实现是 STS Token,需要提供凭证的更新支持。

import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.ServiceCredentials;

public class CustomCredentialProviderDemoTest {

    public static void main(String[] args) {

        CredentialsProvider credentialsProvider = new CredentialsProvider(){

            // 初始化变量
            String accessKeyId = null;
            // 初始化变量
            String accessKeySecret = null;
            // 初始化变量
            // String token = null;

            @Override
            public void setCredentials(ServiceCredentials credentials) {
            }

            @Override
            public ServiceCredentials getCredentials() {
                //TODO
                //自定义访问凭证的获取方法

                // 返回长期凭证 access_key_id, access_key_secret
                return new DefaultCredentials(accessKeyId, accessKeySecret);

                // 返回 临时凭证 access_key_id, access_key_secret, token
                // 对于临时凭证,需要根据过期时间,刷新凭证。
                // return new DefaultCredentials(accessKeyId, accessKeySecret, token);
            }
        };
        // 使用credentialsProvider进行后续操作...
    }
}