Tablestore は、AccessKey ペアを保護するために V4 署名アルゴリズムをサポートしています。 Tablestore は、AccessKey ペアの漏洩のリスクを軽減するために、身元認証に AccessKey ペアではなく、V4 署名アルゴリズムによって生成された派生キーを使用します。派生キーが漏洩した場合、派生キーが漏洩した日に特定のリージョンにある特定のサービスに属するリソースのみが影響を受けます。派生キーは翌日自動的に有効期限切れになり、無効になります。
背景情報
V4 署名アルゴリズムは、新しい認証方式を提供します。 V4 署名は、Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey シークレット、日付、リージョン、およびプロダクトコードに基づいて計算される文字列です。
V4 署名を使用していて、署名の 1 つが盗まれた場合、Alibaba Cloud アカウントまたは RAM ユーザーに属する他のリージョンおよびサービスは影響を受けません。盗まれた V4 署名は、1 日以内に限り有効です。 V4 署名を使用して、AccessKey ペアのセキュリティを確保できます。
V4 署名を使用し、AccessKey ペアを機密にして AccessKey ペアのセキュリティを確保できます。たとえば、コードの環境変数に AccessKey ペアを保存できます。
リクエスト プロセス
クライアントは、V4 署名アルゴリズムを使用して AccessKey ペアを計算して派生キーを生成し、次に派生キーを使用してリクエストを開始します。
サーバーはリクエストを受信した後、派生キーを使用してユーザーを認証します。
身元認証に合格すると、サーバーはリクエストを処理し、処理結果を返します。
説明身元認証に失敗した場合、サーバーはクライアントからのアクセスを拒否します。
クライアントは、サーバーから返された処理結果を受信します。
サンプルコード
Java 用 Tablestore SDK V5.16.1 以降では、V4 署名アルゴリズムがサポートされています。V4 署名アルゴリズムを使用する前に、使用している SDK でこのアルゴリズムがサポートされていることを確認してください。
AccessKey ペアを使用した初期化
この例では、Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペアを使用して、アクセス認証情報を構成する方法について説明します。詳細については、「AccessKey ペアを取得するにはどうすればよいですか?」をご参照ください。
次のサンプルコードは、V4 署名を使用して Tablestore クライアントを初期化し、インスタンス内のデータテーブルのリストをクエリし、Tablestore [コンソール] にデータテーブルのリストを表示する方法の例を示しています。
例 1 では、AccessKey ペアを提供するだけで済みます。 Tablestore SDK は派生キーを計算します。派生キーを手動で維持する必要はありません。派生キーの有効期限が切れると、Tablestore SDK は派生キーを自動的に更新します。
例 2 では、AccessKey ペア (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 シークレットを取得します。
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
{
/**
* 例 1: 元の AccessKey ID と AccessKey シークレットを使用して {@link DefaultCredentials} を構築し、次に {@link V4Credentials} を生成します。
*/
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
/**
* {@link 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()); // signDate パラメータのサンプル値: 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);
/**
* {@link 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 にアクセスする」をご参照ください。
次のサンプルコードは、V4 署名を使用して Tablestore クライアントを初期化し、インスタンス内のデータテーブルのリストをクエリし、Tablestore [コンソール] にデータテーブルのリストを表示する方法の例を示しています。
例 1 では、STS から取得した一時的なアクセス認証情報を提供するだけで済みます。 Tablestore SDK は派生キーを計算して生成します。派生キーを手動で維持する必要はありません。派生キーの有効期限が切れると、Tablestore 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 シークレット、およびセキュリティトークンを取得します。
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 シークレット、およびセキュリティトークンを使用して {@link DefaultCredentials} を構築し、次に {@link V4Credentials} を生成します。
*/
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret, securityToken);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
/**
* {@link 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()); // signDate パラメータのサンプル値: 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);
/**
* {@link V4Credentials} を使用して TableStore クライアントを初期化します
*/
SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
// 何かを実行します
client.listTable().getTableNames().forEach(System.out::println);
// TableStore クライアントをシャットダウンします
client.shutdown();
}
}
}