Alibaba Cloud SDKを使用し、このSDK用のマネージドシークレットプラグインをインストールする場合、AccessKeyペアが何であるか、AccessKeyペアがローテーションされているかどうかに関係なく、managed Resource Access Management (RAM) シークレットの名前を使用してクラウドサービスにアクセスできます。 マネージRAMシークレットには、RAMユーザーのAccessKeyペアが格納されます。
原則
アプリケーションがマネージシークレットプラグインを使用する場合、アプリケーションはマネージRAMシークレットの名前のみを参照する必要があります。 プラグインは、シークレットの名前に基づいてSecrets Managerからシークレットの値を取得し、その値をアプリケーションのメモリにキャッシュします。 プラグインがSecrets Managerからシークレットの値を取得し、キャッシュを更新する頻度を指定することもできます。
アプリケーションがAlibaba Cloud SDKを使用すると、アプリケーションはプラグインによってキャッシュされたAccessKeyペアを使用してクラウドサービスへのリクエストを開始します。
キャッシュされたRAMシークレットは期限切れになる場合があります。 これは、管理者がセキュリティイベントに応じてsecrets Managerでシークレットを手動でローテーションする場合に発生します。 無効なRAMシークレットを使用してAlibaba Cloudサービスにアクセスすると、アプリケーションで例外が発生します。 エラーコードInvalidAccessKeyId.NotFoundまたはInvalidAccessKeyIdが返された場合、プラグインはすぐにRAMシークレットのキャッシュを更新し、失敗したリクエストを再試行します。
無効なRAMシークレットを使用して一部のクラウドサービスにアクセスしたときに他のエラーコードが返された場合は、デフォルトの有効期限ハンドラーを変更できます。 詳細については、「例2: AccessKeyペアの有効期限トリガー処理プロセスの再設定」をご参照ください。
サポートされているAlibaba Cloud SDK
Alibaba Cloudは異なるSDKを提供します。 異なるSDK用のマネージシークレットプラグインは、個別に開発する必要があります。 次の表に、マネージドシークレットプラグインを開発するSDKを示します。
Alibaba Cloud SDK | バージョン | マネージド秘密プラグイン |
Alibaba Cloud SDK for Java | 4.3.2から4.5.17 | |
OSS Java SDK | 2.1.0から3.10.2 | |
ONS Javaクライアント | 1.8.5.最終から1.8.7.4.最終 |
マネージドシークレットプラグインを他のSDKに使用する場合は、チケットを使用してテクニカルサポートにお問い合わせください。
マネージシークレットプラグインのインストール
Alibaba Cloudは、さまざまなAlibaba Cloud SDK for Javaのマネージドシークレットプラグインを提供します。 プラグインのインストール方法の詳細については、aliyun-sdk-managed-credentials-providers-javaをご参照ください。
Maven依存関係を追加することで、Alibaba Cloud SDK for Javaのマネージドシークレットプラグインをインストールできます。 次のサンプルコードは、Maven依存関係を追加してJava用OSS SDKのマネージシークレットプラグインをインストールする方法の例を示しています。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-sdk-oss-managed-credentials-provider</artifactId>
<version>x.x.x</version>
</dependency>Alibaba Cloud sdk For Javaのマネージドシークレットプラグインのバージョンの詳細については、aliyun-sdk-managed-credentials-providers-java releaseをご参照ください。
例1: Alibaba Cloud SDKでのマネージドRAMシークレットの使用
Alibaba Cloud SDKのマネージドシークレットプラグインを設定します。
managed_credentials_providers.properties構成ファイルを使用して、Secrets ManagerからマネージRAMシークレットを取得するために使用する方法を指定できます。 この例では、アプリケーションアクセスポイント (AAP) のクライアント鍵が使用される。 クライアントキーの作成方法の詳細については、「クライアントキーをAAPにバインドする」をご参照ください。
## Specify the access method. credentials_type=client_key ## Read the decryption password of the client key. You can read the password from an environment variable or a file. 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# ## Read the private key file of the client key. client_key_private_key_path=#your client key private key file path# ## Specify the region of KMS. cache_client_region_id=[{"regionId":"#regionId#"}]マネージドRAMシークレットを使用して、クラウドサービスにアクセスします。
方法1: エンコード方法を使用します。 この例では、マネージドRAMシークレットを使用してOSSにアクセスします。
import com.aliyun.kms.secretsmanager.plugin.oss.ProxyOSSClientBuilder; import com.aliyun.oss.OSS; import com.aliyun.oss.model.Bucket; import java.util.List; public class OssPluginSample { public static void main(String[] args) throws Exception { String secretName = "******"; String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Create an OSS client. OSS ossClient = new ProxyOSSClientBuilder().build(endpoint, secretName); List<Bucket> buckets = ossClient.listBuckets(); for (Bucket bucket : buckets) { if (bucket != null) { // do something with bucket } } // Shut down the client to release the resources associated with the plug-in. ossClient.shutdown(); } }方法2: 春の豆を使用します。 この例では、OSS SDKはシステムと統合されています。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="proxyOSSClientBuilder" class="com.aliyun.kms.secretsmanager.plugin.oss.ProxyOSSClientBuilder" scope="singleton" /> </beans>
例2: AccessKeyペアの有効期限がトリガーされた処理プロセスを再構成する
デフォルトでは、マネージドシークレットプラグインはAKExpireHandler操作を呼び出して、無効なシークレットがクラウドサービスへのアクセスに使用されているかどうかを判断します。 無効なシークレットが使用されている場合、プラグインはSecrets Managerから最新のシークレットを取得し、クラウドサービスへのアクセスを再試行します。
次のサンプルコードは、AKExpireHandler操作を定義します。
package com.aliyun.kms.secretsmanager.plugin.common;
public interface AKExpireHandler<TException> {
/**
* Determine whether the exception is caused by the expiration of the AccessKey pair.
*
* @param e
* @return
*/
boolean judgeAKExpire(TException e);
}クラウドサービスによって返されるエラーコードが、無効なAccessKeyペアの使用によるものかどうかを確認します。 問題をトラブルシューティングし、AKExpireHandler操作を再度呼び出します。 例:
import com.aliyun.kms.secretsmanager.plugin.sdkcore.ProxyAcsClient;
import com.aliyun.kms.secretsmanager.plugin.common.AKExpireHandler;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import java.util.HashSet;
import java.util.Set;
public class SdkRetrySample {
public static void main(String[]args) throws Exception{
String region="cn-hangzhou";
String secretName="******";
// Obtain the client of an Alibaba Cloud SDK and obtain the secret again based on specific error codes.
IAcsClient client = new ProxyAcsClient(
region, secretName, new CustomHandler());
// The business code.
invoke(client,region);
// Shut down the client to release the resources associated with the plug-in.
client.shutdown();
}
}
class CustomHandler implements AKExpireHandler<ClientException> {
private Set<String> errorCodeSet;
public CustomerHandler() {
errorCodeSet = new HashSet<String>();
// Add an error code to allow the client to obtain the managed RAM secret from Secrets Manager again.
errorCodeSet.add("InvalidAccessKeyId.NotFound");
errorCodeSet.add("InvalidAccessKeyId");
}
@Override
public boolean judgeAKExpire(ClientException e) {
return errorCodeSet.contains(e.getErrCode());
}
}