DynamoDB의 검색 가능한 암호화 - AWS 데이터베이스 암호화 SDK

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

DynamoDB의 검색 가능한 암호화

검색 가능한 암호화를 위해 Amazon DynamoDB 테이블을 구성하려면 AWS KMS 계층 키링을 사용하여 항목을 보호하는 데 사용되는 데이터 키를 생성, 암호화 및 복호화해야 합니다. 또한 테이블 암호화 구성에 SearchConfig를 포함해야 합니다.

참고

DynamoDB용 Java 클라이언트 측 암호화 라이브러리를 사용하는 경우 DynamoDB API용 하위 수준 AWS 데이터베이스 암호화 SDK를 사용하여 테이블 항목을 암호화, 서명, 확인 및 복호화해야 합니다. DynamoDB Enhanced Client와 하위 수준 DynamoDBItemEncryptor은 검색 가능한 암호화를 지원하지 않습니다.

비컨을 사용한 보조 인덱스 구성

비컨를 구성한 후 암호화된 속성을 검색하려면 먼저 각 비컨을 반영하는 보조 인덱스를 구성해야 합니다.

표준 또는 복합 비콘을 구성하면 AWS Database Encryption SDK가 비콘 이름에 aws_dbe_b_ 접두사를 추가하여 서버가 비콘을 쉽게 식별할 수 있도록 합니다. 예를 들어 복합 비컨 compoundBeacon의 이름을 지정하면 실제로는 전체 비컨 이름이 aws_dbe_b_compoundBeacon가 됩니다. 표준 또는 복합 비컨을 포함하는 보조 인덱스를 구성하려면 비컨 이름을 식별할 때 aws_dbe_b_ 접두사를 포함해야 합니다.

파티션 키와 정렬 키

프라이머리 키 값은 암호화할 수 없습니다. 파티션 및 정렬 키에 서명해야 합니다. 프라이머리 키 값은 표준 또는 복합 비컨이 될 수 없습니다.

기본 키 값은 다음과 SIGN_ONLY 같아야 합니다. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 속성을 지정하지 않는 한 파티션 및 정렬 속성도 다음과 같아야 합니다SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT.

프라이머리 키 값은 서명된 비컨일 수 있습니다. 각 프라이머리 키 값에 대해 고유한 서명된 비컨을 구성한 경우 프라이머리 키 값을 서명된 비컨 이름으로 식별하는 속성 이름을 지정해야 합니다. 하지만 AWS 데이터베이스 암호화 SDK는 서명된 비콘에 aws_dbe_b_ 접두사를 추가하지 않습니다. 프라이머리 키 값에 대해 고유한 서명된 비컨를 구성한 경우에도 보조 인덱스를 구성할 때 프라이머리 키 값의 속성 이름만 지정하면 됩니다.

로컬 보조 인덱스

로컬 보조 인덱스의 정렬 키는 비컨일 수 있습니다.

정렬 키에 비컨를 지정하는 경우 유형은 문자열이어야 합니다. 정렬 키에 표준 또는 복합 비컨를 지정하는 경우 비컨 이름을 지정할 때 aws_dbe_b_ 접두사를 포함해야 합니다. 서명된 비컨를 지정하는 경우 접두사 없이 비컨 이름을 지정합니다.

글로벌 보조 인덱스

글로벌 보조 인덱스의 파티션 키와 정렬 키는 모두 비컨일 수 있습니다.

파티션이나 정렬 키에 비컨을 지정하는 경우 유형은 문자열이어야 합니다. 정렬 키에 표준 또는 복합 비컨를 지정하는 경우 비컨 이름을 지정할 때 aws_dbe_b_ 접두사를 포함해야 합니다. 서명된 비컨를 지정하는 경우 접두사 없이 비컨 이름을 지정합니다.

속성 프로젝션

프로젝션은 테이블에서 보조 인덱스로 복사되는 속성 집합입니다. 테이블의 파티션 키와 정렬 키는 항상 인덱스로 프로젝션되지만, 다른 속성을 프로젝션하여 애플리케이션의 쿼리 요건을 지원하는 것도 가능합니다. DynamoDB는 속성 프로젝션을 위한 세 가지 옵션(KEYS_ONLY, INCLUDE, 및 ALL)을 제공합니다.

INCLUDE 속성 프로젝션을 사용하여 비컨을 검색하는 경우 비컨을 구성하는 모든 속성의 이름과 aws_dbe_b_ 접두사를 포함한 비컨 이름을 지정해야 합니다. 예를 들어 field1, field2, 및 field3에서 복합 비콘 compoundBeacon을 구성한 경우 프로젝션에서 aws_dbe_b_compoundBeacon, field1, field2, 및 field3를 지정해야 합니다.

글로벌 보조 인덱스는 프로젝션에 명시적으로 지정된 속성만 사용할 수 있지만 로컬 보조 인덱스는 모든 속성을 사용할 수 있습니다.

비콘 출력 테스트

복합 비콘을 구성하거나 가상 필드를 사용하여 비콘을 구성한 경우 DynamoDB 테이블을 채우기 전에 이러한 비콘이 예상 출력을 생성하는지 확인하는 것이 좋습니다.

AWS 데이터베이스 암호화 SDK는 가상 필드 및 복합 비콘 출력 문제를 해결하는 데 도움이 되는 DynamoDbEncryptionTransforms 서비스를 제공합니다.

다음 스니펫은 테스트 항목을 생성하고, DynamoDB 테이블 암호화 구성으로 DynamoDbEncryptionTransforms 서비스를 정의하고, 가상 필드가 예상 출력을 생성하는지 확인하는 ResolveAttributes 데 사용하는 방법을 보여줍니다.

Java

전체 코드 샘플 (.java) 을 참조하십시오. VirtualBeaconSearchableEncryptionExample

// Create test items final PutItemRequest itemWithHasTestResultPutRequest = PutItemRequest.builder() .tableName(ddbTableName) .item(itemWithHasTestResult) .build(); final PutItemResponse itemWithHasTestResultPutResponse = ddb.putItem(itemWithHasTestResultPutRequest); final PutItemRequest itemWithNoHasTestResultPutRequest = PutItemRequest.builder() .tableName(ddbTableName) .item(itemWithNoHasTestResult) .build(); final PutItemResponse itemWithNoHasTestResultPutResponse = ddb.putItem(itemWithNoHasTestResultPutRequest); // Define the DynamoDbEncryptionTransforms service final DynamoDbEncryptionTransforms trans = DynamoDbEncryptionTransforms.builder() .DynamoDbTablesEncryptionConfig(encryptionConfig).build(); // Verify configuration final ResolveAttributesInput resolveInput = ResolveAttributesInput.builder() .TableName(ddbTableName) .Item(itemWithHasTestResult) .Version(1) .build(); final ResolveAttributesOutput resolveOutput = trans.ResolveAttributes(resolveInput); // Verify that VirtualFields has the expected value Map<String, String> vf = new HashMap<>(); vf.put("stateAndHasTestResult", "CAt"); assert resolveOutput.VirtualFields().equals(vf);
C# / .NET

전체 코드 샘플 참조: .cs VirtualBeaconSearchableEncryptionExample

// Create item with hasTestResult=true var itemWithHasTestResult = new Dictionary<String, AttributeValue> { ["customer_id"] = new AttributeValue("ABC-123"), ["create_time"] = new AttributeValue { N = "1681495205" }, ["state"] = new AttributeValue("CA"), ["hasTestResult"] = new AttributeValue { BOOL = true } }; // Create item with hasTestResult=false var itemWithNoHasTestResult = new Dictionary<String, AttributeValue> { ["customer_id"] = new AttributeValue("DEF-456"), ["create_time"] = new AttributeValue { N = "1681495205" }, ["state"] = new AttributeValue("CA"), ["hasTestResult"] = new AttributeValue { BOOL = false } }; // Define the DynamoDbEncryptionTransforms service var trans = new DynamoDbEncryptionTransforms(encryptionConfig); // Verify configuration var resolveInput = new ResolveAttributesInput { TableName = ddbTableName, Item = itemWithHasTestResult, Version = 1 }; var resolveOutput = trans.ResolveAttributes(resolveInput); // Verify that VirtualFields has the expected value Debug.Assert(resolveOutput.VirtualFields.Count == 1); Debug.Assert(resolveOutput.VirtualFields["stateAndHasTestResult"] == "CAt");

다음 스니펫은 테스트 항목을 생성하고, DynamoDB 테이블 암호화 구성으로 DynamoDbEncryptionTransforms 서비스를 정의하고, 복합 비콘이 예상 출력을 생성하는지 확인하는 ResolveAttributes 데 사용하는 방법을 보여줍니다.

Java

전체 코드 샘플 (.java) 을 참조하십시오. CompoundBeaconSearchableEncryptionExample

// Create an item with both attributes used in the compound beacon. final HashMap<String, AttributeValue> item = new HashMap<>(); item.put("work_id", AttributeValue.builder().s("9ce39272-8068-4efd-a211-cd162ad65d4c").build()); item.put("inspection_date", AttributeValue.builder().s("2023-06-13").build()); item.put("inspector_id_last4", AttributeValue.builder().s("5678").build()); item.put("unit", AttributeValue.builder().s("011899988199").build()); // Define the DynamoDbEncryptionTransforms service final DynamoDbEncryptionTransforms trans = DynamoDbEncryptionTransforms.builder() .DynamoDbTablesEncryptionConfig(encryptionConfig).build(); // Verify configuration final ResolveAttributesInput resolveInput = ResolveAttributesInput.builder() .TableName(ddbTableName) .Item(item) .Version(1) .build(); final ResolveAttributesOutput resolveOutput = trans.ResolveAttributes(resolveInput); // Verify that CompoundBeacons has the expected value Map<String, String> cbs = new HashMap<>(); cbs.put("last4UnitCompound", "L-5678.U-011899988199"); assert resolveOutput.CompoundBeacons().equals(cbs); // Note : the compound beacon actually stored in the table is not "L-5678.U-011899988199" // but rather something like "L-abc.U-123", as both parts are EncryptedParts // and therefore the text is replaced by the associated beacon
C# / .NET

전체 코드 샘플 참조: .cs CompoundBeaconSearchableEncryptionExample

// Create an item with both attributes used in the compound beacon var item = new Dictionary<String, AttributeValue> { ["work_id"] = new AttributeValue("9ce39272-8068-4efd-a211-cd162ad65d4c"), ["inspection_date"] = new AttributeValue("2023-06-13"), ["inspector_id_last4"] = new AttributeValue("5678"), ["unit"] = new AttributeValue("011899988199") }; // Define the DynamoDbEncryptionTransforms service var trans = new DynamoDbEncryptionTransforms(encryptionConfig); // Verify configuration var resolveInput = new ResolveAttributesInput { TableName = ddbTableName, Item = item, Version = 1 }; var resolveOutput = trans.ResolveAttributes(resolveInput); // Verify that CompoundBeacons has the expected value Debug.Assert(resolveOutput.CompoundBeacons.Count == 1); Debug.Assert(resolveOutput.CompoundBeacons["last4UnitCompound"] == "L-5678.U-011899988199"); // Note : the compound beacon actually stored in the table is not "L-5678.U-011899988199" // but rather something like "L-abc.U-123", as both parts are EncryptedParts // and therefore the text is replaced by the associated beacon