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

Key Management Service:Alibaba Cloud SDKのマネージドシークレットプラグイン

最終更新日:Jan 03, 2025

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

Alibaba Cloud SDK for Javaのマネージドシークレットプラグイン

OSS Java SDK

2.1.0から3.10.2

OSS SDK for Javaのマネージシークレットプラグイン

ONS Javaクライアント

1.8.5.最終から1.8.7.4.最終

マネージドシークレットプラグインfor ONS Java Client

マネージドシークレットプラグインを他の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シークレットの使用

  1. 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#"}]
  2. マネージド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());
  }

}