複数の方法を使用して、アプリケーションをSecrets Managerに接続できます。 次に、アプリケーションは動的秘密を使用できます。
メソッド
次の表に、アプリケーションをSecrets Managerに接続するために使用できる方法を示します。
メソッド | 説明 | シナリオ |
KMS SDKを使用すると、HTTPSリクエストを構築してKMS APIをより有効に活用できます。 |
| |
Secrets Manager Clientでは、Secrets Manager Clientがsecrets Managerからシークレットを取得してキャッシュを更新する頻度を設定できます。 |
| |
Secrets Manager JDBCでは、Java Database Connectivity (JDBC) 接続を確立することで、secrets Managerで管理されているシークレットを使用できます。 | 動的ApsaraDB RDSシークレットとJavaプログラムを使用してデータベースにアクセスします。 詳細については、「Dynamic ApsaraDB RDSシークレットの概要」をご参照ください。 | |
Alibaba Cloud SDKのマネージドシークレットプラグインを使用すると、動的なRAM (Resource Access Management) シークレットを使用して、より効率的にAlibaba Cloudサービスにアクセスできます。 | ダイナミックRAMシークレットを使用してAlibaba Cloudサービスにアクセスします。 詳細については、「Dynamic RAMシークレットの概要」をご参照ください。 | |
Secrets Manager Kubernetesプラグインを使用すると、Secrets Managerを迅速かつコードレスな方法でシステムに統合できます。 | 定期的にコードレスで設定を更新します。 |
KMS SDKの使用
次の例は、KMS SDK for Javaを使用し、アプリケーションで動的ApsaraDB RDSシークレットを使用する方法を示しています。 動的ApsaraDB RDSシークレットの代わりに他のタイプのシークレットを使用する場合は、この方法を使用することもできます。
KMS SDK for Javaの依存関係宣言を取得します。
必要なSDKバージョンの詳細については、「SDKの概要」をご参照ください。 サンプル文:
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.16</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-kms</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency>
アプリケーションをSecrets Managerに接続して、データベースへの接続に使用されるアカウントのユーザー名とパスワードを取得します。 次に、データベースへの接続を確立します。
説明Alibaba CloudアカウントのAccessKeyペアには、すべてのAPI操作に対する権限があります。 AccessKeyペアを使用して操作を実行することは、リスクの高い操作です。 RAMユーザーを使用してAPI操作を呼び出したり、ルーチンのO&Mを実行することを推奨します。プロジェクトコードにAccessKey IDとAccessKey Secretを保存しないことを推奨します。 そうしないと、AccessKeyペアが漏洩し、アカウントに属するすべてのリソースのセキュリティが侵害される可能性があります。
この例では、AccessKeyペアは、ID認証を実装するためにALIBABA_CLOUD_ACCESS_KEY_IDとALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数に保存されます。
認証情報の設定方法の詳細については、「アクセス資格情報の管理」をご参照ください。
環境変数を設定するために使用される方法は、オペレーティングシステムによって異なります。 詳細については、「Linux、macOS、およびWindowsでの環境変数の設定」をご参照ください。
サンプルコード:
package com.aliyun.kms.samples; import java.util.Map; import com.google.gson.Gson; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.MethodType; import com.aliyuncs.http.ProtocolType; import com.aliyuncs.kms.model.v20160120.GetSecretValueRequest; import com.aliyuncs.kms.model.v20160120.GetSecretValueResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import org.apache.commons.lang3.tuple.Pair; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class RdsSecretSampleCode { private static final String MYSQL_JDBC_DRIVER = "com.mysql.jdbc.Driver"; private static final String MSSQL_JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; private static KmsClient kmsClient; static { kmsClient = KmsClient.getKMSClient("<regionId>", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); } static class KmsClient { private DefaultAcsClient acsClient; private KmsClient(DefaultAcsClient acsClient) { this.acsClient = acsClient; } private static KmsClient getKMSClient(String regionId, String accessKeyId, String accessKeySecret) { IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return new KmsClient(client); } } // Obtain the connection string of a database that is created on an ApsaraDB RDS for MySQL instance by using the obtained secret. public static Connection getMySQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException, ClientException { Class.forName(MYSQL_JDBC_DRIVER); Pair<String, String> userAndPasswordPair = getUserAndPasswordPair(secretName); return DriverManager.getConnection(jdbcUrl, userAndPasswordPair.getKey(), userAndPasswordPair.getValue()); } // Obtain the connection string of a database that is created on a Microsoft SQL Server instance by using the obtained secret. public static Connection getMSSQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException, ClientException { Class.forName(MSSQL_JDBC_DRIVER); Pair<String, String> userAndPasswordPair = getUserAndPasswordPair(secretName); return DriverManager.getConnection(jdbcUrl, userAndPasswordPair.getKey(), userAndPasswordPair.getValue()); } // Obtain the username and password of the account that is used to connect to the database from the obtained secret. private static Pair<String, String> getUserAndPasswordPair(String secretName) throws ClientException { final GetSecretValueRequest request = new GetSecretValueRequest(); request.setProtocol(ProtocolType.HTTPS); request.setAcceptFormat(FormatType.JSON); request.setMethod(MethodType.POST); request.setSecretName(secretName); GetSecretValueResponse response = kmsClient.acsClient.getAcsResponse(request); Map<String,String> map = new Gson().fromJson(response.getSecretData(), Map.class); return Pair.of(map.get("AccountName"), map.get("AccountPassword")); } }