全部產品
Search
文件中心

Tablestore:配置訪問憑證

更新時間:Jun 11, 2026

不同部署環境對憑證的安全性、有效期間和輪轉方式有不同要求。Table Store提供 AK、STS Token、ECSRAMRole 等多種憑證配置方式,覆蓋從開發測試到生產部署的各類情境。

訪問憑證選型

Table Store支援 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 執行個體或Container Service Kubernetes 版 Worker 節點中的應用

否

STS Token

臨時

自動重新整理

Java

使用OIDCRoleARN

運行在Container Service Kubernetes 版 Worker 節點中的不可信應用

否

STS Token

臨時

自動重新整理

Java

使用Function Compute上下文中的Credentials

運行在Function Compute中的應用

否

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使用者存取金鑰訪問Table Store。

支援通過環境變數和靜態憑證兩種途徑配置。具體如下:

環境變數

  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");

靜態憑證

可以在代碼中使用變數來引用憑證,這些變數在運行時會被環境變數、設定檔或其他外部資料源中的實際憑證值填充。

以下操作步驟以設定檔為例,介紹在常用Table Store 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,存在安全風險且維護複雜度較高。多次臨時訪問Table Store時,需手動重新整理 STS Token。STS 臨時訪問憑證的擷取方式請參見使用STS臨時訪問憑證訪問Table Store。

該方式支援通過環境變數和靜態憑證兩種途徑配置臨時訪問憑證。具體如下:

環境變數

  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');

靜態憑證

可以在代碼中使用變數來引用憑證,這些變數在運行時會被環境變數、設定檔或其他外部資料源中的實際憑證值填充。

以下操作步驟以設定檔為例,介紹在常用Table Store 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 執行個體或Container Service 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

在Container Service 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進行後續操作...
        }
    }

使用Function Compute上下文中的Credentials

使用Function Compute上下文中的 Credentials 配置訪問憑證。該方式底層實現是 STS Token。Function Compute扮演函數配置的服務角色擷取 STS Token,通過上下文參數 Credentials 傳遞給函數代碼。該 Token 有效期間 36 小時(不可修改),函數最大執行時間為 24 小時,因此執行期間 Token 不會到期,無需重新整理。該方式無需提供 AK 或 STS Token,消除了手動維護憑證的風險。授予Function Compute訪問Table Store許可權的操作,請參見使用函數角色授予Function Compute訪問其他雲端服務的許可權。

使用Java語言實現

  1. 添加Function Compute上下文依賴。

    <!-- 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. 使用Function Compute上下文中的 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語言實現

使用Function Compute上下文中的 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 後,Key Management Service(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進行後續操作...
    }
}