配置訪問憑證

更新時間:
Copy as MD

不同部署環境對憑證的安全性、有效期間和輪轉方式有不同要求。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();
    
            // 從設定檔中擷取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,存在安全風險且維護複雜度較高。多次臨時訪問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、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');

靜態憑證

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

以下操作步驟以設定檔為例,介紹在常用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 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 執行個體或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配置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進行後續操作...
        }
    }

使用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進行後續操作...
    }
}