DynamoDB용 데이터베이스 암호화를 사용하도록 기존 DynamoDB 테이블을 구성합니다 AWS . SDK - AWS 데이터베이스 암호화 SDK

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

DynamoDB용 데이터베이스 암호화를 사용하도록 기존 DynamoDB 테이블을 구성합니다 AWS . SDK

클라이언트 측 암호화 라이브러리는 데이터베이스 암호화로 이름이 변경되었습니다. AWS SDK 이 개발자 안내서는 여전히 DynamoDB Encryption Client에 대한 정보를 제공합니다.

버전 3.x를 포함하여 DynamoDB용 Java 클라이언트측 암호화 라이브러리 중 하나를 사용하면 기존 Amazon DynamoDB 테이블을 클라이언트측 암호화를구성할 수 있습니다. 이 주제에서는 채워진 기존 DynamoDB 테이블에 버전 3.x를 추가하기 위해 수행해야 하는 세 가지 단계에 대한 지침을 제공합니다.

사전 조건

DynamoDB용 Java 클라이언트측 암호화 라이브러리 버전 3.x에는 AWS SDK for Java 2.x 에서 제공하는 DynamoDB Enhanced Client가 필요합니다. D를 ynamoDBMapper 계속 사용하는 경우 DynamoDB 확장 AWS SDK for Java 2.x 클라이언트를 사용하도록 마이그레이션해야 합니다.

AWS SDK for Java의 버전 1.x에서 2.x로 마이그레이션하기 지침을 따르세요.

그런 다음 지침에 따라 DynamoDB 향상된 클라이언트 사용을 시작하십시오. API

DynamoDB용 Java 클라이언트측 암호화 라이브러리를 사용하도록 테이블을 구성하기 전에 TableSchema 주석이 달린 데이터 클래스를 사용을 생성하고 고급 클라이언트를 생성해야 합니다.

1단계: 암호화된 항목 읽기 및 쓰기 준비

AWS 데이터베이스 암호화 SDK 클라이언트가 암호화된 항목을 읽고 쓸 수 있도록 준비하려면 다음 단계를 완료하십시오. 다음 변경사항을 배포한 후에도 클라이언트는 계속해서 일반 텍스트 항목을 읽고 씁니다. 테이블에 기록된 새 항목을 암호화하거나 서명하지는 않지만 암호화된 항목이 나타나는 즉시 복호화할 수 있습니다. 이러한 변경으로 인해 클라이언트는 새 항목의 암호화를 시작할 수 있습니다. 다음 단계로 진행하기 전에 각 리더에 다음 변경 내용을 배포해야 합니다.

1. 속성 작업 정의

암호화 및 서명할 속성 값, 서명만 가능한 속성 값, 무시할 속성 값을 정의하는 속성 작업을 포함하도록 주석이 달린 데이터 클래스를 업데이트합니다.

DynamoDB 향상된 클라이언트 주석에 GitHub 대한 자세한 aws-database-encryption-sdk 지침은 -dynamodb SimpleClass리포지토리의.java를 참조하십시오.

기본적으로 프라이머리 키 속성은 서명되지만 암호화되지는 않으며(SIGN_ONLY) 다른 모든 속성은 암호화되고 서명됩니다(ENCRYPT_AND_SIGN). 예외를 지정하려면 DynamoDB용 Java 클라이언트측 암호화 라이브러리에 정의된 암호화 주석을 사용합니다. 예를 들어, 특정 속성에 서명되도록 하려면 @DynamoDbEncryptionSignOnly 주석만 사용합니다. 특정 속성을 서명하여 암호화 컨텍스트에 포함시키려면 주석을 사용하십시오. @DynamoDbEncryptionSignAndIncludeInEncryptionContext 특정 속성에 서명되거나 암호화되지 않도록 하려면(DO_NOTHING) @DynamoDbEncryptionDoNothing 주석을 사용합니다.

참고

SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT속성을 지정하는 경우 파티션 및 정렬 속성도 지정해야 합니다. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 정의하는 데 사용된 주석을 보여주는 예제는 SimpleClass4.java SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 를 참조하십시오.

주석의 예제는 주석이 달린 데이터 클래스 사용 섹션을 참조하세요.

2. 서명에서 제외할 속성을 정의합니다.

다음 예제에서는 모든 DO_NOTHING 속성이 고유한 접두사 ":“를 공유한다고 가정하고 이 접두사를 사용하여 허용된 서명되지 않은 속성을 정의합니다. 클라이언트는 접두사가 ":"인 모든 속성 이름은 서명에서 제외된 것으로 간주합니다. 자세한 내용은 Allowed unsigned attributes 단원을 참조하십시오.

final String unsignedAttrPrefix = ":";
3. 키링 생성

다음 예제에서는 AWS KMS 키링을 생성합니다. AWS KMS 키링은 대칭 암호화 또는 RSA AWS KMS keys 비대칭을 사용하여 데이터 키를 생성, 암호화 및 복호화합니다.

이 예제에서는 대칭 암호화 키를 사용하여 CreateMrkMultiKeyring 키링을 생성하는 AWS KMS 데 사용합니다. KMS 이 CreateAwsKmsMrkMultiKeyring 방법을 사용하면 키링이 단일 리전 키와 다중 리전 키를 모두 올바르게 처리할 수 있습니다.

final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsMrkMultiKeyringInput keyringInput = CreateAwsKmsMrkMultiKeyringInput.builder() .generator(kmsKeyId) .build(); final IKeyring kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
4. DynamoDB 테이블 암호화 구성 정의

다음 예제는 이 DynamoDB 테이블의 암호화 구성을 나타내는 tableConfigs 맵을 정의합니다.

이 예제에서는 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정합니다. 암호화 구성을 처음 정의할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정하는 것이 좋습니다. 자세한 내용은 SDKDynamoDB용 AWS 데이터베이스 암호화의 암호화 구성 단원을 참조하십시오.

FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT을 일반 텍스트 오버라이드로 지정해야 합니다. 이 정책은 계속해서 일반 텍스트 항목을 읽고 쓰고, 암호화된 항목을 읽고, 클라이언트가 암호화된 항목을 쓸 수 있도록 준비시킵니다.

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .plaintextOverride(PlaintextOverride.FORCE_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);
5. DynamoDbEncryptionInterceptor 생성

다음 예제는 3단계tableConfigs를 사용하여 DynamoDbEncryptionInterceptor을 생성합니다.

DynamoDbEncryptionInterceptor interceptor = DynamoDbEncryptionInterceptor.builder() .config(DynamoDbTablesEncryptionConfig.builder() .tableEncryptionConfigs(tableConfigs) .build()) .build();

2단계: 암호화되고 서명된 항목 쓰기

DynamoDbEncryptionInterceptor 구성의 일반 텍스트 정책을 업데이트하여 클라이언트가 암호화되고 서명된 항목을 쓸 수 있도록 허용합니다. 다음 변경 사항을 배포하면 클라이언트는 1단계에서 구성한 속성 작업을 기반으로 새 항목을 암호화하고 서명합니다. 클라이언트는 일반 텍스트 항목과 암호화되고 서명된 항목을 읽을 수 있습니다.

3단계로 진행하기 전에 테이블의 기존 일반 텍스트 항목을 모두 암호화하고 서명해야 합니다. 기존 일반 텍스트 항목을 빠르게 암호화하기 위해 실행할 수 있는 단일 지표나 쿼리는 없습니다. 시스템에 가장 적합한 프로세스를 사용하세요. 예를 들어, 테이블을 천천히 스캔한 다음 정의한 속성 작업 및 암호화 구성을 사용하여 항목을 다시 쓰는 비동기 프로세스를 사용할 수 있습니다. 테이블의 일반 텍스트 항목을 식별하려면 AWS 데이터베이스 암호화가 항목을 암호화하고 서명할 때 SDK 추가한 aws_dbe_headaws_dbe_foot 속성을 포함하지 않는 모든 항목을 스캔하는 것이 좋습니다.

다음 예제는 1단계의 테이블 암호화 구성을 업데이트합니다. 일반 텍스트 오버라이드를 FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT로 업데이트해야 합니다. 이 정책은 일반 텍스트 항목을 계속 읽지만 암호화된 항목을 읽고 쓸 수도 있습니다. 업데이트된 파일을 DynamoDbEncryptionInterceptor 사용하여 새 항목을 생성합니다tableConfigs.

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_ALLOW_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);

3단계: 암호화되고 서명된 항목만 읽기

모든 항목을 암호화하고 서명한 후에는 DynamoDbEncryptionInterceptor 구성의 일반 텍스트 재정의를 업데이트하여 클라이언트가 암호화되고 서명된 항목만 읽고 쓸 수 있도록 합니다. 다음 변경 사항을 배포하면 클라이언트는 1단계에서 구성한 속성 작업을 기반으로 새 항목을 암호화하고 서명합니다. 클라이언트는 암호화되고 서명된 항목만 읽을 수 있습니다.

다음 예제는 2단계의 테이블 암호화 구성을 업데이트합니다. FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT으로 일반 텍스트 재정의를 업데이트하거나 구성에서 일반 텍스트 정책을 제거할 수 있습니다. 클라이언트는 기본적으로 암호화되고 서명된 항목만 읽고 씁니다. 업데이트된 파일을 DynamoDbEncryptionInterceptor 사용하여 새 항목을 생성합니다tableConfigs.

final Map<String, DynamoDbTableEncryptionConfig> tableConfigs = new HashMap<>(); final DynamoDbTableEncryptionConfig config = DynamoDbTableEncryptionConfig.builder() .logicalTableName(ddbTableName) .partitionKeyName("partition_key") .sortKeyName("sort_key") .schemaOnEncrypt(tableSchema) .keyring(kmsKeyring) .allowedUnsignedAttributePrefix(unsignedAttrPrefix) // Optional: you can also remove the plaintext policy from your configuration .plaintextOverride(PlaintextOverride.FORBID_WRITE_PLAINTEXT_FORBID_READ_PLAINTEXT) .build(); tableConfigs.put(ddbTableName, config);