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

Key Management Service:キーの概要

最終更新日:Apr 04, 2025

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 タイプのデフォルトキーを有効にする

  1. KMS コンソール にログインします。 上部のナビゲーションバーで、リージョンを選択します。 左側のナビゲーションウィンドウで、リソース > キー管理 を選択します。

  2. [キー] ページで、デフォルトキー をクリックします。有効にする CMK タイプのデフォルトキーを見つけて、[アクション] 列の [有効化] をクリックします。 キー名を alias/main に設定します。

    image

説明

CMK タイプのデフォルトキーは、Alibaba Cloud サービスでのサーバ側暗号化にのみ使用でき、クライアント側のデータ暗号化には使用できません。 クライアント側のデータ暗号化を実装する場合は、インスタンスを作成してから、ソフトウェア保護キーまたはハードウェア保護キーを作成します。

ステップ 2:KMS のデフォルトキーを ECS に統合する

購入ページで ECS インスタンスを購入する際に、alias/main という名前のデフォルトキーを選択して、サーバ側暗号化を有効にします。

image

ステップ 3:KMS を使用して ECS 内のデータを暗号化して暗号文を送信する

データが ECS に転送されると、ECS は KMS の API 操作を呼び出して、データを暗号化および復号します。 データを手動で処理する必要はありません。 ほとんどの場合、Alibaba Cloud サービスはエンベロープ暗号化を使用してデータを暗号化します。 詳細については、「エンベロープ暗号化を使用する」をご参照ください。

アプリケーション層の暗号化ソリューション

キーを使用して、アプリケーション層の暗号化ソリューションを構築し、クライアント側のデータの暗号化と復号、および 署名と検証の API 操作を提供できます。 この機能をサポートするキータイプは、ソフトウェア保護キーとハードウェア保護キーです

前提条件

ハードウェアキー管理タイプまたはソフトウェアキー管理タイプの KMS インスタンスが購入され、有効になっています。 詳細については、「KMS インスタンスを購入して有効にする」をご参照ください。

この例では、ソフトウェアキー管理タイプの KMS インスタンスのキーを使用して、アプリケーション層データを暗号化 (暗号化) および復号 (復号) します。 詳細については、「キーを使用してデータを暗号化および復号する」をご参照ください。

ステップ 1:ソフトウェア保護キーを作成する

  1. KMS コンソール にログインします。 上部のナビゲーションバーで、リージョンを選択します。 左側のナビゲーションウィンドウで、リソース > キー管理 を選択します。

  2. [キー] タブで、[キーの作成] をクリックし、プロンプトに従って構成を完了します。

  • KMS インスタンス:購入した KMS インスタンス を選択します

  • キータイプ:[対称キー] を選択します。

  • キー仕様:Aliyun_AES_256 を選択します。

image

ステップ 2:インスタンスのイメージバージョンをアップグレードする

この例では、専用のゲートウェイを使用して OpenAPI を呼び出す暗号操作について説明します。 イメージバージョンは 3.0.0 以上である必要があります。

説明

インスタンスで既にイメージバージョン 3.0.0 以上が実行されている場合は、この手順をスキップしてください。

イメージバージョンを確認するには、インスタンスの詳細ページに移動します。 イメージバージョンが 3.0.0 より前の場合は、[アップグレード] をクリックして、KMS インスタンスのイメージバージョンをアップグレード します。

image

ステップ 3:依存関係をインストールする

  1. 準備を行います。

    環境要件

    Java Development Kit (JDK) 8 以降がダウンロードおよびインストールされています。

    Java バージョン

    ターミナルで java -version コマンドを実行して、JDK バージョンを確認します。

  2. 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 ペアが使用されます。 認証方式の詳細については、「アクセス認証情報を管理する」をご参照ください。

  1. RAM コンソール で RAM ユーザーの AccessKey ペアを作成します。 詳細については、「AccessKey ペアを作成する」をご参照ください。

    RAM ユーザー用に AccessKey ペアが既に作成されている場合は、この手順をスキップします。image

  2. 必要な権限を RAM ユーザーに付与します。

    たとえば、RAM ユーザーが暗号操作を実行するための権限を必要とする場合は、システムポリシー AliyunKMSCryptoUserAccess を RAM ユーザーにアタッチできます。 詳細については、「RAM ユーザーに権限を付与する」をご参照ください。image

    説明

    KMS は、次の権限構成方法を提供します。

    • ID ベースのポリシー:上記の例のポリシーは、ID ベースのポリシーです。 ID ベースのポリシーは、ID を対応する権限に関連付けて、アクセス制御を実装します。 詳細については、「RAM を使用してアクセス制御を実装する」をご参照ください。

    • リソースベースのポリシー:リソースベースのポリシーには、キーポリシーとシークレットポリシーが含まれます。 このようなポリシーはリソースに直接関連付けられており、特定のリソースへのアクセスルールを定義するために使用されます。 詳細については、「キーポリシー」および「シークレットポリシー」をご参照ください。

ステップ 5:インスタンスの認証局 (CA) 証明書を取得する

KMS インスタンスの詳細ページで、インスタンス CA 証明書をダウンロードして取得します。

image

ステップ 6:インスタンス Virtual Private Cloud (VPC) エンドポイントを取得する

KMS インスタンスの詳細ページで、クライアントを初期化するときに使用するインスタンス VPC エンドポイントをコピーします。

image

ステップ 7:API 操作を呼び出す

  1. 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);
        }
  2. 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);
            }        
        }
    }
  3. 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);
            }        
        }
    }

関連情報