AWS KMS キーリング - AWS Encryption SDK

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

AWS KMS キーリング

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

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

注記

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

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

KMSキーリングに関するすべての言及は、 AWS KMS キーリング AWS Encryption SDK を参照します。

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:GenerateDataKey アクセス許可が必要です。 AWS 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 keys での AWS KMS の識別

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、キーARNまたはエイリアスARNを使用してKMSキーを識別できます。他のすべての言語実装では、キー ID キー ARNエイリアス名 、またはエイリアスARNを使用してデータを暗号化できます。

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

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

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

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

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

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

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

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

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

C

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

詳しい例については、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

AWS Encryption SDK の で 1 つ以上の AWS KMS キーを持つ AWS KMS キーリングを作成するにはNET、マルチキーリングを作成します。 AWS Encryption SDK の 。NET には、 キー専用のマルチ AWS KMS キーリングが含まれています。

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

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

// 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 KMS key に を指定する場合 AWS Encryption SDK for JavaScript、キー ID 、キー エイリアス名 、エイリアス ARNのいずれかの有効なキーARN識別子を使用できます。 AWS KMS キーリング AWS KMS keys で を識別する方法については、「」を参照してくださいキーリング AWS KMS keys での AWS KMS の識別

完全な例については、 のリポジトリの「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 KMS key に を指定する場合 AWS Encryption SDK for JavaScript、キー ID 、キー エイリアス名 、エイリアス ARNのいずれかの有効なキーARN識別子を使用できます。 AWS KMS キーリング AWS KMS keys で を識別する方法については、「」を参照してくださいキーリング AWS KMS keys での AWS KMS の識別

完全な例については、 のリポジトリの「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 Java、マルチキーリングを作成します。には、 AWS Encryption SDK for Java キー専用のマルチ AWS KMS キーリングが含まれています。

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

完全な例については、 のリポジトリのBasicEncryptionKeyringExample「.java AWS Encryption SDK for 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 検出キーリング を使用することもできます) AWS KMS keys。

復号時に、 は暗号化されたデータ AWS KMS キーの 1 つを復号 AWS KMS key できる をキーリングで AWS Encryption SDK 検索します。具体的には、 は暗号化されたメッセージ内の暗号化されたデータキーごとに次のパターン AWS Encryption SDK を使用します。

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

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

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

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

は、そのデータキーを暗号化した ARNのキー AWS KMS key が復号キーリングに含まれていない限り、暗号化されたデータキーの復号を試み AWS Encryption SDK ません。復号キーリングに、データキーのいずれかを暗号化 AWS KMS keys した ARNs の が含まれていない場合、 は を呼び出すことなく復号呼び出しを AWS Encryption SDK 失敗させます AWS KMS。

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

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

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

注記

暗号化キーリングを復号化に再利用する場合は、キーリング AWS KMS keys の がキー によって識別されていることを確認してくださいARNs。

例えば、次の 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 キーしか含まれないため、この例では CreateAwsKmsKeyringInput オブジェクトのインスタンスで CreateAwsKmsKeyring()メソッドを使用します。1 つの AWS KMS キーで AWS KMS キーリングを作成するには、単一キーまたは複数キーのキーリングを使用できます。詳細については、「「.NET 用 AWS Encryption SDK」でのデータの暗号化」を参照してください。次の例では、 のバージョン 4.x を AWS Encryption SDK に使用します。NET は、復号用の 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 キーしか含まれないため、この例では CreateAwsKmsKeyringInput オブジェクトのインスタンスで CreateAwsKmsKeyring()メソッドを使用します。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 key するアクセス許可を持っている場合にのみ AWS KMS 成功します。

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

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

// 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 KMS 、暗号化されたデータキーを所有またはアクセスできるユーザーに関係なく、暗号化されたデータキーを暗号化 AWS KMS key された を使用して復号化するように に AWS Encryption SDK 要求できます 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 アカウント およびリージョン AWS KMS keys の によって暗号化されたデータキーを含む、暗号化されたすべてのデータキーの復号 AWS Encryption SDK を試み、呼び出し元 AWS KMS keys に復号に使用するアクセス許可がないため、他のキーリングよりもかなり遅くなる可能性があります。

検出キーリングを使用する場合は、検出フィルターを使用して、使用できるキーを、指定された AWS アカウント およびパーティション 内のKMSキーに制限することをお勧めします。 https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html検出フィルターは、 AWS Encryption SDKのバージョン 1.7.x 以降でサポートされています。アカウント ID とパーティションの検索については、「」の「識別子 AWS アカウントARN形式」を参照してくださいAWS 全般のリファレンス

次のコードは、 が AWS Encryption SDK 使用できる AWS KMS キーをawsパーティションおよび 111122223333 サンプルアカウント内のキーに制限する検出フィルターを使用して、検出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

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

// 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、discovery プロパティを明示的に指定する必要があります。

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

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

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 リージョン検出キーリングは、キーARNsの を指定しないKMSキーリングです。代わりに、 AWS Encryption SDK は特定の のKMSキーのみを使用して復号できます AWS リージョン。

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

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

重要

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

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

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

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

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

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

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

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

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

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

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

// 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);

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