데이터 모델 변경 - AWS 데이터베이스 암호화 SDK

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

데이터 모델 변경

참고

클라이언트측 암호화 라이브러리의 이름이 AWS Database Encryption SDK로 변경되었습니다. 다음 주제에서는 Java용 DynamoDB Encryption Client 버전 1.x~2.x 와 Python용 DynamoDB Encryption Client 버전 1.x~3.x에 대한 정보를 제공합니다. 자세한 내용은 AWS Database Encryption SDK for DynamoDB 버전 지원을 참조하세요.

항목을 암호화하거나 복호화할 때마다 암호화하고 서명할 속성, 서명할 속성(암호화하지 않음), 무시할 속성을 DynamoDB Encryption Client에 알려주는 속성 작업을 제공해야 합니다. 속성 작업은 암호화된 항목에 저장되지 않으며 DynamoDB Encryption Client는 속성 작업을 자동으로 업데이트하지 않습니다.

중요

DynamoDB Encryption Client는 암호화되지 않은 기존 DynamoDB 테이블 데이터의 암호화를 지원하지 않습니다.

데이터 모델을 변경할 때마다, 즉 테이블 항목에서 속성을 추가하거나 제거할 때 오류가 발생할 수 있습니다. 지정한 속성 작업이 항목의 모든 속성을 고려하지 않는 경우 항목이 의도한 방식으로 암호화되고 서명되지 않을 수 있습니다. 특히, 항목 복호화 시 제공하는 속성 작업과 항목 암호화 시 제공했던 속성 작업이 다른 경우 서명 확인이 실패할 수 있습니다.

예를 들어, 항목을 암호화하는 데 사용된 속성 동작에서 test 속성에 서명하도록 지정하는 경우 항목의 서명에는 test 속성이 포함됩니다. 그러나 항목을 복호화하는 데 사용된 속성 작업이 test 속성을 고려하지 않는 경우 클라이언트가 test 속성을 포함하지 않는 서명을 확인하려고 하기 때문에 확인이 실패합니다.

이는 DynamoDB Encryption Client가 모든 애플리케이션의 항목에 대해 동일한 서명을 계산해야 하기 때문에 여러 애플리케이션이 동일한 DynamoDB 항목을 읽고 쓸 때 특히 문제가 됩니다. 또한 속성 작업의 변경 사항이 모든 호스트에 전파되어야 하기 때문에 분산 애플리케이션에서도 문제가 됩니다. 한 프로세스에서 한 호스트가 DynamoDB 테이블에 액세스하는 경우에도 모범 사례 프로세스를 설정하면 프로젝트가 더욱 복잡해지더라도 오류를 방지하는 데 도움이 됩니다.

테이블 항목을 읽을 수 없도록 하는 서명 유효성 검사 오류를 방지하려면 다음 지침을 따르십시오.

  • 속성 추가 - 새 속성이 속성 작업을 변경하는 경우 항목에 새 속성을 포함하기 전에 속성 작업 변경을 완전히 배포합니다.

  • 속성 제거 - 항목에서 속성 사용을 중지하는 경우 속성 작업을 변경하지 마십시오.

  • 작업 변경 - 속성 작업 구성을 사용하여 테이블 항목을 암호화한 후에는 테이블의 모든 항목을 다시 암호화하지 않고는 기존 속성에 대한 기본 작업이나 작업을 안전하게 변경할 수 없습니다.

서명 유효성 검사 오류는 해결하기가 매우 어려울 수 있으므로 가장 좋은 방법은 오류를 방지하는 것입니다.

속성 추가

테이블 항목에 새 속성을 추가할 때 속성 작업을 변경해야 할 수 있습니다. 서명 유효성 검사 오류를 방지하려면 2단계 프로세스로 이 변경을 구현하는 것이 좋습니다. 첫 번째 단계가 완료되었는지 확인한 후 두 번째 단계를 시작합니다.

  1. 테이블을 읽거나 쓰는 모든 애플리케이션에서 속성 작업을 변경합니다. 이러한 변경 사항을 배포하고 업데이트가 모든 대상 호스트에 전파되었는지 확인합니다.

  2. 테이블 항목의 새 속성에 값을 씁니다.

이 2단계 접근 방식은 모든 애플리케이션과 호스트에 동일한 속성 작업이 있도록 하며, 새 속성이 발생하기 전에 동일한 서명을 계산합니다. 일부 암호화의 기본값은 암호화 및 서명이기 때문에 속성에 대한 작업이 아무 작업 안 함(암호화 또는 서명 안 함)인 경우에도 중요합니다.

다음 예제에서는 이 프로세스의 첫 번째 단계에 대한 코드를 보여 줍니다. 다른 테이블 항목에 대한 링크를 저장하는 새 항목 속성인 link를 추가합니다. 이 링크는 일반 텍스트로 유지되어야 하므로 이 예제에서는 서명 전용 작업을 할당합니다. 이 변경 사항을 완전히 배포한 다음 모든 애플리케이션과 호스트에 새 속성 작업이 있는지 확인한 후 테이블 항목에서 link 속성을 사용할 수 있습니다.

Java DynamoDB Mapper

DynamoDB MapperAttributeEncryptor를 사용하는 경우 기본적으로 기본 키(서명되지만 암호화되지 않음)를 제외하고는 모든 속성이 암호화 및 서명됩니다. 서명 전용 작업을 지정하려면 @DoNotEncrypt 주석을 사용합니다.

이 예제에서는 새 link 속성에 대한 @DoNotEncrypt 주석을 사용합니다.

@DynamoDBTable(tableName = "ExampleTable") public static final class DataPoJo { private String partitionAttribute; private int sortAttribute; private String link; @DynamoDBHashKey(attributeName = "partition_attribute") public String getPartitionAttribute() { return partitionAttribute; } public void setPartitionAttribute(String partitionAttribute) { this.partitionAttribute = partitionAttribute; } @DynamoDBRangeKey(attributeName = "sort_attribute") public int getSortAttribute() { return sortAttribute; } public void setSortAttribute(int sortAttribute) { this.sortAttribute = sortAttribute; } @DynamoDBAttribute(attributeName = "link") @DoNotEncrypt public String getLink() { return link; } public void setLink(String link) { this.link = link; } @Override public String toString() { return "DataPoJo [partitionAttribute=" + partitionAttribute + ", sortAttribute=" + sortAttribute + ", link=" + link + "]"; } }
Java DynamoDB encryptor

하위 수준 DynamoDB 암호화 도구에서 각 속성에 대한 작업을 설정해야 합니다. 이 예제에서는 기본값이 encryptAndSign인 switch 문을 사용하며, 파티션 키, 정렬 키 및 새 link 속성에 대해서는 예외가 지정됩니다. 이 예제에서 링크 속성 코드가 사용되기 전에 완전히 배포되지 않은 경우 링크 속성은 일부 애플리케이션에서 암호화되고 서명되지만 다른 애플리케이션에서는 서명만 됩니다.

for (final String attributeName : record.keySet()) { switch (attributeName) { case partitionKeyName: // fall through to the next case case sortKeyName: // partition and sort keys must be signed, but not encrypted actions.put(attributeName, signOnly); break; case "link": // only signed actions.put(attributeName, signOnly); break; default: // Encrypt and sign all other attributes actions.put(attributeName, encryptAndSign); break; } }
Python

DynamoDB Encryption Client for Python에서는 모든 속성에 대한 기본 작업을 지정한 다음 예외를 지정할 수 있습니다.

Python 클라이언트 헬퍼 클래스를 사용하는 경우 기본 키 속성에 대한 속성 작업을 지정할 필요가 없습니다. 클라이언트 헬퍼 클래스는 프라이머리 키를 암호화하는 것을 방지합니다. 그러나 클라이언트 도우미 클래스를 사용하지 않는 경우 파티션 키 및 정렬 키에 대해 SIGN_ONLY 작업을 설정해야 합니다. 실수로 파티션 또는 정렬 키를 암호화한 경우 전체 테이블 스캔 없이는 데이터를 복구할 수 없습니다.

이 예제에서는 SIGN_ONLY 작업을 가져오는 새 link 속성에 대한 예외를 지정합니다.

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={ 'example': CryptoAction.DO_NOTHING, 'link': CryptoAction.SIGN_ONLY } )

속성 제거

DynamoDB Encryption Client로 암호화된 항목에 더 이상 속성이 필요하지 않은 경우 속성 사용을 중지할 수 있습니다. 그러나 해당 속성에 대한 작업을 삭제하거나 변경하지 마십시오. 그런 경우 해당 속성을 가진 항목이 발견되면 해당 항목에 대해 계산된 서명이 원래 서명과 일치하지 않으므로 서명 유효성 검사가 실패합니다.

코드에서 속성의 모든 추적을 제거하고 싶을 수도 있지만 항목을 삭제하는 대신 더 이상 사용되지 않는다는 설명을 추가합니다. 전체 테이블 스캔을 수행하여 속성의 모든 인스턴스를 삭제하더라도 해당 속성을 가진 암호화된 항목이 캐싱되거나 구성 어딘가에서 처리 중일 수 있습니다.