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

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

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

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

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

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

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

ラッピングキーの選択

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

ただし、各データキーを暗号化するには、1 つ以上のラッピングキーを選択する必要があります。 AWS Database Encryption はAWS Key Management Service、 (AWS KMS) 対称暗号化KMSキーと非対称RSAKMSキーSDKをサポートしています。また、異なるサイズで提供する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) を指定できます。非対称RSAKMSキーを使用する場合は、キー を指定する必要がありますARN。

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

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

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

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

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 };

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

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

完全なコードサンプル : .BeaconConfigcs を参照してください。

署名付きビーコンの設定

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

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 のバージョン 3.2 以降を使用する必要がありますSDK。新しいパートをグローバルに定義する前に、すべてのリーダーに新しいバージョンをデプロイします。

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

ビーコン名

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

署名付きビーコンの名前は、暗号化されていないフィールドと同じ名前にすることはできません。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 を指定します。