AWS KMS キーリング - AWS Encryption SDK

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS KMS キーリング

AWS KMS キーリングは、対称暗号化 AWS KMS keys を使用して、データキーの生成、暗号化、復号を行います。AWS Key Management Service (AWS KMS) は、KMS キーを保護し、FIPS の暗号境界内で暗号化を行います。可能な限り、AWS KMS キーリングか同様のセキュリティ特性を持つキーリングを使用することをお勧めします。

バージョン 2.3 以降では、AWS KMSAWS KMSキーリングプロバイダまたはマスターキープロバイダでマルチリージョンキーを使用できます。 AWS Encryption SDKおよびバージョン 3.0 の x。 AWS暗号化 CLI の x。新しいマルチリージョン対応シンボルの詳細と使用例については、マルチリージョン AWS KMS keys の使用 を参照してください。マルチリージョンキーの詳細については、AWS Key Management Service デベロッパーガイドの「マルチリージョンキーを使用する」を参照してください。

注記

バージョン 4。 X は .NET およびバージョン 3 AWS Encryption SDK 用です。 そのうちの x AWS Encryption SDK for Java は、非対称 RSA AWS KMS を使用するキーリングをサポートする唯一のプログラミング言語実装です。AWS KMS keys

他の言語実装の暗号化キーリングに非対称 KMS キーを含めようとすると、暗号化呼び出しは失敗します。復号キーリングに含めても無視されます。

AWS Encryption SDK で KMS キーリングについて言及する場合は、すべて AWS KMS キーリングのことを表します。

AWS KMS キーリングには次の 2 種類のラッピングキーを含めることができます。

  • ジェネレーターキー: プレーンテキストのデータキーを生成し、暗号化します。データを暗号化するキーリングには、ジェネレーターキーが 1 つ必要です。

  • 追加キー: ジェネレータキーが生成したプレーンテキストのデータキーを暗号化します。AWS KMS キーリングには、0 個以上の追加キーを持つことができます。

暗号化時に、使用する AWS KMS キーリングにはジェネレーターキーが必要です。復号時に、ジェネレーターキーはオプションであり、ジェネレーターキーと追加キーの区別は無視されます。

AWS KMS 暗号化キーリングに AWS KMS キーが 1 つしかない場合は、そのキーを使用してデータキーの生成と暗号化が行われます。

すべてのキーリングと同様に、AWS KMS キーリングは単独で使用することも、同じまたは別のタイプの他のキーリングと一緒にマルチキーリングで使用することもできます。

AWS KMS キーリングに必要なアクセス許可

AWS Encryption SDK は、AWS アカウント を必須としておらず、どの AWS のサービス にも依存していません。ただし、AWS KMS キーリングを使用するには、キーリングの AWS KMS keys で AWS アカウント と次の最小アクセス許可が必要です。

  • AWS KMSキーリングで暗号化するには、ジェネレータキーに対する kms: 権限が必要です。GenerateDataKeyAWS KMS キーリングのその他すべてのキーでは、kms:Encrypt アクセス許可が必要です。

  • AWS KMS キーリングを使用して復号するには、AWS KMS キーリングで少なくとも 1 つのキーに kms:Decrypt アクセス許可が必要です。

  • キーリングで構成されるマルチキーリングで暗号化するには、AWS KMSジェネレータキーリングのジェネレータキーに対する kms: GenerateDataKey 権限が必要です。その他すべての AWS KMS キーリングのその他すべてのキーでは、kms:Encrypt アクセス許可が必要です。

AWS KMS keys のアクセス許可については、AWS Key Management Service デベロッパーガイドの「認証とアクセスコントロール」を参照してください。

AWS KMS キーリングの AWS KMS keys の指定

AWS KMS キーリングには、1 つ以上の AWS KMS keys を含めることができます。AWS KMS キーリングの AWS KMS key を指定するには、サポートされている AWS KMS キー識別子を使用します。キーリングの AWS KMS key を指定するために使用できるキー識別子は、オペレーションと言語の実装によって異なります。AWS KMS key のキー識別子の詳細については、AWS Key Management Serviceデベロッパーガイドの「キー識別子」を参照してください。

ベストプラクティスとして、タスクに対して実用的である最も具体的なキー識別子を使用します。

  • AWS Encryption SDK for C の暗号化キーリングでは、KMS キーを識別するために、キー ARN または エイリアス ARN を使用できます。他のすべての言語実装では、キー IDキー ARNエイリアス名、または エイリアス ARN を使用してデータを暗号化できます。

  • 復号キーリングでは、キー ARN を使用して AWS KMS keys を指定する必要があります。この要件は、AWS Encryption SDK のすべての言語の実装に適用されます。詳細については、 ラッピングキーの選択 を参照してください。

  • 暗号化および復号に使用するキーリングでは、キー ARN を使用して AWS KMS keys を指定する必要があります。この要件は、AWS Encryption SDK のすべての言語の実装に適用されます。

暗号化キーリングで KMS キーのエイリアス名またはエイリアス ARN を指定すると、暗号化オペレーションによって、現在エイリアスに関連付けられているキー ARN が、暗号化されたデータキーのメタデータに保存されます。エイリアスは保存されません。エイリアスの変更は、暗号化されたデータキーの復号に使用される KMS キーには影響しません。

暗号化のための AWS KMS キーリングの作成

各 AWS KMS キーリングには、同じまたは異なる AWS アカウント や AWS リージョン の 1 つの AWS KMS key または複数の AWS KMS keys を設定できます。AWS KMS keys は、対称暗号化キー (SYMMETRIC_DEFAULT) でなければなりません。対称暗号化 マルチリージョン KMS キー を使用することもできます。すべてのキーリングと同様に、マルチキーリングの 1 つ以上の AWS KMS キーリングを使用できます。

AWS KMS キーリングを作成してデータを暗号化する場合は、ジェネレーターキーを指定する必要があります。これは、プレーンテキストのデータキーを生成してそれを暗号化するために使用される AWS KMS key です。データキーは数学的には KMS キーとは無関係です。その上で、必要に応じて、同じプレーンテキストのデータキーを暗号化する追加の AWS KMS keys を指定することができます。

このキーリングで保護された暗号化メッセージを復号するには、使用するキーリングに、キーリングで定義された AWS KMS keys のうち少なくとも 1 つが含まれているか、AWS KMS keys が含まれていない必要があります。(AWS KMS keys が含まれていない AWS KMS キーリングは、AWS KMS 検出キーリングと呼ばれます。)

AWS Encryption SDK for C 以外の AWS Encryption SDK 言語実装では、暗号化キーリングまたはマルチキーリング内のすべてのラッピングキーがデータキーを暗号化できる必要があります。いずれかのラッピングキーが暗号化に失敗すると、暗号化メソッドは失敗します。そのため、呼び出し元は、キーリング内のすべてのキーについて必要な許可を持っている必要があります。検出キーリングを使用して、単独またはマルチキーリングでデータを暗号化すると、暗号化操作は失敗します。例外は AWS Encryption SDK for C で、暗号化操作では標準の検出キーリングは無視されますが、マルチリージョン検出キーリングを単独またはマルチキーリングで指定すると失敗します。

以下の例では、1 つのジェネレーターキーと 1 つの追加キーで AWS KMS キーリングを作成します。これらの例では、キー ARN を使用して KMS キーを識別します。これは暗号化に使用される AWS KMS キーリングのベストプラクティスであり、復号に使用される AWS KMS キーリングの要件です。詳細については、 AWS KMS キーリングの AWS KMS keys の指定 を参照してください。

C

「AWS Encryption SDK for C」内の暗号化キーリングで AWS KMS key を識別するには、キー ARN または エイリアス ARN を指定します。復号キーリングでは、キー ARN を使用する必要があります。詳細については、「AWS KMS キーリングの AWS KMS keys の指定」を参照してください。

詳しい例については、string.cpp を参照してください。

const char * generator_key = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" const char * additional_key = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" struct aws_cryptosdk_keyring *kms_encrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(generator_key,{additional_key});
C# / .NET

「.NET 用 AWS Encryption SDK」で 1 つまたは複数の AWS KMS キーを持つ AWS KMS キーリングを作成するには、マルチキーリングを作成します。.NET 用 AWS Encryption SDK には、AWS KMS キーに対してのマルチキーリングが含まれています。

「.NET 用 AWS Encryption SDK」で暗号化キーリングに AWS KMS key を指定する場合は、任意の有効なキー識別子 (キー IDキー ARNエイリアス名エイリアス ARN) を使用できます。AWS KMS キーリングでの AWS KMS keys の識別方法については、「AWS KMS キーリングの AWS KMS keys の指定」を参照してください。

次の例では、.NET 用 AWS Encryption SDK のバージョン 4.x を使用して、ジェネレータキーと追加キーで AWS KMS キーリングを作成します。完全な例については、.cs を参照してください。AwsKmsMultiKeyringExample

// Instantiate the AWS Encryption SDK and material provider var mpl = new MaterialProviders(new MaterialProvidersConfig()); var esdk = new ESDK(new AwsEncryptionSdkConfig()); string generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; List<string> additionalKey = new List<string> { "alias/exampleAlias" }; // Instantiate the keyring input object var kmsEncryptKeyringInput = new CreateAwsKmsMultiKeyringInput { Generator = generatorKey, KmsKeyIds = additionalKey }; var kmsEncryptKeyring = materialProviders.CreateAwsKmsMultiKeyring(kmsEncryptKeyringInput);
JavaScript Browser

「AWS Encryption SDK for JavaScript」で暗号化キーリングに AWS KMS key を指定する場合は、任意の有効なキー識別子 (キー IDキー ARNエイリアス名エイリアス ARN) を使用できます。AWS KMS キーリングでの AWS KMS keys の識別方法については、「AWS KMS キーリングの AWS KMS keys の指定」を参照してください。

詳細な例については、のリポジトリにある kms_simple.ts を参照してください。AWS Encryption SDK for JavaScript GitHub

const clientProvider = getClient(KMS, { credentials }) const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' const additionalKey = 'alias/exampleAlias' const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey] })
JavaScript Node.js

「AWS Encryption SDK for JavaScript」で暗号化キーリングに AWS KMS key を指定する場合は、任意の有効なキー識別子 (キー IDキー ARNエイリアス名エイリアス ARN) を使用できます。AWS KMS キーリングでの AWS KMS keys の識別方法については、「AWS KMS キーリングの AWS KMS keys の指定」を参照してください。

詳細な例については、のリポジトリにある kms_simple.ts を参照してください。 AWS Encryption SDK for JavaScript GitHub

const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' const additionalKey = 'alias/exampleAlias' const keyring = new KmsKeyringNode({ generatorKeyId, keyIds: [additionalKey] })
Java

に 1 AWS KMS つまたは複数のキーを含むキーリングを作成するには、AWS KMSマルチキーリングを作成します。AWS Encryption SDK for JavaAWS Encryption SDK for Javaにはキー専用のマルチキーリングが含まれています。AWS KMS

「AWS Encryption SDK for Java」で暗号化キーリングに AWS KMS key を指定する場合は、任意の有効なキー識別子 (キー IDキー ARNエイリアス名エイリアス ARN) を使用できます。AWS KMS キーリングでの AWS KMS keys の識別方法については、「AWS KMS キーリングの AWS KMS keys の指定」を参照してください。

詳細な例については、BasicEncryptionKeyringExampleAWS Encryption SDK for Javaのリポジトリにある.java を参照してください。 GitHub

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; List<String> additionalKey = Collections.singletonList("alias/exampleAlias"); // Create the AWS KMS keyring final CreateAwsKmsMultiKeyringInput keyringInput = CreateAwsKmsMultiKeyringInput.builder() .generator(generatorKey) .kmsKeyIds(additionalKey) .build(); final IKeyring kmsKeyring = matProv.CreateAwsKmsMultiKeyring(keyringInput);

復号用の AWS KMS キーリングの作成

AWS Encryption SDK が返す暗号化されたメッセージを復号するときには、AWS KMS キーリングも指定します。復号キーリングに AWS KMS keys が指定されている場合、AWS Encryption SDK はそれらのラッピングキーのみを使用して、暗号化されたメッセージの暗号化されたデータキーを復号化します。(AWS KMS keys を指定しない AWS KMS 検出キーリングも使用できます。)

復号時に、AWS Encryption SDK は暗号化されたデータキーのいずれかを復号できる AWS KMS key を AWS KMS キーリングから探します。具体的には、AWS Encryption SDK は暗号化されたメッセージの暗号化されたデータキーごとに以下のパターンに従います。

  • AWS Encryption SDK は、暗号化されたメッセージのメタデータから、データキーを暗号化された AWS KMS key のキー ARN を取得します。

  • AWS Encryption SDK は、一致するキー ARN を持つ AWS KMS key を復号キーリングから探します。

  • キーリングに一致するキー ARN を持つ AWS KMS key が見つかった場合、AWS Encryption SDK は AWS KMS に暗号化されたデータキーを復号するために KMS キーを使うように要求します。

  • それ以外の場合は、暗号化された次のデータキーに進みます (ある場合)。

AWS Encryption SDK は、データキーを暗号化した AWS KMS key のキー ARN が復号キーリングに含まれている場合を除き、暗号化されたデータキーを復号しません。データキーを暗号化したいずれかの AWS KMS keys の ARN が復号キーリングに含まれていない場合、AWS Encryption SDK は AWS KMS を呼び出さず、復号は失敗します。

バージョン 1.7.x からは、暗号化されたデータキーの復号時に、AWS Encryption SDK は AWS KMS key のキー ARN を AWS KMS復号オペレーションの KeyId パラメータに常に渡します。復号時に AWS KMS key を識別することが、AWS KMS のベストプラクティスです。使用するラッピングキーで、暗号化されたデータキーを復号できるようになります。

AWS KMS キーリングを使用した復号の呼び出しは、復号キーリングの少なくとも 1 つの AWS KMS key が暗号化されたメッセージの暗号化されたデータキーのいずれかを復号できる場合に成功します。また、呼び出し元は、その kms:Decrypt に対する AWS KMS key アクセス許可を持っている必要があります。この動作により、複数の AWS KMS keys でさまざまな AWS リージョン やアカウントのデータを暗号化しつつ、特定のアカウント、リージョン、ユーザー、グループ、ロールに復号キーリングを限定することができます。

復号キーリングの AWS KMS key を指定するには、そのキー ARN を使用する必要があります。使用しない場合、AWS KMS key は認識されません。キーと ARN を見つけるには、AWS Key Management Service デベロッパーガイドの「キー ID と ARN を検索する」を参照してください。

注記

復号に暗号化キーリングを再利用する場合は、キーリングの AWS KMS keys をキー ARN で指定するようにしてください。

例えば、以下の AWS KMS キーリングには、暗号化キーリングに使用した追加のキーのみが含まれます。ただし、この例では、追加キーをエイリアス、alias/exampleAlias で参照する代わりに、復号呼び出しに必要な追加キーのキー ARN を使用しています。

このキーリングを使用して、ジェネレーターキーと追加のキーの両方で暗号化されたメッセージを復号することができます。ただし、追加のキーを使用してデータを復号するアクセス許可があることが必要です。

C
const char * additional_key = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" struct aws_cryptosdk_keyring *kms_decrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(additional_key);
C# / .NET

この復号キーリングには、1 つの AWS KMS キーしか含まれていないため、この例では CreateAwsKmsKeyring() メソッドをその CreateAwsKmsKeyringInput オブジェクトのインスタンスで使用しています。1 つの AWS KMS キーで AWS KMS キーリングを作成するには、シングルキーまたはマルチキーのキーキーリングを使用できます。詳細については、 「.NET 用 AWS Encryption SDK」でのデータの暗号化 を参照してください。次の例では、.NET 用 AWS Encryption SDK のバージョン 4.x を使用して、復号用の AWS KMS キーリングを作成します。

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); string additionalKey = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; // Instantiate a KMS keyring for one AWS KMS key. var kmsDecryptKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = additionalKey }; var kmsDecryptKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const additionalKey = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' const keyring = new KmsKeyringBrowser({ clientProvider, keyIds: [additionalKey] })
JavaScript Node.js
const additionalKey = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' const keyring = new KmsKeyringNode({ keyIds: [additionalKey] })
Java

この復号キーリングには、1 つの AWS KMS キーしか含まれていないため、この例では CreateAwsKmsKeyring() メソッドをその CreateAwsKmsKeyringInput オブジェクトのインスタンスで使用しています。1 つの AWS KMS キーで AWS KMS キーリングを作成するには、シングルキーまたはマルチキーのキーキーリングを使用できます。

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String additionalKey = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; // Create a AwsKmsKeyring CreateAwsKmsKeyringInput kmsDecryptKeyringInput = CreateAwsKmsKeyringInput.builder() .generator(additionalKey) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);

復号には、以下のようにジェネレーターキーを指定する AWS KMS キーリングを使用することもできます。復号する場合、AWS Encryption SDK ではジェネレーターキーと追加キーは区別されません。指定した任意の AWS KMS keys を使用して、暗号化されたデータキーを復号することができます。AWS KMS に対する呼び出しは、呼び出し元にその AWS KMS key を使用してデータを復号するアクセス許可がある場合にのみ成功します。

C
struct aws_cryptosdk_keyring *kms_decrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(generator_key, {additional_key, other_key});
C# / .NET

次の例では、.NET 用 AWS Encryption SDK のバージョン 4.x を使用します。

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); string generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; // Instantiate a KMS keyring for one AWS KMS key. var kmsDecryptKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = generatorKey }; var kmsDecryptKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey, otherKey] })
JavaScript Node.js
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds: [additionalKey, otherKey] })
Java
// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; // Create a AwsKmsKeyring CreateAwsKmsKeyringInput kmsDecryptKeyringInput = CreateAwsKmsKeyringInput.builder() .generator(generatorKey) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);

指定したすべての AWS KMS keys を使用する暗号化キーリングとは異なり、暗号化されたメッセージの復号は、暗号化されたメッセージとは無関係の AWS KMS keys や呼び出し元に使用するアクセス許可がない AWS KMS keys を含む復号キーリングを使用して行うことができます。必要なアクセス許可が呼び出し元にない場合など、AWS KMS に対する復号の呼び出しに失敗した場合は、AWS Encryption SDK は次の暗号化されたデータキーにスキップします。

AWS KMS 検出キーリングの使用

復号するときは、AWS Encryption SDK が使用できるラッピングキーを指定するのが ベストプラクティス です。このベストプラクティスに従うには、AWS KMS ラッピングキーを指定したものに限定する AWS KMS 復号キーリングを使用します。ただし、AWS KMS 検出キーリング (つまり、ラッピングキーを指定しない AWS KMS キーリング) を作成することもできます。

AWS Encryption SDK には、標準の AWS KMS 検出キーリングと AWS KMS マルチリージョンキー用の検出キーリングが用意されています。AWS Encryption SDK でのマルチリージョンキーの使用の詳細については、「マルチリージョン AWS KMS keys の使用」を参照してください。

ラッピングキーが指定されていないため、検出キーリングではデータを暗号化することはできません。検出キーリングを使用して、単独またはマルチキーリングでデータを暗号化すると、暗号化操作は失敗します。例外は AWS Encryption SDK for C で、暗号化操作では標準の検出キーリングは無視されますが、マルチリージョン検出キーリングを単独またはマルチキーリングで指定すると失敗します。

復号する場合、検出キーリングを使用すると、AWS Encryption SDK から AWS KMS に対して、AWS KMS key の所有者やアクセス許可に関係なく、暗号化されたデータキーを暗号化した AWS KMS key を使用して復号するように要求できます。呼び出しは、呼び出し元にその AWS KMS key に対する kms:Decrypt アクセス許可がある場合にのみ成功します。

重要

復号マルチキーリングに AWS KMS 検出キーリングを含めると、検出キーリングは、マルチキーリング内の他のキーリングによって指定されたすべての KMS キー制限をオーバーライドします。マルチキーリングは、最も制限の少ないキーリングのように動作します。AWS KMS 検出キーリングは、単独で使用する場合も、マルチキーリングで使用する場合も、暗号化には影響しません。

AWS Encryption SDK では、AWS KMS 検出キーリングを利便性のために提供しています。ただし、次の理由から、可能な限り制限されたキーリングを使用することをお勧めします。

  • 真正性 – AWS KMS 検出キーリングでは、暗号化されたメッセージのデータキーの暗号化に使用されたすべての AWS KMS key を使用できます。そのため、呼び出し元には、その AWS KMS key を使用するアクセス許可があれば復号できます。これは、呼び出し元が使用することを意図した AWS KMS key ではない場合があります。例えば、暗号化されたデータキーの 1 つが誰でも使用できる安全性の低い AWS KMS key で暗号化されている場合があります。

  • レイテンシーとパフォーマンス – AWS KMS 検出キーリングでは、AWS Encryption SDK が他の AWS アカウント やリージョンの AWS KMS keys で暗号化されたデータキーや呼び出し元に復号に使用するアクセス許可がない AWS KMS keys で暗号化されたデータキーなど、暗号化されたすべてのデータキーを復号しようとするため、他のキーリングよりも速度が大幅に低下する場合があります。

検出キーリングを使用する場合は、検出フィルター を使用して、使用できる KMS キーを指定された AWS アカウント および パーティション 内のキーに限定することをお勧めします。検出フィルターは、AWS Encryption SDK のバージョン 1.7.x 以降でサポートされています。アカウント ID とパーティションを確認する方法については、「AWS 全般のリファレンス」の「AWS アカウント ID」と「ARN 形式」を参照してください。

次のコードは、AWS Encryption SDK が使用できる KMS キーを aws パーティションと 111122223333 サンプルアカウント内のものに制限する検出フィルターを使用して AWS KMS 検出キーリングをインスタンス化します。

このコードを使用する前に、サンプル AWS アカウント とパーティションの値を、AWS アカウント およびパーティションの有効な値に置き換えてください。KMS キーが中国リージョンにある場合は、aws-cn のパーティションの値を使用します。KMS キーが AWS GovCloud (US) Regions にある場合は、aws-us-gov のパーティションの値を使用します。それ以外の AWS リージョン の場合は、aws パーティション値を使用してください。

C

詳しい例については、kms_discovery.cpp を参照してください。

std::shared_ptr<KmsKeyring::> discovery_filter( KmsKeyring::DiscoveryFilter::Builder("aws") .AddAccount("111122223333") .Build()); struct aws_cryptosdk_keyring *kms_discovery_keyring = Aws::Cryptosdk::KmsKeyring::Builder() .BuildDiscovery(discovery_filter));
C# / .NET

次の例では、.NET 用 AWS Encryption SDK のバージョン 4.x を使用します。

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // In a discovery keyring, you specify an AWS KMS client and a discovery filter, // but not a AWS KMS key var kmsDiscoveryKeyringInput = new CreateAwsKmsDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), DiscoveryFilter = new DiscoveryFilter() { AccountIds = account, Partition = "aws" } }; var kmsDiscoveryKeyring = materialProviders.CreateAwsKmsDiscoveryKeyring(kmsDiscoveryKeyringInput);
JavaScript Browser

では JavaScript、検出プロパティを明示的に指定する必要があります。

const clientProvider = getClient(KMS, { credentials }) const discovery = true const keyring = new KmsKeyringBrowser(clientProvider, { discovery, discoveryFilter: { accountIDs: [111122223333], partition: 'aws' } })
JavaScript Node.js

では JavaScript、検出プロパティを明示的に指定する必要があります。

const discovery = true const keyring = new KmsKeyringNode({ discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
Java
// Create discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build(); // Create the discovery keyring CreateAwsKmsMrkDiscoveryMultiKeyringInput createAwsKmsMrkDiscoveryMultiKeyringInput = CreateAwsKmsMrkDiscoveryMultiKeyringInput.builder() .discoveryFilter(discoveryFilter) .build(); IKeyring decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);

AWS KMS リージョン検出キーリングの使用

AWS KMS リージョン検出キーリング は、KMS キーの ARN を指定しないキーリングです。代わりに、AWS Encryption SDK は特定の AWS リージョン の KMS キーのみを使用して復号できます。

AWS KMS リージョン検出キーリングで復号化する場合、AWS Encryption SDK は、指定された AWS リージョン の AWS KMS key で暗号化された暗号化データキーを復号します。復号が成功するには、暗号化されたデータキーの指定した AWS リージョン のうち、AWS KMS keys の少なくとも 1 つに kms:Decrypt アクセス許可が呼び出し元にある必要があります。

他の検出キーリングと同様に、リージョン検出キーリングは暗号化には影響しません。暗号化されたメッセージを復号する場合にのみ機能します。暗号化と復号に使用されるマルチキーリングでリージョン検出キーリングを使用する場合、そのキーリングは復号化時にのみ有効です。マルチリージョン検出キーリングを単独または複数のキーリングで使用してデータを暗号化すると、暗号化オペレーションは失敗します。

重要

復号マルチキーリングに AWS KMS リージョンレベルの検出キーリングを含めると、リージョンレベルの検出キーリングは、マルチキーリング内の他のキーリングによって指定されたすべての KMS キー制限をオーバーライドします。マルチキーリングは、最も制限の少ないキーリングのように動作します。AWS KMS 検出キーリングは、単独で使用する場合も、マルチキーリングで使用する場合も、暗号化には影響しません。

AWS Encryption SDK for C のリージョン検出キーリングは、指定されたリージョンの KMS キーのみを使用して復号を試みます。「.NET 用 AWS Encryption SDK for JavaScript」および AWS Encryption SDK で検出キーリングを使用する場合は、AWS KMS クライアント上でリージョンを設定します。これらの AWS Encryption SDK 実装では、KMS キーをリージョン別にフィルタリングしませんが、AWS KMS は指定したリージョン以外の KMS キーの復号リクエストは失敗します。

検出キーリングを使用する場合は、検出フィルターを使用して、復号に使用する KMS キーを指定した AWS アカウント およびパーティション内のキーに制限することをお勧めします。検出フィルターは、AWS Encryption SDK のバージョン 1.7.x 以降でサポートされています。

例えば、次のコードでは、検出フィルター付きの AWS KMS リージョン検出キーリングを作成します。このキーリングは、米国西部 (オレゴン) リージョン (us-west-2) のアカウント 111122223333 の KMS キーに AWS Encryption SDK を制限します。

C

実例でこのキーリングや create_kms_client メソッドを表示する方法については、「kms_discovery.cpp」を参照してください。

std::shared_ptr<KmsKeyring::DiscoveryFilter> discovery_filter( KmsKeyring::DiscoveryFilter::Builder("aws") .AddAccount("111122223333") .Build()); struct aws_cryptosdk_keyring *kms_regional_keyring = Aws::Cryptosdk::KmsKeyring::Builder() .WithKmsClient(create_kms_client(Aws::Region::US_WEST_2)).BuildDiscovery(discovery_filter));
C# / .NET

.NET 用 AWS Encryption SDK には、専用のリージョン検出キーリングはありません。ただし、復号時に使用する KMS キーを特定のリージョンに制限する手法はいくつかあります。

検出キーリング内のリージョンを制限する最も効率的な方法は、単一リージョンキーのみを使用してデータを暗号化した場合でも、マルチリージョン対応の検出キーリングを使用することです。単一リージョンキーが見つかった場合、マルチリージョン対応キーリングはマルチリージョン機能を使用しません。

CreateAwsKmsMrkDiscoveryKeyring() メソッドによって返されるキーリングは、AWS KMS を呼び出す前に KMS キーをリージョン別にフィルタリングします。暗号化されたデータキーが、CreateAwsKmsMrkDiscoveryKeyringInput オブジェクトの Region パラメータで指定されたリージョンの KMS キーによって暗号化された場合にのみ、AWS KMS に復号リクエストが送信されます。

次の例では、.NET 用 AWS Encryption SDK のバージョン 4.x を使用します。

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // Create the discovery filter var filter = DiscoveryFilter = new DiscoveryFilter { AccountIds = account, Partition = "aws" }; var regionalDiscoveryKeyringInput = new CreateAwsKmsMrkDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(RegionEndpoint.USWest2), Region = RegionEndpoint.USWest2, DiscoveryFilter = filter }; var kmsRegionalDiscoveryKeyring = materialProviders.CreateAwsKmsMrkDiscoveryKeyring(regionalDiscoveryKeyringInput);

AWS KMSクライアントのインスタンス (AmazonKeyManagementServiceClient) AWS リージョン でリージョンを指定することで、KMS キーを特定のものに限定することもできます。ただし、この構成は、マルチリージョン対応の検出キーリングを使用するよりも効率が悪く、コストもかかる可能性があります。.NET 用 AWS Encryption SDK は、AWS KMS を呼び出し前に KMS キーをリージョン別にフィルタリングする代わりに、暗号化された各データキーを (1 つを復号するまで) AWS KMS を呼び出し、使用する KMS キーを指定されたリージョンに限定するために AWS KMS に依存します。

次の例では、.NET 用 AWS Encryption SDK のバージョン 4.x を使用します。

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // Create the discovery filter, // but not a AWS KMS key var createRegionalDiscoveryKeyringInput = new CreateAwsKmsDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(RegionEndpoint.USWest2), DiscoveryFilter = new DiscoveryFilter() { AccountIds = account, Partition = "aws" } }; var kmsRegionalDiscoveryKeyring = materialProviders.CreateAwsKmsDiscoveryKeyring(createRegionalDiscoveryKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const discovery = true const clientProvider = limitRegions(['us-west-2'], getKmsClient) const keyring = new KmsKeyringBrowser(clientProvider, { discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
JavaScript Node.js

このキーリングや limitRegions 関数の実際の例については、kms_regional_discovery.ts を参照してください。

const discovery = true const clientProvider = limitRegions(['us-west-2'], getKmsClient) const keyring = new KmsKeyringNode({ clientProvider, discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
Java
// Create the discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build(); // Create the discovery keyring CreateAwsKmsMrkDiscoveryMultiKeyringInput createAwsKmsMrkDiscoveryMultiKeyringInput = CreateAwsKmsMrkDiscoveryMultiKeyringInput.builder() .discoveryFilter(discoveryFilter) .regions("us-west-2") .build(); IKeyring decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);

AWS Encryption SDK for JavaScript は、Node.js とブラウザ用の excludeRegions 関数もエクスポートします。この関数は、特定のリージョンの AWS KMS keys を除外する AWS KMS リージョン検出キーリングを作成します。次の例では、米国東部 (バージニア北部) (us-east-1) を除くすべての AWS リージョン で、アカウント 111122223333 の AWS KMS keys を使用できる AWS KMS リージョン検出キーリングを作成します。

AWS Encryption SDK for Cには類似の方法はありませんが、カスタムを作成することで実装できます。ClientSupplier

この例は、Node.js 用のコードを示しています。

const discovery = true const clientProvider = excludeRegions(['us-east-1'], getKmsClient) const keyring = new KmsKeyringNode({ clientProvider, discovery, discoveryFilter: { accountIDs: [111122223333], partition: 'aws' } })