Key Management Service (KMS) を使用すると、キーを作成し、そのキーを使用してデータを効率的に暗号化および復号できます。 これにより、データのセキュリティを確保できます。 このトピックでは、キーを作成および使用する方法について説明します。
概要
KMS は、ビジネス、セキュリティ、コンプライアンスの要件を満たすために、ソフトウェア保護キー、ハードウェア保護キー、およびデフォルトキーを提供します。 詳細については、「キー管理の概要」および「キーのタイプと仕様」をご参照ください。
KMS は、デフォルトキーを無料で提供します。 デフォルトキーを使用して、Elastic Compute Service (ECS) などの Alibaba Cloud サービスでサーバ側暗号化を実行できます。 デフォルトキーは対称復号のみをサポートします。 デフォルトキーは、クライアント側のデータ暗号化をサポートしていません。
ソフトウェア保護キーは、Alibaba Cloud サービスでのサーバ側暗号化をサポートし、アプリケーション層の暗号化ソリューションの構築に使用でき、クライアント側のデータの暗号化と復号、および署名と検証の API 操作を提供します。 ソフトウェア保護キーは、対称キー、非対称キー、およびキーローテーションをサポートして、キー漏洩のリスクを軽減します。
ハードウェア保護キーは、Alibaba Cloud サービスでのサーバ側暗号化をサポートし、アプリケーション層の暗号化ソリューションの構築に使用でき、クライアント側のデータの暗号化と復号、および署名と検証の API 操作を提供します。 ハードウェア保護キーは、対称キーと非対称キーをサポートし、ソフトウェア保護キーよりも多くのキー仕様を提供します。 ハードウェア保護キーは、ハードウェアセキュリティモジュール (HSM) に保存して、暗号化要件を満たし、Federal Information Processing Standards (FIPS) に準拠することができます。 ハードウェア保護キーはキーローテーションをサポートしていません。
Alibaba Cloud サービスでのサーバ側暗号化
キーは、ECS などの Alibaba Cloud サービスでのサーバ側暗号化に使用して、サーバ側でのプレーンテキストデータ転送のセキュリティリスクを解消できます。 この機能をサポートするキータイプは、ソフトウェア保護キー、ハードウェア保護キー、およびデフォルトキーです。
例
この例では、カスタマーマスターキー (CMK) タイプのデフォルトキーが ECS に統合されています。 Alibaba Cloud サービスと KMS を統合する方法の詳細については、「KMS との統合」および「KMS と統合できる Alibaba Cloud サービス」をご参照ください。
ステップ 1:CMK タイプのデフォルトキーを有効にする
KMS コンソール にログインします。 上部のナビゲーションバーで、リージョンを選択します。 左側のナビゲーションウィンドウで、 を選択します。
[キー] ページで、デフォルトキー をクリックします。有効にする CMK タイプのデフォルトキーを見つけて、[アクション] 列の [有効化] をクリックします。 キー名を alias/main に設定します。

説明 CMK タイプのデフォルトキーは、Alibaba Cloud サービスでのサーバ側暗号化にのみ使用でき、クライアント側のデータ暗号化には使用できません。 クライアント側のデータ暗号化を実装する場合は、インスタンスを作成してから、ソフトウェア保護キーまたはハードウェア保護キーを作成します。
ステップ 2:KMS のデフォルトキーを ECS に統合する
購入ページで ECS インスタンスを購入する際に、alias/main という名前のデフォルトキーを選択して、サーバ側暗号化を有効にします。

ステップ 3:KMS を使用して ECS 内のデータを暗号化して暗号文を送信する
データが ECS に転送されると、ECS は KMS の API 操作を呼び出して、データを暗号化および復号します。 データを手動で処理する必要はありません。 ほとんどの場合、Alibaba Cloud サービスはエンベロープ暗号化を使用してデータを暗号化します。 詳細については、「エンベロープ暗号化を使用する」をご参照ください。
アプリケーション層の暗号化ソリューション
キーを使用して、アプリケーション層の暗号化ソリューションを構築し、クライアント側のデータの暗号化と復号、および 署名と検証の API 操作を提供できます。 この機能をサポートするキータイプは、ソフトウェア保護キーとハードウェア保護キーです。
前提条件
ハードウェアキー管理タイプまたはソフトウェアキー管理タイプの KMS インスタンスが購入され、有効になっています。 詳細については、「KMS インスタンスを購入して有効にする」をご参照ください。
例
この例では、ソフトウェアキー管理タイプの KMS インスタンスのキーを使用して、アプリケーション層データを暗号化 (暗号化) および復号 (復号) します。 詳細については、「キーを使用してデータを暗号化および復号する」をご参照ください。
ステップ 1:ソフトウェア保護キーを作成する
KMS コンソール にログインします。 上部のナビゲーションバーで、リージョンを選択します。 左側のナビゲーションウィンドウで、 を選択します。
[キー] タブで、[キーの作成] をクリックし、プロンプトに従って構成を完了します。

ステップ 2:インスタンスのイメージバージョンをアップグレードする
この例では、専用のゲートウェイを使用して OpenAPI を呼び出す暗号操作について説明します。 イメージバージョンは 3.0.0 以上である必要があります。
説明 インスタンスで既にイメージバージョン 3.0.0 以上が実行されている場合は、この手順をスキップしてください。
イメージバージョンを確認するには、インスタンスの詳細ページに移動します。 イメージバージョンが 3.0.0 より前の場合は、[アップグレード] をクリックして、KMS インスタンスのイメージバージョンをアップグレード します。

ステップ 3:依存関係をインストールする
準備を行います。
環境要件
Java Development Kit (JDK) 8 以降がダウンロードおよびインストールされています。
Java バージョン
ターミナルで java -version コマンドを実行して、JDK バージョンを確認します。
Alibaba Cloud SDK をインストールします。
次の Maven 依存関係をプロジェクトに追加します。 その後、Alibaba Cloud SDK の Java パッケージが Maven リポジトリから自動的にダウンロードされます。 Alibaba Cloud SDK V2.0 が使用されていることを確認してください。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>kms20160120</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.3.6</version>
</dependency>
ステップ 4:認証情報を作成する
Alibaba Cloud SDK は、複数の Resource Access Management (RAM) ベースの認証方式をサポートしています。 この例では、RAM ユーザーの AccessKey ペアが使用されます。 認証方式の詳細については、「アクセス認証情報を管理する」をご参照ください。
RAM コンソール で RAM ユーザーの AccessKey ペアを作成します。 詳細については、「AccessKey ペアを作成する」をご参照ください。
RAM ユーザー用に AccessKey ペアが既に作成されている場合は、この手順をスキップします。
必要な権限を RAM ユーザーに付与します。
たとえば、RAM ユーザーが暗号操作を実行するための権限を必要とする場合は、システムポリシー AliyunKMSCryptoUserAccess を RAM ユーザーにアタッチできます。 詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
説明 KMS は、次の権限構成方法を提供します。
ID ベースのポリシー:上記の例のポリシーは、ID ベースのポリシーです。 ID ベースのポリシーは、ID を対応する権限に関連付けて、アクセス制御を実装します。 詳細については、「RAM を使用してアクセス制御を実装する」をご参照ください。
リソースベースのポリシー:リソースベースのポリシーには、キーポリシーとシークレットポリシーが含まれます。 このようなポリシーはリソースに直接関連付けられており、特定のリソースへのアクセスルールを定義するために使用されます。 詳細については、「キーポリシー」および「シークレットポリシー」をご参照ください。
ステップ 5:インスタンスの認証局 (CA) 証明書を取得する
KMS インスタンスの詳細ページで、インスタンス CA 証明書をダウンロードして取得します。

ステップ 6:インスタンス Virtual Private Cloud (VPC) エンドポイントを取得する
KMS インスタンスの詳細ページで、クライアントを初期化するときに使用するインスタンス VPC エンドポイントをコピーします。

ステップ 7:API 操作を呼び出す
Alibaba Cloud SDK を初期化します。
重要 Alibaba Cloud SDK V2.0 が使用されていることを確認してください。 config.endpoint パラメーターをインスタンスの VPC エンドポイントに設定し、インスタンスの CA 証明書を構成する必要があります。
public static com.aliyun.kms20160120.Client createClient() throws Exception {
// プロジェクトコードが漏洩した場合、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 次のサンプルコードは参照用です。
// セキュリティトークンサービス (STS) トークンを使用してセキュリティを強化することをお勧めします。 認証方式の詳細については、https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials?spm=a2c63.p38356.help-menu-262060.d_1_4_1_2.1ad47c23arIlrq を参照してください。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必須。 環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID が構成されていることを確認してください。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必須。 環境変数 ALIBABA_CLOUD_ACCESS_KEY_SECRET が構成されていることを確認してください。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// インスタンスの VPC エンドポイントを入力します。 例:kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com。
config.endpoint = "<インスタンスの VPC エンドポイント>";
// インスタンスの CA 証明書のコンテンツを入力します。
config.ca = "<インスタンスの CA 証明書>";
return new com.aliyun.kms20160120.Client(config);
}
Encrypt 操作を呼び出してデータを暗号化します。
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
public static com.aliyun.kms20160120.Client createClient() throws Exception {
// プロジェクトコードが漏洩した場合、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 次のサンプルコードは参照用です。
// セキュリティトークンサービス (STS) トークンを使用してセキュリティを強化することをお勧めします。 認証方式の詳細については、https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials?spm=a2c63.p38356.help-menu-262060.d_1_4_1_2.1ad47c23arIlrq を参照してください。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必須。環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID が構成されていることを確認してください。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必須。環境変数 ALIBABA_CLOUD_ACCESS_KEY_SECRET が構成されていることを確認してください。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// インスタンスの VPC エンドポイントを入力します。例: kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com
config.endpoint = "<インスタンスの VPC エンドポイント>";
// インスタンスの CA 証明書のコンテンツを入力します。
config.ca = "<インスタンスの CA 証明書>";
return new com.aliyun.kms20160120.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.kms20160120.Client client = Sample.createClient();
com.aliyun.kms20160120.models.EncryptRequest encryptRequest = new com.aliyun.kms20160120.models.EncryptRequest()
.setKeyId("<キー ID>") // キーIDを指定
.setPlaintext("<プレーンテキスト>"); // 暗号化するプレーンテキストを指定
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// サンプルコードを実行して、API 操作の戻り値を取得します。
client.encryptWithOptions(encryptRequest, runtime);
} catch (TeaException error) {
// 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
// エラーメッセージ。
System.out.println(error.getMessage());
// トラブルシューティング用の URL。
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
// エラーメッセージ。
System.out.println(error.getMessage());
// トラブルシューティング用の URL。
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
Decrypt 操作を呼び出してデータを復号します。
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
public static com.aliyun.kms20160120.Client createClient() throws Exception {
// プロジェクトコードが漏洩した場合、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。 次のサンプルコードは参照用です。
// セキュリティトークンサービス (STS) トークンを使用してセキュリティを強化することをお勧めします。 認証方式の詳細については、https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-access-credentials?spm=a2c63.p38356.help-menu-262060.d_1_4_1_2.1ad47c23arIlrq を参照してください。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必須。環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID が構成されていることを確認してください。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必須。環境変数 ALIBABA_CLOUD_ACCESS_KEY_SECRET が構成されていることを確認してください。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// インスタンスの VPC エンドポイントを入力します。例: kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com
config.endpoint = "<インスタンスの VPC エンドポイント>";
// インスタンスの CA 証明書のコンテンツを入力します。
config.ca = "<インスタンスの CA 証明書>";
return new com.aliyun.kms20160120.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.kms20160120.Client client = Sample.createClient();
com.aliyun.kms20160120.models.DecryptRequest decryptRequest = new com.aliyun.kms20160120.models.DecryptRequest()
.setCiphertextBlob("<CiphertextBlob>"); // 復号化する暗号文を指定
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// サンプルコードを実行して、API 操作の戻り値を取得します。
client.decryptWithOptions(decryptRequest, runtime);
} catch (TeaException error) {
// 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
// エラーメッセージ。
System.out.println(error.getMessage());
// トラブルシューティング用の URL。
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 実際のビジネスシナリオでは、例外を慎重に処理し、プロジェクトの例外を無視しないでください。 この例では、例外は参照用にのみ提供されています。
// エラーメッセージ。
System.out.println(error.getMessage());
// トラブルシューティング用の URL。
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}