V4 署名アルゴリズムは、AccessKey Secret を直接使用せずに、短期間有効な派生キーを認証に使用することで、ご利用の AccessKey ペアを保護します。派生キーが漏洩した場合でも、影響を受けるのは特定のリージョンおよびサービス内のリソースのみであり、派生キーの有効期間は最大で 1 日です。派生キーは翌日自動的に有効期限切れとなります。
V4 署名の仕組み
V4 署名アルゴリズムは、AccessKey Secret を直接使用する代わりに、派生キー(ご利用の AccessKey Secret、現在の日付、リージョン、プロダクトコードから計算された値)を使用します。
V4 署名を使用している場合、署名の一つが盗まれても、Alibaba Cloud アカウントまたは RAM ユーザーに属する他のリージョンやサービスには影響しません。盗まれた V4 署名の有効期間は最大で 1 日です。V4 署名を使用することで、AccessKey ペアのセキュリティを確保できます。
スコープ: アカウント全体ではなく、特定のリージョンおよびサービスのみが影響を受けます。
-
時間: 派生キーの有効期間は最大で 1 日であり、翌日自動的に有効期限切れとなります。
説明V4 署名を使用し、AccessKey ペアを機密として保持することで、AccessKey ペアのセキュリティを確保できます。たとえば、コード内の環境変数に AccessKey ペアを保存できます。
リクエストフロー
クライアントは、V4 署名アルゴリズムを使用して AccessKey ペアから派生キーを計算し、この派生キーを含めてリクエストを送信します。
サーバーはリクエストを受信し、派生キーを検証して呼び出し元を認証します。
-
認証が成功すると、サーバーはリクエストを処理し、結果を返します。
説明認証が失敗した場合、サーバーはクライアントからのアクセスを拒否します。
クライアントは応答を受信します。
サンプルコード
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();
}
}
}