

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

# マルチテナンシーデータベースの検索可能な暗号化
<a name="searchable-encryption-multitenant"></a>


****  

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

データベースで検索可能な暗号化を実装するには、[AWS KMS 階層キーリング](use-hierarchical-keyring.md)を使用する必要があります。 AWS KMS 階層キーリングは、レコードの保護に使用されるデータキーを生成、暗号化、復号します。また、ビーコンを生成するために使用されるビーコンキーも作成します。マルチテナントデータベースで AWS KMS 階層キーリングを使用する場合、テナントごとに個別のブランチキーとビーコンキーがあります。マルチテナンシーデータベース内の暗号化されたデータをクエリするには、クエリしているビーコンを生成するために使用されたビーコンキーマテリアルを特定する必要があります。詳細については、「[検索可能な暗号化のための階層キーリングの使用](use-hierarchical-keyring.md#searchable-encryption-hierarchical-keyrings)」を参照してください。

マルチテナンシーデータベースの[ビーコンバージョン](using-beacons.md#beacon-version)を定義する場合は、設定したすべての標準ビーコンのリスト、設定したすべての複合ビーコンのリスト、ビーコンバージョン、および `keySource` を指定します。[ビーコンキーソースを `MultiKeyStore` として定義](use-hierarchical-keyring.md#beacon-key-source)し、`keyFieldName`、ローカルビーコンキーキャッシュのキャッシュ Time To Live、およびローカルビーコンキーキャッシュの最大キャッシュサイズを含める必要があります。

[署名付きビーコン](configure.md#signed-beacons)を設定した場合は、それらを `compoundBeaconList` に含める必要があります。署名付きビーコンは、 `SIGN_ONLY`フィールドと `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`フィールドに対してインデックスを作成し、複雑なクエリを実行する複合ビーコンの一種です。

------
#### [ Java ]

```
List<BeaconVersion> beaconVersions = new ArrayList<>();
    beaconVersions.add(
        BeaconVersion.builder()
                .standardBeacons(standardBeaconList)
                .compoundBeacons(compoundBeaconList)
                .version(1) // MUST be 1
                .keyStore(branchKeyStoreName)
                .keySource(BeaconKeySource.builder()
                        .multi(MultiKeyStore.builder()
                                .keyFieldName(keyField)
                                .cacheTTL(6000)
                                .maxCacheSize(10)
                        .build())
                .build())
        .build()
    );
```

------
#### [ C\$1 / .NET ]

```
var beaconVersions = new List<BeaconVersion>
{
    new BeaconVersion
    {
        StandardBeacons = standardBeaconList,
        CompoundBeacons = compoundBeaconList,
        EncryptedParts = encryptedPartsList,
        SignedParts = signedPartsList,
        Version = 1, // MUST be 1
        KeyStore = branchKeyStoreName,
        KeySource = new BeaconKeySource
        {
            Multi = new MultiKeyStore
            {
                KeyId = branch-key-id,
                CacheTTL = 6000,
                MaxCacheSize = 10
            }
        }
    }
};
```

------
#### [ Rust ]

```
let beacon_version = BeaconVersion::builder()
    .standard_beacons(standard_beacon_list)
    .compound_beacons(compound_beacon_list)
    .version(1) // MUST be 1
    .key_store(key_store.clone())
    .key_source(BeaconKeySource::Multi(
        MultiKeyStore::builder()
            // `keyId` references a beacon key.
            // For every branch key we create in the keystore,
            // we also create a beacon key.
            // This beacon key is not the same as the branch key,
            // but is created with the same ID as the branch key.
            .key_id(branch_key_id)
            .cache_ttl(6000)
            .max_cache_size(10)
            .build()?,
    ))
    .build()?;
let beacon_versions = vec![beacon_version];
```

------

**keyFieldName**  
[`keyFieldName`](use-hierarchical-keyring.md#keyFieldName) は、特定のテナンシーについて生成されたビーコンに使用されるビーコンキーに関連付けられた `branch-key-id` を格納するフィールドの名前を定義します。  
新しいレコードをデータベースに書き込むと、そのレコードについてのビーコンを生成するために使用されるビーコンキーを識別する `branch-key-id` がこのフィールドに格納されます。  
デフォルトでは、`keyField` はデータベースに明示的に格納されない概念的なフィールドです。 AWS Database Encryption SDK は、[マテリアルの説明](concepts.md#material-description)で暗号化された[データキー](concepts.md#data-key)`branch-key-id`から を識別し、複合ビーコンと[署名](configure.md#signed-beacons)付きビーコンで参照`keyField`できるように概念に値を保存します。マテリアルの説明は署名されているため、概念的な `keyField` は署名付きの部分とみなされます。  
暗号化アクション`keyField`に を `SIGN_ONLY`または `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`フィールドとして含めて、 フィールドをデータベースに明示的に保存することもできます。これを実行するには、データベースにレコードを書き込むたびに、`branch-key-id` を手動で `keyField` に含める必要があります。

## マルチテナンシーデータベース内のビーコンのクエリ
<a name="query-multitenant-beacons"></a>

ビーコンをクエリするには、クエリに `keyField` を含めて、ビーコンの再計算に必要となる適切なビーコンキーマテリアルを識別する必要があります。レコードのビーコンを生成するために使用されるビーコンキーに関連付けられた `branch-key-id` を指定する必要があります。ブランチキー ID サプライヤーのテナンシーの `branch-key-id` を識別する[フレンドリ名](use-hierarchical-keyring.md#branch-key-id-supplier)を指定することはできません。次の方法でクエリに `keyField` を含めることができます。

**複合ビーコン**  
`keyField` をレコードに明示的に格納するかどうかにかかわらず、複合ビーコンに署名付きの部分として `keyField` を直接含めることができます。`keyField` の署名付きの部分は必須である必要があります。  
例えば、`encryptedField` および `signedField` の 2 つのフィールドから複合ビーコン `compoundBeacon` を構築する場合は、署名付きの部分として `keyField` も含める必要があります。これにより、`compoundBeacon` に対して次のクエリを実行できるようになります。  

```
compoundBeacon = E_encryptedFieldValue.S_signedFieldValue.K_branch-key-id
```

**署名付きビーコン**  
 AWS Database Encryption SDK は、標準ビーコンと複合ビーコンを使用して、検索可能な暗号化ソリューションを提供します。これらのビーコンには、少なくとも 1 つの暗号化されたフィールドが含まれている必要があります。ただし、 AWS Database Encryption SDK は、プレーンテキスト`SIGN_ONLY`と`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`フィールドから完全に設定できる[署名付きビーコン](configure.md#signed-beacons)もサポートしています。  
署名付きビーコンは単一の部分から構築できます。`keyField` をレコードに明示的に格納するかどうかにかかわらず、`keyField` から署名付きビーコンを構築し、それを使用して、`keyField` 署名付きビーコンに対するクエリと、他のビーコンの 1 つに対するクエリを組み合わせる複合クエリを作成できます。例えば、次のクエリを実行できます。  

```
keyField = K_branch-key-id AND compoundBeacon = E_encryptedFieldValue.S_signedFieldValue
```
署名付きビーコンの設定については、「[署名付きビーコンの作成](configure.md#signed-beacons)」を参照してください

**`keyField` に対する直接的なクエリの実行**  
暗号化アクションで `keyField` を指定し、そのフィールドをレコードに明示的に格納した場合は、ビーコンに対するクエリと、`keyField` に対するクエリを組み合わせた複合クエリを作成できます。標準ビーコンをクエリする場合は、`keyField` に対して直接クエリを実行することを選択できます。例えば、次のクエリを実行できます。  

```
keyField = branch-key-id AND standardBeacon = S_standardBeaconValue
```