RAM ユーザーの AccessKey を Key Management Service (KMS) に保存した後、RAM シークレットプラグインをインストールできます。Alibaba Cloud SDK を使用する際に、RAM シークレットの名前を参照して API 認証用の AccessKey を取得できます。これにより、AccessKey の詳細情報やローテーションを管理する必要がなくなります。このトピックでは、RAM シークレットプラグインの仕組み、インストール方法、および使用方法について説明します。
仕組み
RAM シークレットプラグインは、シークレット名に基づいて KMS から RAM シークレットの値を取得し、アプリケーションのメモリにキャッシュします。アプリケーションが Alibaba Cloud SDK を使用する際、プラグインのローカルキャッシュにある AccessKey を使用して Alibaba Cloud サービスにリクエストを送信します。
シークレットのローテーションなどの理由でローカルにキャッシュされた AccessKey が無効になった場合、プラグインは直ちに KMS からシークレットを再取得し、ローカルキャッシュを更新します。設定されたリトライ動作に基づき、プラグインは新しく取得した RAM シークレットを使用して Alibaba Cloud サービスの呼び出しを再試行します。デフォルトでは、プラグインはサービス応答に含まれる InvalidAccessKeyId および InvalidAccessKeyId.NotFound エラーコードに基づいて AccessKey が無効であると判断します。
サポートされる Alibaba Cloud SDK
KMS は、次の表にリストされている Alibaba Cloud SDK 用の RAM シークレットプラグインを提供します。
RAM シークレットプラグインは、各 Alibaba Cloud SDK 向けに開発されています。RAM プラグインが要件を満たさない場合は、シークレットクライアントまたは Alibaba Cloud SDK を使用できます。各 SDK の詳細については、「SDK リファレンス」をご参照ください。また、ヘルプデスクに連絡してフィードバックを提供することもできます。
Java 版 SDK (Java 8 以降のみをサポート)
Alibaba Cloud SDK 名 | RAM シークレットプラグインのモジュール名 |
Python 版 SDK
Alibaba Cloud SDK 名 | RAM シークレットプラグインのモジュール名 | 注意事項 |
V1.0 のみがサポートされており、V2.0 はサポートされていません。V2.0 の場合は、シークレットクライアントまたは Alibaba Cloud SDK を使用してください。 | ||
なし。 |
Go 版 SDK
Alibaba Cloud SDK 名 | RAM シークレットプラグインのモジュール名 | 注意事項 |
V1.0 のみがサポートされており、V2.0 はサポートされていません。V2.0 の場合は、シークレットクライアントまたは Alibaba Cloud SDK を使用してください。 | ||
なし。 |
手順 1:アクセス認証情報の作成
シナリオ 1:共有ゲートウェイ経由でのシークレット値の取得
このシナリオは、パブリックネットワークおよび VPC ネットワークタイプに適用されます。サポートされるアクセス認証情報には、ECS インスタンス RAM ロールと ClientKey が含まれます。
ECS インスタンス RAM ロール
ClientKey
シナリオ 2:専用ゲートウェイ経由でのシークレット値の取得 (非推奨)
このシナリオは、KMS プライベートネットワークタイプに適用されます。アクセス認証情報としてサポートされるのは ClientKey のみです。
手順 2:設定ファイルでの RAM シークレットプラグインの実行時パラメーターの設定
RAM シークレットプラグインは、実行時パラメーターを設定するために設定ファイルを必要とします。アプリケーションの実行時ディレクトリに managed_credentials_providers.properties という名前の設定ファイルを作成し、認証方式に基づいてコンテンツを追加できます。
アプリケーションが managed_credentials_providers.properties ファイルを自動的に読み取れない場合は、コード例を参照して、コード内でファイルパスを設定してファイルを読み取る方法を確認してください。
ECS インスタンス RAM ロール
設定ファイルの内容は次のとおりです。
credentials_type=ecs_ram_role
## ECS RAM ロールの名前
credentials_role_name=#credentials_role_name#
## 関連付けられた KMS サービスのリージョン
cache_client_region_id=[{"regionId":"#regionId#"}]ClientKey (共有ゲートウェイ)
KMS 共有ゲートウェイのエンドポイントを介して認証情報の値を取得できます。設定ファイルの内容は次のとおりです。
## アクセス認証情報のタイプ。
credentials_type=client_key
## ClientKey の認証情報パスワード。環境変数またはファイルから読み取ることができます。
## アプリケーションアクセスポイント (AAP) で ClientKey を作成したときに保存した認証情報パスワード (ClientKeyPassword)。
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#
# ClientKey ファイルへのパス。
# ClientKey ファイルは、AAP で ClientKey を作成したときにダウンロードしたアプリケーション ID 認証情報コンテンツ (ClientKeyContent) です。
# ダウンロード後のデフォルトのファイル名は ClientKey_******.json です。
client_key_private_key_path=#your client key private key file path#
## 関連付けられた KMS サービスのリージョン。
cache_client_region_id=[{"regionId":"#regionId#"}]ClientKey (専用ゲートウェイ)
KMS 専用ゲートウェイのエンドポイントを介してシークレットの値を取得できます。設定ファイルの内容は次のとおりです。
設定パラメーターは cache_client_dkms_config_info です。cache_client_dkms_config_info は JSON 配列形式を使用します。複数の KMS インスタンスを設定して、より高いサービスの可用性とディザスタリカバリを実現できます。
メソッド 1:環境変数から ClientKey パスワードを取得する
設定ファイルの内容は次のとおりです。
cache_client_dkms_config_info=[{"regionId":"<your dkms regionId >","endpoint":"<your dkms endpoint>","passwordFromEnvVariable":"<YOUR_PASSWORD_ENV_VARIABLE>","clientKeyFile":"<your ClientKey file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]このメソッドでは、認証情報パスワード (ClientKeyPassword) 用にカスタム名の環境変数を設定する必要もあります。設定後、
<YOUR_PASSWORD_ENV_VARIABLE>を変数名に置き換えます。例:cache_client_dkms_config_info=[{"regionId":"cn-hangzhou","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromEnvVariable":"passwordFromEnvVariable","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]メソッド 2:ファイルから ClientKey パスワードを取得する
デフォルトでは、ClientKey の 認証情報パスワード (ClientKeyPassword) 用にダウンロードされたファイルの名前は
clientKey_****_Password.txtです。ファイル名を変更した場合は、cache_client_dkms_config_info の値にある<your Client Key file path>を新しいファイルパスに置き換える必要があります。設定ファイルの内容は次のとおりです。
cache_client_dkms_config_info=[{"regionId":"<your dkms regionId >","endpoint":"<your dkms endpoint>","passwordFromFilePath":"< your password file path >","clientKeyFile":"<your Client Key file path>","ignoreSslCerts":false,"caFilePath":"<your CA certificate file path>"}]例:
cache_client_dkms_config_info=[{"regionId":"cn-hangzhou","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromFilePath":"C:\RamSecretPlugin\src\main\resources\clientKeyPassword.txt","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]
各設定項目の説明:
設定項目 | パラメーターの説明 | 説明 |
リージョン ID | KMS インスタンスが配置されているリージョン ID。 | 特定のリージョン ID については、「リージョンとゾーン」をご参照ください。 |
エンドポイント | KMS インスタンスのドメイン名。フォーマットは | インスタンス管理 ページに移動します。インスタンス詳細ページで、インスタンス VPC エンドポイント がエンドポイントです。 |
clientKeyFile | JSON 形式の ClientKey ファイルの絶対パスまたは相対パス。 |
重要 ClientKey ファイルと認証情報パスワードは 1 対 1 で対応しています。これらは ClientKey の作成時にのみ取得できます。作成時に保存しなかった場合は、AAP で新しい ClientKey を作成する必要があります。詳細については、「アプリケーションアクセスポイントの作成」をご参照ください。 |
passwordFromFilePath または passwordFromEnvVariable |
| |
SSL 証明書を無視 | KMS インスタンスの SSL 証明書の有効性チェックを無視するかどうかを指定します。KMS インスタンスには SSL 証明書が組み込まれており、認証と暗号化通信に SSL/TLS プロトコルを使用します。有効な値は次のとおりです。
| 本番環境では、このパラメーターを false に設定する必要があります。 |
caFilePath | KMS インスタンスの CA 証明書ファイルの絶対パスまたは相対パス。 KMS インスタンスの CA 証明書は、KMS インスタンスの SSL 証明書の有効性を確認するために使用されます。たとえば、SSL 証明書が対応する CA によって発行されたか、有効期間内であるか、KMS インスタンスのドメイン名 (エンドポイント) に対応しているかなどを確認します。 | インスタンス管理 ページに移動します。インスタンス詳細ページで、Instance CA Certificate セクションの ダウンロード をクリックします。 |
手順 3:Alibaba Cloud SDK での RAM シークレットプラグインの使用
Java
Alibaba Cloud SDK for Java (V2.0)
Java 9+ の互換性
Maven を使用して、RAM 認証情報プラグインをプロジェクトにインポートできます。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-tea-openapi-sdk-managed-credentials-provider</artifactId> <version>[1.3.5,]</version> </dependency>説明最新バージョンのプラグインをインストールすることを推奨します。詳細については、ソースコードをご参照ください。
Java 版 Alibaba Cloud SDK クライアントを取得し、Alibaba Cloud サービスを呼び出します。
次の例は、ECS の DescribeInstances 操作を呼び出す方法を示しています。
Elastic Compute Service (ECS) の ecs20140526 依存関係を追加します。
<dependency> <groupId>com.aliyun</groupId> <artifactId>ecs20140526</artifactId> <version>7.1.0</version> </dependency>DescribeInstances 操作を呼び出します。
import com.aliyun.ecs20140526.Client; import com.aliyun.ecs20140526.models.DescribeInstancesResponse; import com.aliyun.kms.secretsmanager.plugin.tea.openapi.ProxyClientCreator; import com.google.gson.Gson; public class AliyunTeaOpenApiProviderSample { public static void main(String[] args) throws Exception { // 手順 1:管理対象シークレットの名前 (KMS で作成したシークレット名) を指定します。 String secretName = "your-secret-name"; /* アプリケーションがクラスパスや実行可能 JAR パッケージからデフォルトの設定ファイル (managed_credentials_providers.properties) を読み取れない場合、 または設定ファイル名をカスタマイズする場合は、次のコードを呼び出してカスタム設定ファイルを設定できます。ファイルは次の順序で読み取られます: 1. "your-config-name" がファイル名付きの絶対パスである場合、その絶対パスのファイルが読み取られます。 2. "your-config-name" がファイル名のみである場合、ファイルはまずクラスパスから読み取られ、次に実行可能 JAR パッケージから読み取られます。 */ //ConfigLoader.setConfigName("your-config-name"); // 手順 2:OpenAPI クライアントを設定します。 com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config(); config.endpoint = "your-product-endpoint"; // 実際のサービスエンドポイントに置き換えます。 // 手順 3:クライアントインスタンスを作成します。 Client client = ProxyClientCreator.createClient(config, Client.class, secretName); // 手順 4:Alibaba Cloud サービスの API を呼び出します。 com.aliyun.ecs20140526.models.DescribeInstancesRequest request = new com.aliyun.ecs20140526.models.DescribeInstancesRequest(); request.setRegionId("cn-hangzhou"); // リージョン ID を設定します。 DescribeInstancesResponse response = client.describeInstances(request); // 手順 5:結果を出力します。 System.out.println(new Gson().toJson(response.getBody())); } }
Alibaba Cloud SDK for Java (V1.0)
Maven を使用して、RAM 認証情報プラグインをプロジェクトにインポートします。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>[4.3.2,5.0.0]</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core-managed-credentials-provider</artifactId> <version>[1.3.1,]</version> </dependency>説明最新バージョンのプラグインをインストールすることを推奨します。詳細については、ソースコードをご参照ください。
Java 版 Alibaba Cloud SDK クライアントを取得し、Alibaba Cloud サービスを呼び出します。
次の例は、ECS の DescribeInstanceStatus 操作を呼び出す方法を示しています。
ECS の aliyun-java-sdk-ecs 依存関係を追加します。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-ecs</artifactId> <version>5.11.20</version> </dependency>DescribeInstanceStatus 操作を呼び出します。
import com.aliyuncs.IAcsClient; import com.aliyuncs.ecs.model.v20140526.DescribeInstanceStatusRequest; import com.aliyuncs.ecs.model.v20140526.DescribeInstanceStatusResponse; import com.aliyun.kms.secretsmanager.plugin.sdkcore.ProxyAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; public class AliyunSdkProviderSample { public static void main(String[]args) { String secretName="******"; /* アプリケーションがクラスパスや実行可能 JAR パッケージからデフォルトの設定ファイル (managed_credentials_providers.properties) を読み取れない場合、 または設定ファイル名をカスタマイズする場合は、次のコードを呼び出してカスタム設定ファイルを設定できます。ファイルは次の順序で読み取られます: 1. "your-config-name" がファイル名付きの絶対パスである場合、その絶対パスのファイルが読み取られます。 2. "your-config-name" がファイル名のみである場合、ファイルはまずクラスパスから読み取られ、次に実行可能 JAR パッケージから読み取られます。 */ //ConfigLoader.setConfigName("your-config-name"); // 1. aliyun-java-sdk-managed-credentials-provider を使用して ACSClient を取得します。 IAcsClient client = null; try { client = new ProxyAcsClient("<the regionId of ECS>", secretName); } catch (ClientException e) { e.printStackTrace(); } // 2. ECS の OpenAPI を呼び出してビジネス機能を実装します。 DescribeInstanceStatusRequest request = new DescribeInstanceStatusRequest(); DescribeInstanceStatusResponse response; try { response = client.getAcsResponse(request); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } // 3. 次のメソッドを呼び出してクライアントをシャットダウンし、プラグインに関連するリソースを解放します。 client.shutdown(); } }
OSS SDK での使用
Maven を使用して、RAM 認証情報プラグインをプロジェクトにインポートできます。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.17</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>[2.1.0,3.10.2]</version> <exclusions> <exclusion> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-kms</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-sdk-oss-managed-credentials-provider</artifactId> <version>[1.3.1,]</version> </dependency>説明最新バージョンのプラグインをインストールすることを推奨します。詳細については、ソースコードをご参照ください。
Java 版 OSS SDK クライアントを取得し、Alibaba Cloud サービスを呼び出します。
次の例は、OSS の listBuckets 操作を呼び出す方法を示しています。
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 OssProviderSample { public static void main(String[] args) throws Exception { String secretName = "******"; String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; /* アプリケーションがクラスパスや実行可能 JAR パッケージからデフォルトの設定ファイル (managed_credentials_providers.properties) を読み取れない場合、 または設定ファイル名をカスタマイズする場合は、次のコードを呼び出してカスタム設定ファイルを設定できます。ファイルは次の順序で読み取られます: 1. "your-config-name" がファイル名付きの絶対パスである場合、その絶対パスのファイルが読み取られます。 2. "your-config-name" がファイル名のみである場合、ファイルはまずクラスパスから読み取られ、次に実行可能 JAR パッケージから読み取られます。 */ //ConfigLoader.setConfigName("your-config-name"); // OSS クライアントを取得します。 OSS ossClient = new ProxyOSSClientBuilder().build(endpoint, secretName); // 以下はビジネスコードです:Alibaba Cloud OSS サービスを呼び出してビジネス機能を実装します。 List<Bucket> buckets = ossClient.listBuckets(); for (Bucket bucket : buckets) { if (bucket != null) { // ... } } // 次のメソッドを呼び出してクライアントをシャットダウンし、プラグインに関連するリソースを解放します。 ossClient.shutdown(); } }
Python
Alibaba Cloud SDK for Python (V1.0)
pip コマンドを実行して、プロジェクトで RAM 認証情報プラグインを使用します。
pip install aliyun-openapi-python-sdk-managed-credentials-provider説明プラグインのバージョンが 0.1.0 以降であることを確認してください。詳細については、ソースコードをご参照ください。
Python 版 Alibaba Cloud SDK クライアントを取得し、Alibaba Cloud サービスを呼び出します。
from aliyun_sdk_secretsmanager_sdk_core_plugin.proxy_acs_client import ProxyAcsClient region="cn-hangzhou" secretName="******" # 1. ACSClient を取得します。 client = ProxyAcsClient(region_id=region, secret_name=secretName ) # 2. ビジネスコード:クライアントを使用して、コードを変更せずに Alibaba Cloud サービスを呼び出します。 ... # 3. 次のメソッドを呼び出してクライアントをシャットダウンし、プラグインに関連するリソースを解放します。 client.shutdown()
OSS SDK for Python
pip コマンドを実行して、プロジェクトで RAM 認証情報プラグインを使用できます。
pip install aliyun-oss-python-sdk-managed-credentials-provider説明プラグインのバージョンが 0.1.0 以降であることを確認してください。詳細については、ソースコードをご参照ください。
Python 版 Alibaba Cloud OSS SDK クライアントを取得し、Alibaba Cloud サービスを呼び出します。
from aliyun_sdk_secretsmanager_oss_plugin.proxy_bucket import ProxyBucket from itertools import islice endpoint = "******" secret_name ="******" bucket_name = "******" bucket = ProxyBucket(secret_name=secret_name, endpoint=endpoint, bucket_name=bucket_name) objects = bucket.list_objects() for b in islice(objects.object_list, 10): print(b.key) bucket.shutdown()
Go
Alibaba Cloud SDK for Go (V1.0)
Go 版 RAM プラグイン SDK の制限により、期限切れの認証情報の自動リトライはサポートされていません。認証情報を手動でローテーションするには、認証情報の有効期限によるタスクの中断を防ぐために、ローテーションウィンドウが少なくとも 13 時間以上であることを確認する必要があります。
Go 版 Alibaba Cloud SDK 用の RAM 認証情報プラグインをインストールします。
重要最新バージョンのプラグインをインストールすることを推奨します。詳細については、ソースコードをご参照ください。
Go 版 RAM 認証情報プラグインは、v1.63.0 より前のバージョンの
alibaba-cloud-sdk-goに依存しています。潜在的な互換性の問題を避けるために、プラグインのgo.modファイルでバージョンを確認する必要があります。
メソッド 1:
go.modを使用して依存関係を管理します。go.modファイルに次の内容を追加して、依存パッケージをインストールします。require ( github.com/aliyun/aliyun-sdk-managed-credentials-providers-go/aliyun-sdk-managed-credentials-providers/alibaba-cloud-sdk-go-managed-credentials-provider vX.X.X )メソッド 2:
go getコマンドを使用してリモートコードパッケージを取得します。go get -u github.com/aliyun/aliyun-sdk-mxanaged-credentials-providers-go/aliyun-sdk-managed-credentials-providers/alibaba-cloud-sdk-go-managed-credentials-provider
Go 版 Alibaba Cloud SDK のクライアントを取得し、Alibaba Cloud サービスを呼び出します。
次の例は、ECS の DescribeInstances 操作を呼び出す方法を示しています。
package sample import ( "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" sdkcoreprovider "github.com/aliyun/aliyun-sdk-managed-credentials-providers-go/aliyun-sdk-managed-credentials-providers/alibaba-cloud-sdk-go-managed-credentials-provider/sdk" ) func main() { secretName := "********" regionId := "cn-hangzhou" client, err := sdkcoreprovider.GetClient(&ecs.Client{}, regionId, secretName) if err != nil { fmt.Println(err) return } ecsClient := client.(*ecs.Client) request := ecs.CreateDescribeInstancesRequest() instancesResponse, err := ecsClient.DescribeInstances(request) if err != nil { fmt.Println(err) return } for _, instance := range instancesResponse.Instances.Instance { // do something with instance } }
OSS SDK for Go
Go 版 OSS SDK 用の RAM 認証情報プラグインをインストールします。
重要最新バージョンのプラグインをインストールすることを推奨します。詳細については、ソースコードをご参照ください。
Go 版 RAM 認証情報プラグインは、v1.63.0 より前のバージョンの
alibaba-cloud-sdk-goに依存しています。潜在的な互換性の問題を避けるために、プラグインのgo.modファイルでバージョンを確認する必要があります。
メソッド 1:
go.modを使用して依存関係を管理します。go.modファイルに次の内容を追加して、依存パッケージをインストールします。require ( github.com/aliyun/aliyun-sdk-managed-credentials-providers-go/aliyun-sdk-managed-credentials-providers/aliyun-oss-go-sdk-managed-credentials-provider vX.X.X )メソッド 2:
go getコマンドを使用してリモートコードパッケージを取得します。go get -u github.com/aliyun/aliyun-sdk-managed-credentials-providers-go/aliyun-sdk-managed-credentials-providers/aliyun-oss-go-sdk-managed-credentials-provider
Go 版 Alibaba Cloud OSS SDK のクライアントを取得し、Alibaba Cloud サービスを呼び出します。
package sample import ( "fmt" ossprovider "aliyun-oss-go-sdk-managed-credentials-provider/sdk" ) func main() { secretName := "********" endpoint := "https://oss-cn-hangzhou.aliyuncs.com" // プロキシ OSS クライアントを取得します。 client, err := ossprovider.New(endpoint, secretName) if err != nil { fmt.Println(err) return } result, err := client.ListBuckets() if err != nil { fmt.Println(err) return } for _, bucket := range result.Buckets { // ビジネスコード } // クライアントをシャットダウンして、プラグインに関連するリソースを解放します。 client.Shutdown() }