すべてのプロダクト
Search
ドキュメントセンター

Tablestore:AccessKey ペアのセキュリティ

最終更新日:Apr 30, 2026

V4 署名アルゴリズムは、AccessKey Secret を直接使用せずに、短期間有効な派生キーを認証に使用することで、ご利用の AccessKey ペアを保護します。派生キーが漏洩した場合でも、影響を受けるのは特定のリージョンおよびサービス内のリソースのみであり、派生キーの有効期間は最大で 1 日です。派生キーは翌日自動的に有効期限切れとなります。

V4 署名の仕組み

V4 署名アルゴリズムは、AccessKey Secret を直接使用する代わりに、派生キー(ご利用の AccessKey Secret、現在の日付、リージョン、プロダクトコードから計算された値)を使用します。

V4 署名を使用している場合、署名の一つが盗まれても、Alibaba Cloud アカウントまたは RAM ユーザーに属する他のリージョンやサービスには影響しません。盗まれた V4 署名の有効期間は最大で 1 日です。V4 署名を使用することで、AccessKey ペアのセキュリティを確保できます。

  • スコープ: アカウント全体ではなく、特定のリージョンおよびサービスのみが影響を受けます。

  • 時間: 派生キーの有効期間は最大で 1 日であり、翌日自動的に有効期限切れとなります。

    説明

    V4 署名を使用し、AccessKey ペアを機密として保持することで、AccessKey ペアのセキュリティを確保できます。たとえば、コード内の環境変数に AccessKey ペアを保存できます。

リクエストフロー

  1. クライアントは、V4 署名アルゴリズムを使用して AccessKey ペアから派生キーを計算し、この派生キーを含めてリクエストを送信します。

  2. サーバーはリクエストを受信し、派生キーを検証して呼び出し元を認証します。

  3. 認証が成功すると、サーバーはリクエストを処理し、結果を返します。

    説明

    認証が失敗した場合、サーバーはクライアントからのアクセスを拒否します。

  4. クライアントは応答を受信します。

サンプルコード

重要

Tablestore SDK for Java V5.16.1 以降は、V4 署名アルゴリズムをサポートしています。V4 署名アルゴリズムを使用する前に、ご利用の SDK バージョンが対応していることを確認してください。

AccessKey ペアを使用した初期化

この例では、Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペアを使用して、アクセス認証情報の設定方法を説明します。詳細については、「AccessKey ペアの取得方法

以下のサンプルコードは、V4 署名を使用して Tablestore クライアントを初期化し、インスタンス内のデータテーブルを一覧表示してテーブル名を出力します。

  • 例 1(推奨): AccessKey ペアを指定します。SDK が派生キーを自動的に計算およびリフレッシュします。

  • 例 2: AccessKey ペアと事前に計算された派生キー(v4 SigningAccessKey)の両方を指定します。派生キーは翌日に有効期限切れとなります。有効期限前にリフレッシュする仕組みを実装しない場合、Tablestore へのリクエストは失敗します。

import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.alicloud.openservices.tablestore.core.Constants.PRODUCT;
import static com.alicloud.openservices.tablestore.core.Constants.SIGNING_KEY_SIGN_METHOD;

public class InitClientV4 {
    public static void main(String[] args) {
        // インスタンスが存在するリージョンを指定します。例:cn-hangzhou。
        final String region = "yourRegion";
        // インスタンス名を指定します。
        final String instanceName = "yourInstanceName";
        // インスタンスのエンドポイントを指定します。
        final String endpoint = "yourEndpoint";
        // 環境変数から AccessKey ID および AccessKey Secret を取得します。
        final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
        final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

        {
            /**
             * 例 1:AccessKey ID および AccessKey Secret から {@link DefaultCredentials} を構築し、
             * {@link V4Credentials} を生成します。
             */
            DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
            V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
            CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

            // V4Credentials を使用して Tablestore クライアントを初期化します。
            SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

            // 任意の処理を実行します。
            client.listTable().getTableNames().forEach(System.out::println);
            // Tablestore クライアントをシャットダウンします。
            client.shutdown();
        }

        {
            /**
             * 例 2:AccessKey ペアおよび事前に計算された派生キーから直接 {@link V4Credentials} を構築します。
             */
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            String signDate = dateFormat.format(new Date()); // 例:20230527
            String v4SigningAccessKey = CalculateV4SigningKeyUtil.finalSigningKeyString(accessKeySecret, signDate, region, PRODUCT, SIGNING_KEY_SIGN_METHOD); // 派生キー
            V4Credentials credentialsV4 = new V4Credentials(accessKeyId, v4SigningAccessKey, region, signDate);
            CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

            // V4Credentials を使用して Tablestore クライアントを初期化します。
            SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

            // 任意の処理を実行します。
            client.listTable().getTableNames().forEach(System.out::println);
            // Tablestore クライアントをシャットダウンします。
            client.shutdown();
        }
    }
}

STS を使用した初期化

セキュリティトークンサービス(STS)から一時的なアクセス認証情報を取得する方法については、「STS から取得した一時的なアクセス認証情報を使用して Tablestore にアクセスする」をご参照ください。

以下のサンプルコードは、STS の一時的なアクセス認証情報を使用して V4 署名で Tablestore クライアントを初期化し、インスタンス内のデータテーブルを一覧表示してテーブル名を出力します。

  • 例 1(推奨): STS の一時的なアクセス認証情報を指定します。SDK が派生キーを自動的に計算およびリフレッシュします。

  • 例 2: STS の一時的なアクセス認証情報と事前に計算された派生キー(v4 SigningAccessKey)の両方を指定します。派生キーは翌日に有効期限切れとなります。有効期限前にリフレッシュする仕組みを実装しない場合、Tablestore へのリクエストは失敗します。

import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.alicloud.openservices.tablestore.core.Constants.PRODUCT;
import static com.alicloud.openservices.tablestore.core.Constants.SIGNING_KEY_SIGN_METHOD;

public class InitClientV4 {
    public static void main(String[] args) {
        // インスタンスが存在するリージョンを指定します。例:cn-hangzhou。
        final String region = "yourRegion";
        // インスタンス名を指定します。
        final String instanceName = "yourInstanceName";
        // インスタンスのエンドポイントを指定します。
        final String endpoint = "yourEndpoint";
        // 環境変数から一時的な AccessKey ID、一時的な AccessKey Secret、およびセキュリティトークンを取得します。
        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");

        {
            /**
             * 例 1:一時的な AccessKey ID、AccessKey Secret、およびセキュリティトークンから
             * {@link DefaultCredentials} を構築し、{@link V4Credentials} を生成します。
             */
            DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret, securityToken);
            V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
            CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

            // V4Credentials を使用して Tablestore クライアントを初期化します。
            SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

            // 任意の処理を実行します。
            client.listTable().getTableNames().forEach(System.out::println);
            // Tablestore クライアントをシャットダウンします。
            client.shutdown();
        }
        
        {
            /**
             * 例 2:STS の一時的なアクセス認証情報および事前に計算された派生キーから直接
             * {@link V4Credentials} を構築します。
             */
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            String signDate = dateFormat.format(new Date()); // 例:20230527
            String v4SigningAccessKey = CalculateV4SigningKeyUtil.finalSigningKeyString(accessKeySecret, signDate, region, PRODUCT, SIGNING_KEY_SIGN_METHOD);
            V4Credentials credentialsV4 = new V4Credentials(accessKeyId, v4SigningAccessKey, securityToken, region, signDate);
            CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

            // V4Credentials を使用して Tablestore クライアントを初期化します。
            SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

            // 任意の処理を実行します。
            client.listTable().getTableNames().forEach(System.out::println);
            // Tablestore クライアントをシャットダウンします。
            client.shutdown();
        }
    }
}