AWS Database Encryption SDK の設定 - AWS データベース暗号化 SDK

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

AWS Database Encryption SDK の設定

クライアント側の暗号化ライブラリの名前が AWS Database Encryption SDK に変更されました。このデベロッパーガイドでは、引き続き DynamoDB Encryption Client に関する情報を提供します。

AWS Database Encryption SDK は、使いやすいように設計されています。 AWS Database Encryption SDK にはいくつかの設定オプションがありますが、デフォルト値はほとんどのアプリケーションで実用的で安全になるように慎重に選択されています。ただし、パフォーマンスを改善するために構成を調整したり、設計にカスタム機能を追加したりしたい場合があります。

プログラミング言語の選択

AWS Database Encryption SDK for DynamoDB は、複数のプログラミング言語で利用できます。言語の実装は、完全に相互運用可能で、同じ機能を提供するように設計されていますが、異なる方法で実装される可能性があります。通常は、アプリケーションと互換性のあるライブラリを使用します。

ラッピングキーの選択

AWS Database Encryption SDK は、各フィールドを暗号化するための一意の対称データキーを生成します。データキーを設定、管理、または使用する必要はありません。 AWS Database Encryption SDK がこれを行います。

ただし、各データキーを暗号化するには、1 つ以上のラッピングキーを選択する必要があります。 AWS Database Encryption SDK は、AWS Key Management Service (AWS KMS) 対称暗号化 KMS キーと非対称 RSA KMS キーをサポートします。また、さまざまなサイズで提供する AES 対称キーと RSA 非対称キーもサポートします。ラッピングキーの安全性と耐久性はお客様の責任となります。そのため、ハードウェアセキュリティモジュールや などのキーインフラストラクチャサービスで暗号化キーを使用することをお勧めします AWS KMS。

暗号化と復号のためにラッピングキーを指定するには、キーリングを使用します。使用するキーリングのタイプに応じて、1 つのラッピングキー、または同じタイプもしくは異なるタイプの複数のラッピングキーを指定できます。複数のラッピングキーを使用してデータキーをラップする場合、各ラッピングキーは同じデータキーのコピーを暗号化します。暗号化されたデータキー (ラッピングキーごとに 1 つ) は、暗号化されたフィールドと一緒に格納されるマテリアルの説明に格納されます。データを復号するには、 AWS Database Encryption SDK はまずラッピングキーのいずれかを使用して暗号化されたデータキーを復号する必要があります。

可能な限り、いずれかの AWS KMS キーリングを使用することをお勧めします。 AWS Database Encryption SDK は、 AWS KMS キーリングAWS KMS 階層キーリングを提供し、 への呼び出しの数を減らします AWS KMS。キーリング AWS KMS key で を指定するには、サポートされている AWS KMS キー識別子を使用します。 AWS KMS 階層キーリングを使用する場合は、キー ARN を指定する必要があります。キーのキー識別子の詳細については AWS KMS 、「 AWS Key Management Service デベロッパーガイド」の「キー識別子」を参照してください。

  • AWS KMS キーリングで暗号化する場合、対称暗号化 KMS キーに任意の有効なキー識別子 (キー ARN、エイリアス名、エイリアス ARN、またはキー ID) を指定できます。非対称 RSA KMS キーを使用する場合は、キー ARN を指定する必要があります。

    暗号化時に KMS キーのエイリアス名またはエイリアス ARN を指定する場合、 AWS Database Encryption SDK は、そのエイリアスに現在関連付けられているキー ARN を保存します。エイリアスは保存されません。エイリアスの変更は、データキーの復号に使用される KMS キーには影響しません。

  • デフォルトでは、 AWS KMS キーリングは strict モード (特定の KMS キーを指定する) でレコードを復号します。復号のために AWS KMS keys を識別するにはキー ARN を使用する必要があります。

    AWS KMS キーリングで暗号化すると、 AWS Database Encryption SDK は暗号化されたデータキーを使用して のキー ARN をマテリアルの説明 AWS KMS key に保存します。Strict モードで復号する場合、 AWS Database Encryption SDK は、ラッピングキーを使用して暗号化されたデータキーを復号しようとする前に、キーリングに同じキー ARN が表示されることを確認します。別のキー識別子を使用する場合、識別子が同じキーを参照している場合でも AWS KMS key、 AWS Database Encryption SDK は を認識または使用しません。

  • 検出モードで復号する場合は、ラッピングキーを指定しません。まず、 AWS Database Encryption SDK は、マテリアルの説明に保存されたキー ARN を使用してレコードの復号を試みます。これが機能しない場合、 AWS Database Encryption SDK は、その KMS キーを所有またはアクセスできるユーザーに関係なく、暗号化された KMS キーを使用してレコードを復号 AWS KMS するよう に求めます。

raw AES キーまたは raw RSA キーペアをキーリング内のラッピングキーとして指定するには、名前空間と名前を指定する必要があります。復号する際には、暗号化の際に使用した各 raw ラッピングキーとまったく同じ名前空間と名前を使用する必要があります。別の名前空間または名前を使用する場合、 AWS Database Encryption SDK は、キーマテリアルが同じであっても、ラッピングキーを認識または使用しません。

検出フィルターの作成

KMS キーを使用して暗号化されたデータを復号する場合は、厳格モードで復号する、つまり、使用するラッピングキーを、指定したもののみに制限するのがベストプラクティスです。ただし、必要に応じて、ラッピングキーを指定しない検出モードで復号することもできます。このモードでは、その KMS キーを所有またはアクセスできるユーザーに関係なく、暗号化されたデータキーを暗号化した KMS キーを使用して復号 AWS KMS できます。

検出モードで復号する必要がある場合は、常に検出フィルターを使用することをお勧めします。これにより、使用できる KMS キーが、指定された AWS アカウント および パーティション内のキーに制限されます。検出フィルターはオプションですが、ベストプラクティスです。

次の表を使用して、検出フィルターのパーティションの値を決定します。

リージョン パーティション
AWS リージョン aws
中国リージョン aws-cn
AWS GovCloud (US) Regions aws-us-gov

次の例は、検出フィルターを作成する方法を示しています。コードを使用する前に、サンプル値を AWS アカウント および パーティションの有効な値に置き換えます。

Java
// Create the discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build();
C# / .NET
var discoveryFilter = new DiscoveryFilter { Partition = "aws", AccountIds = 111122223333 };
Rust
// Create discovery filter let discovery_filter = DiscoveryFilter::builder() .partition("aws") .account_ids(111122223333) .build()?;

マルチテナンシーデータベースの使用

AWS Database Encryption SDK を使用すると、各テナントを個別の暗号化マテリアルで分離することで、共有スキーマを持つデータベースのクライアント側の暗号化を設定できます。マルチテナンシーデータベースを検討する場合は、セキュリティ要件と、マルチテナンシーがそれらのセキュリティ要件にどのように影響し得るかを確認してください。例えば、マルチテナントデータベースを使用すると、 AWS Database Encryption SDK を別のサーバー側の暗号化ソリューションと組み合わせる能力に影響する可能性があります。

データベース内で複数のユーザーが暗号化オペレーションを実行している場合は、いずれかの AWS KMS キーリングを使用して、暗号化オペレーションで使用する個別のキーを各ユーザーに提供できます。マルチテナンシーのクライアント側の暗号化ソリューション用のデータキーの管理は複雑になる場合があります。可能な場合は常に、データをテナンシーごとに整理することをお勧めします。テナンシーがプライマリキーの値 (Amazon DynamoDB テーブルのパーティションキーなど) によって識別される場合、キーの管理は簡単になります。

AWS KMS キーリングを使用して、各テナントを個別の AWS KMS キーリング および で分離できます AWS KMS keys。テナントごとに行われた呼び出しの量 AWS KMS に基づいて、 AWS KMS 階層キーリングを使用して呼び出しを最小限に抑えることができます AWS KMS。AWS KMS 階層キーリングは、Amazon DynamoDB テーブルに保持されている AWS KMS 保護されたブランチキーを使用し、暗号化および復号オペレーションで使用されるブランチキーマテリアルをローカルにキャッシュすることで、 AWS KMS 呼び出しの数を減らす暗号化マテリアルキャッシュソリューションです。データベースに検索可能な暗号化を実装するには、 AWS KMS 階層キーリングを使用する必要があります。

署名付きビーコンの作成

AWS Database Encryption SDK は、標準ビーコン複合ビーコンを使用して、クエリされたデータベース全体を復号することなく、暗号化されたレコードを検索できる検索可能な暗号化ソリューションを提供します。ただし、 AWS Database Encryption SDK は、プレーンテキストの署名付きフィールドから完全に設定できる署名付きビーコンもサポートしています。署名付きビーコンは、 SIGN_ONLYフィールドと SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXTフィールドに対してインデックスを作成し、複雑なクエリを実行する複合ビーコンの一種です。

例えば、マルチテナンシーデータベースがある場合、特定のテナンシーのキーによって暗号化されたレコードがあるかどうかを確認するために、データベースをクエリできるようにする署名付きビーコンを作成することをお勧めします。詳細については、「マルチテナンシーデータベース内のビーコンのクエリ」を参照してください。

署名付きビーコンを作成するには、 AWS KMS 階層キーリングを使用する必要があります。

署名付きビーコンを設定するには、次の値を指定します。

Java

複合ビーコン設定

次の の例では、署名付きビーコン設定内で署名付きパートリストをローカルに定義します。

List<CompoundBeacon> compoundBeaconList = new ArrayList<>(); CompoundBeacon exampleCompoundBeacon = CompoundBeacon.builder() .name("compoundBeaconName") .split(".") .signed(signedPartList) .constructors(constructorList) .build(); compoundBeaconList.add(exampleCompoundBeacon);

ビーコンバージョン定義

次の例では、ビーコンバージョンで署名付きパートリストをグローバルに定義します。ビーコンバージョンの定義の詳細については、「ビーコンの使用」を参照してください。

List<BeaconVersion> beaconVersions = new ArrayList<>(); beaconVersions.add( BeaconVersion.builder() .standardBeacons(standardBeaconList) .compoundBeacons(compoundBeaconList) .signedParts(signedPartList) .version(1) // MUST be 1 .keyStore(keyStore) .keySource(BeaconKeySource.builder() .single(SingleKeyStore.builder() .keyId(branchKeyId) .cacheTTL(6000) .build()) .build()) .build() );
C# / .NET

完全なコードサンプルを参照: BeaconConfig.cs

署名付きビーコン設定

次の の例では、署名付きビーコン設定内で署名付きパートリストをローカルに定義します。

var compoundBeaconList = new List<CompoundBeacon>(); var exampleCompoundBeacon = new CompoundBeacon { Name = "compoundBeaconName", Split = ".", Signed = signedPartList, Constructors = constructorList }; compoundBeaconList.Add(exampleCompoundBeacon);

ビーコンバージョン定義

次の例では、ビーコンバージョンで署名付きパートリストをグローバルに定義します。ビーコンバージョンの定義の詳細については、「ビーコンの使用」を参照してください。

var beaconVersions = new List<BeaconVersion> { new BeaconVersion { StandardBeacons = standardBeaconList, CompoundBeacons = compoundBeaconList, SignedParts = signedPartsList, Version = 1, // MUST be 1 KeyStore = keyStore, KeySource = new BeaconKeySource { Single = new SingleKeyStore { KeyId = branchKeyId, CacheTTL = 6000 } } } };

署名付きパートは、ローカルまたはグローバルに定義されたリストで定義できます。可能な限り、ビーコンバージョンのグローバルリストで署名付きパートを定義することをお勧めします。署名付きパートをグローバルに定義することで、各パートを 1 回定義し、そのパートを複数の複合ビーコン設定で再利用できます。署名付きパートを 1 回だけ使用する場合は、署名付きビーコン設定のローカルリストで定義できます。コンストラクタリストでは、ローカルパートとグローバルパートの両方を参照できます。

署名付きパートリストをグローバルに定義する場合は、署名付きビーコンがビーコン設定のフィールドをアセンブルできるすべての方法を識別するコンストラクタパートのリストを指定する必要があります。

注記

署名付きパートリストをグローバルに定義するには、 AWS Database Encryption SDK のバージョン 3.2 以降を使用する必要があります。新しいパートをグローバルに定義する前に、すべてのリーダーに新しいバージョンをデプロイします。

既存のビーコン設定を更新して、署名付きパートリストをグローバルに定義することはできません。

ビーコン名

ビーコンをクエリする際に使用する名前。

署名付きビーコンの名前は、暗号化されていないフィールドと同じ名前にすることはできません。2 つのビーコンを同じ名前にすることはできません。

分割文字

署名付きビーコンを設定する部分を分離するために使用される文字。

分割文字は、署名付きビーコンの構築元となるフィールドのプレーンテキストの値に出現することはできません。

署名付きの部分のリスト

署名付きビーコンに含まれる署名付きフィールドを識別します。

各部分には、名前、ソース、プレフィックスが含まれている必要があります。ソースは、パートが識別する SIGN_ONLYまたは SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXTフィールドです。ソースは、フィールド名、またはネストされたフィールドの値を参照するインデックスである必要があります。パーツ名がソースを識別する場合、ソースを省略すると、 AWS Database Encryption SDK は自動的にその名前をソースとして使用します。可能な場合は常に、部分名としてソースを指定することをお勧めします。プレフィックスには任意の文字列を指定できますが、一意である必要があります。署名付きビーコン内の 2 つの署名付きの部分に同じプレフィックスを付けることはできません。複合ビーコンによって提供される部分と他の部分を区別する短い値を使用することをお勧めします。

可能な限り、署名付きパートをグローバルに定義することをお勧めします。署名付きパートを 1 つの複合ビーコンでのみ使用する場合は、ローカルで定義することを検討してください。ローカルに定義されたパートは、グローバルに定義されたパートと同じプレフィックスまたは名前を持つことはできません。

Java
List<SignedPart> signedPartList = new ArrayList<>); SignedPart signedPartExample = SignedPart.builder() .name("signedFieldName") .prefix("S-") .build(); signedPartList.add(signedPartExample);
C# / .NET
var signedPartsList = new List<SignedPart> { new SignedPart { Name = "signedFieldName1", Prefix = "S-" }, new SignedPart { Name = "signedFieldName2", Prefix = "SF-" } };
コンストラクタリスト (オプション)

署名付きの部分を署名付きビーコンによってアセンブルするさまざまな方法を定義するコンストラクターを識別します。

コンストラクタリストを指定しない場合、 AWS Database Encryption SDK は次のデフォルトのコンストラクタを使用して署名付きビーコンをアセンブルします。

  • すべての署名付きの部分 (署名付きの部分のリストに追加された順)

  • すべての部分は必須です

コンストラクタ

各コンストラクターは、署名付きビーコンをアセンブルする 1 つの方法を定義するコンストラクター部分の順序付きリストです。コンストラクター部分はリストに追加された順序で結合され、各部分は指定された分割文字で区切られます。

各コンストラクター部分は、署名付きの部分に名前を付け、その部分がコンストラクター内で必須であるか、またはオプションであるかを定義します。例えば、Field1Field1.Field2、および Field1.Field2.Field3 で署名付きビーコンをクエリする場合は、Field2 および Field3 をオプションとしてマークし、コンストラクターを 1 つ作成します。

各コンストラクターには、少なくとも 1 つの必須部分が必要です。クエリで BEGINS_WITH 演算子を使用できるように、各コンストラクターの最初の部分を必須にすることをお勧めします。

コンストラクターは、必要な部分がすべてレコード内に存在する場合に成功します。新しいレコードを書き込む際に、署名付きビーコンはコンストラクターのリストを使用して、指定された値からビーコンをアセンブルできるかどうかを判断します。コンストラクターがコンストラクターのリストに追加された順序でビーコンのアセンブルを試み、成功した最初のコンストラクターを使用します。コンストラクターが成功しない場合、ビーコンはレコードに書き込まれません。

すべてのリーダーとライターは、クエリの結果が確実に正しくなるようにコンストラクターの同じ順序を指定する必要があります。

独自のコンストラクターのリストを指定するには、次の手順を使用します。

  1. 署名付きの部分ごとにコンストラクター部分を作成し、その部分が必須かどうかを定義します。

    コンストラクターの部分の名前は、署名されたフィールドの名前である必要があります。

    次の例は、1 つの署名付きフィールドのコンストラクターの部分を作成する方法を示しています。

    Java
    ConstructorPart field1ConstructorPart = ConstructorPart.builder() .name("Field1") .required(true) .build();
    C# / .NET
    var field1ConstructorPart = new ConstructorPart { Name = "Field1", Required = true };
  2. ステップ 1 で作成したコンストラクター部分を使用して、署名付きビーコンをアセンブルする可能な方法ごとにコンストラクターを作成します。

    例えば、Field1.Field2.Field3Field4.Field2.Field3 をクエリする場合は、2 つのコンストラクターを作成する必要があります。Field1Field4 は、2 つの別個のコンストラクターで定義されているため、両方とも必須にすることができます。

    Java
    // Create a list for Field1.Field2.Field3 queries List<ConstructorPart> field123ConstructorPartList = new ArrayList<>(); field123ConstructorPartList.add(field1ConstructorPart); field123ConstructorPartList.add(field2ConstructorPart); field123ConstructorPartList.add(field3ConstructorPart); Constructor field123Constructor = Constructor.builder() .parts(field123ConstructorPartList) .build(); // Create a list for Field4.Field2.Field1 queries List<ConstructorPart> field421ConstructorPartList = new ArrayList<>(); field421ConstructorPartList.add(field4ConstructorPart); field421ConstructorPartList.add(field2ConstructorPart); field421ConstructorPartList.add(field1ConstructorPart); Constructor field421Constructor = Constructor.builder() .parts(field421ConstructorPartList) .build();
    C# / .NET
    // Create a list for Field1.Field2.Field3 queries var field123ConstructorPartList = new Constructor { Parts = new List<ConstructorPart> { field1ConstructorPart, field2ConstructorPart, field3ConstructorPart } }; // Create a list for Field4.Field2.Field1 queries var field421ConstructorPartList = new Constructor { Parts = new List<ConstructorPart> { field4ConstructorPart, field2ConstructorPart, field1ConstructorPart } };
  3. ステップ 2 で作成したすべてのコンストラクターを含むコンストラクターのリストを作成します。

    Java
    List<Constructor> constructorList = new ArrayList<>(); constructorList.add(field123Constructor) constructorList.add(field421Constructor)
    C# / .NET
    var constructorList = new List<Constructor> { field123Constructor, field421Constructor };
  4. 署名付きビーコンを作成する際に constructorList を指定します。