配置访问凭证

更新时间:
复制为 MD 格式

不同部署环境对凭证的安全性、有效期和轮转方式有不同要求。表格存储提供 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();
    
            // 从配置文件中获取AKSK
            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 IDAccess 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 IDAccess 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');
        // 获取AKSK信息
        $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、accessKeySecretsecurityToken进行后续操作...
            }
        }
    }

    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 IDAccess 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 IDAccess 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、SKTOKEN信息
        $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配置ServiceAccountRAM权限实现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进行后续操作...
    }
}