DynamoDB Encryption Client for Python의 예제 코드 - AWS 데이터베이스 암호화 SDK

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

DynamoDB Encryption Client for Python의 예제 코드

참고

클라이언트 측 암호화 라이브러리의 이름이 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 for Python를 사용하여 애플리케이션에서 DynamoDB 데이터를 보호하는 방법을 보여줍니다. GitHub에 있는 aws-dynamodb-encryption-python 리포지토리의 예제 디렉터리에서 더 많은 예제를 찾고 직접 기여할 수 있습니다.

EncryptedTable 클라이언트 헬퍼 클래스 사용

다음 예제에서는 Direct KMS ProviderEncryptedTable 클라이언트 헬퍼 클래스와 함께 사용하는 방법을 보여줍니다. 이 예제에서는 다음 항목 암호화 도구 사용 예제와 동일한 암호화 자료 공급자를 사용합니다. 그러나 하위 수준 항목 암호화 도구와 직접 상호 작용하는 대신 EncryptedTable 클래스를 사용합니다.

이러한 예제를 비교하면 클라이언트 도우미 클래스가 수행하는 작업을 확인할 수 있습니다. 여기에는 DynamoDB 암호화 컨텍스트를 생성하거나 프라이머리 키 속성을 항상 서명하되 절대로 암호화되지 않은 상태로 유지하는 등의 작업이 포함됩니다. 암호화 컨텍스트를 만들고 프라이머리 키를 검색하기 위해 클라이언트 헬퍼 클래스는 DynamoDB DescribeTable 작업을 호출합니다. 이 코드를 실행하려면 이 작업을 호출할 수 있는 권한이 있어야 합니다.

전체 코드 샘플 보기: aws_kms_encrypted_table.py

1단계: 테이블 만들기

테이블 이름을 사용하여 표준 DynamoDB 테이블의 인스턴스를 생성하는 것부터 시작합니다.

table_name='test-table' table = boto3.resource('dynamodb').Table(table_name)
2단계: 암호화 자료 공급자 생성

선택한 암호화 자료 공급자(CMP)의 인스턴스를 생성합니다.

이 예제에서는 Direct KMS Provider를 사용하지만, 사용자는 모든 호환되는 CMP를 사용할 수 있습니다. Direct KMS Provider를 생성하려면 AWS KMS key를 지정합니다. 이 예제에서는AWS KMS key의 Amazon 리소스 이름(ARN)을 사용하지만 유효한 키 식별자를 사용할 수 있습니다.

kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
3단계: 속성 작업 객체 생성

속성 작업은 항목의 각 속성에 대해 수행할 작업을 항목 암호화 도구에 알려줍니다. 이 예제의 AttributeActions 객체는 무시되는 test 속성을 제외한 모든 항목을 암호화하고 서명합니다.

클라이언트 도우미 클래스를 사용할 때 프라이머리 키 속성에 대한 속성 작업을 지정하지 않습니다. EncryptedTable 클래스는 프라이머리 키 속성을 서명하지만 암호화하지는 않습니다.

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} )
4단계: 암호화된 테이블 생성

표준 테이블, Direct KMS Provider 및 속성 작업을 사용하여 암호화된 테이블을 생성합니다. 이 단계로 구성이 완료됩니다.

encrypted_table = EncryptedTable( table=table, materials_provider=kms_cmp, attribute_actions=actions )
5단계: 테이블에 일반 텍스트 항목 넣기

encrypted_table에 대한 put_item 방법을 호출하면 테이블 항목이 투명하게 암호화되고 서명되어 DynamoDB 테이블에 추가됩니다.

먼저 테이블 항목을 정의합니다.

plaintext_item = { 'partition_attribute': 'value1', 'sort_attribute': 55 'example': 'data', 'numbers': 99, 'binary': Binary(b'\x00\x01\x02'), 'test': 'test-value' }

그런 다음 테이블에 넣습니다.

encrypted_table.put_item(Item=plaintext_item)

암호화된 형식으로 DynamoDB 테이블에서 항목을 가져오려면 table 객체에 대한 get_item 방법을 호출합니다. 복호화된 항목을 얻으려면 encrypted_table 객체에 대한 get_item 메서드를 호출합니다.

항목 암호화 도구 사용

이 예제에서는 테이블 항목을 암호화할 때 항목 암호화 도구와 상호 작용하는 클라이언트 헬퍼 클래스를 사용하는 대신 DynamoDB Encryption Client의 항목 암호화 도구와 직접 상호 작용하는 방법을 보여줍니다.

이 기술을 사용하면 DynamoDB 암호화 컨텍스트와 구성 객체(CryptoConfig)를 수동으로 생성합니다. 또한 한 번의 호출로 항목을 암호화하고 별도의 호출로 DynamoDB 테이블에 넣습니다. 이를 통해 put_item 호출을 사용자 지정하고 DynamoDB Encryption Client를 사용하여 DynamoDB로 전송되지 않는 구조화된 데이터를 암호화하고 서명할 수 있습니다.

이 예제에서는 Direct KMS Provider를 사용하지만, 사용자는 모든 호환되는 CMP를 사용할 수 있습니다.

전체 코드 샘플 보기: aws_kms_encrypted_item.py

1단계: 테이블 만들기

테이블 이름을 사용하여 표준 DynamoDB 테이블 리소스의 인스턴스를 생성하는 것부터 시작합니다.

table_name='test-table' table = boto3.resource('dynamodb').Table(table_name)
2단계: 암호화 자료 공급자 생성

선택한 암호화 자료 공급자(CMP)의 인스턴스를 생성합니다.

이 예제에서는 Direct KMS Provider를 사용하지만, 사용자는 모든 호환되는 CMP를 사용할 수 있습니다. Direct KMS Provider를 생성하려면 AWS KMS key를 지정합니다. 이 예제에서는AWS KMS key의 Amazon 리소스 이름(ARN)을 사용하지만 유효한 키 식별자를 사용할 수 있습니다.

kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key_id)
3단계: TableInfo 헬퍼 클래스 사용

DynamoDB에서 테이블에 대한 정보를 얻으려면 TableInfo 헬퍼 클래스의 인스턴스를 생성합니다. 항목 암호화 도구로 직접 작업하는 경우 TableInfo 인스턴스를 생성하고 해당 메서드를 호출해야 합니다. 클라이언트 헬퍼 클래스가 사용자를 대신하여 이 작업을 수행합니다.

TableInforefresh_indexed_attributes 메소드는 DescribeTable DynamoDB 작업을 사용하여 테이블에 대한 정확한 정보를 실시간으로 가져옵니다. 여기에는 프라이머리 키와 로컬 및 글로벌 보조 인덱스가 포함됩니다. 호출자에게 DescribeTable을 호출할 수 있는 권한이 있어야 합니다.

table_info = TableInfo(name=table_name) table_info.refresh_indexed_attributes(table.meta.client)
4단계: DynamoDB 암호화 컨텍스트 생성

DynamoDB 암호화 컨텍스트에는 테이블 구조와 암호화 및 서명 방법에 대한 정보가 포함되어 있습니다. 이 예제에서는 항목 암호화 도구와 상호 작용하므로 DynamoDB 암호화 컨텍스트를 명시적으로 생성합니다. 클라이언트 헬퍼 클래스는 DynamoDB 암호화 컨텍스트를 생성합니다.

TableInfo 헬퍼 클래스의 속성을 사용하여 파티션 키와 정렬 키를 가져올 수 있습니다.

index_key = { 'partition_attribute': 'value1', 'sort_attribute': 55 } encryption_context = EncryptionContext( table_name=table_name, partition_key_name=table_info.primary_index.partition, sort_key_name=table_info.primary_index.sort, attributes=dict_to_ddb(index_key) )
5단계: 속성 작업 객체 생성

속성 작업은 항목의 각 속성에 대해 수행할 작업을 항목 암호화 도구에 알려줍니다. 이 예제의 AttributeActions 객체는 서명되었지만 암호화되지 않은 프라이머리 키 속성과 무시되는 test 속성을 제외한 모든 항목을 암호화하고 서명합니다.

항목 암호화 도구와 직접 상호작용하고 기본 작업이 ENCRYPT_AND_SIGN인 경우 프라이머리 키에 대한 대체 작업을 지정해야 합니다. 프라이머리 키에 대한 SIGN_ONLY을 사용하거나 기본 작업인 경우 DO_NOTHING을 사용하는 set_index_keys 메서드를 사용할 수 있습니다.

프라이머리 키를 지정하기 위해 이 예제에서는 DynamoDB 호출로 채워지는 TableInfo 객체의 인덱스 키를 사용합니다. 이 기술은 프라이머리 키 이름을 하드 코딩하는 것보다 안전합니다.

actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} ) actions.set_index_keys(*table_info.protected_index_keys())
6단계: 항목에 대한 구성 만들기

DynamoDB Encryption Client를 구성하려면 테이블 항목에 대한 CryptoConfig 구성에서 방금 생성한 객체를 사용합니다. 클라이언트 헬퍼 클래스는 사용자를 위해 CryptoConfig를 만듭니다.

crypto_config = CryptoConfig( materials_provider=kms_cmp, encryption_context=encryption_context, attribute_actions=actions )
7단계: 항목 암호화

이 단계에서는 항목을 암호화하고 서명하지만 DynamoDB 테이블에 저장하지는 않습니다.

클라이언트 헬퍼 클래스를 사용할 경우 항목이 사용자 모르게 암호화 및 서명된 다음, 사용자가 헬퍼 클래스의 put_item 메서드를 호출할 때 DynamoDB 테이블에 추가됩니다. 항목 암호화 도구를 직접 사용하는 경우 암호화 및 입력 작업은 독립적입니다.

먼저 일반 텍스트 항목을 만듭니다.

plaintext_item = { 'partition_attribute': 'value1', 'sort_key': 55, 'example': 'data', 'numbers': 99, 'binary': Binary(b'\x00\x01\x02'), 'test': 'test-value' }

그런 다음 암호화하고 서명합니다. encrypt_python_item 방법에는 CryptoConfig 구성 객체가 필요합니다.

encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
8단계: 테이블에 항목 넣기

이 단계에서는 암호화되고 서명된 항목을 DynamoDB 테이블에 넣습니다.

table.put_item(Item=encrypted_item)

암호화된 항목을 보려면 encrypted_table 객체 대신 원본 table 객체에 대한 get_item 방법을 호출합니다. 항목을 확인 및 복호화하지 않고 DynamoDB 테이블에서 항목을 가져옵니다.

encrypted_item = table.get_item(Key=partition_key)['Item']

다음 이미지는 암호화되고 서명된 테이블 항목 예제의 일부를 보여줍니다.

암호화된 속성 값은 이진 데이터입니다. 프라이머리 키 속성(partition_attributesort_attribute)의 이름과 값 및 test 속성은 일반 텍스트로 유지됩니다. 이 출력은 서명(*amzn-ddb-map-sig*)을 포함하는 속성과 자료 설명 속성(*amzn-ddb-map-desc*)을 보여줍니다.


        암호화 및 서명된 항목(발췌)