AWS 데이터베이스 암호화 구성 SDK - AWS 데이터베이스 암호화 SDK

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

AWS 데이터베이스 암호화 구성 SDK

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

AWS Database EncryptionSDK은 사용하기 쉽게 설계되었습니다. AWS 데이터베이스 암호화SDK에는 여러 구성 옵션이 있지만 기본값은 대부분의 애플리케이션에서 실용적이고 안전하도록 신중하게 선택됩니다. 하지만 성능을 개선하거나 사용자 지정 기능을 포함하여 설계하려면 구성을 조정해야 할 수도 있습니다.

프로그래밍 언어 선택

DynamoDBSDK용 AWS 데이터베이스 암호화는 여러 프로그래밍 언어 로 제공됩니다. 언어 구현은 서로 다른 방식으로 구현될 수 있지만 완전히 상호 연동되고 동일한 기능을 제공하도록 설계되었습니다. 일반적으로 애플리케이션과 호환되는 라이브러리를 사용합니다.

래핑 키 선택

AWS 데이터베이스 암호화는 각 필드를 암호화하는 고유한 대칭 데이터 키를 SDK 생성합니다. 데이터 키를 구성, 관리 또는 사용할 필요가 없습니다. AWS Database Encryption은 사용자를 대신SDK합니다.

하지만 각 데이터 키를 암호화하려면 래핑 키를 하나 이상 선택해야 합니다. AWS 데이터베이스 암호화는 AWS Key Management Service (AWS KMS) 대칭 암호화 KMS 키와 비대칭 RSA KMS 키를 SDK 지원합니다. 또한 다양한 크기로 제공하는 AES 대칭 키와 RSA 비대칭 키도 지원합니다. 래핑 키의 안전성과 내구성은 사용자의 책임입니다. 따라서 하드웨어 보안 모듈 또는 와 같은 키 인프라 서비스에서 암호화 키를 사용하는 것이 좋습니다 AWS KMS.

암호화 및 복호화를 위한 래핑 키를 지정하려면 키링을 사용합니다. 사용하는 키링 유형에 따라 하나의 래핑 키를 지정하거나 동일하거나 다른 유형의 여러 래핑 키를 지정할 수 있습니다. 여러 래핑 키를 사용하여 데이터 키를 래핑하는 경우 각 래핑 키는 동일한 데이터 키의 사본을 암호화합니다. 암호화된 데이터 키(래핑 키당 1개)는 암호화된 필드와 함께 저장된 자료 설명에 저장됩니다. 데이터를 복호화하려면 AWS 데이터베이스 암호화가 먼저 래핑 키 중 하나를 사용하여 암호화된 데이터 키를 복호화해야 SDK 합니다.

가능하면 AWS KMS 키링 중 하나를 사용하는 것이 좋습니다. AWS 데이터베이스 암호화는 AWS KMS 키링AWS KMS 계층적 키링을 SDK 제공하여 에 대한 호출 수를 줄입니다 AWS KMS. 키링 AWS KMS key 에서 를 지정하려면 지원되는 AWS KMS 키 식별자를 사용합니다. AWS KMS 계층적 키링을 사용하는 경우 키 를 지정해야 합니다ARN. 키의 키 식별자에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서키 식별자를 AWS KMS 참조하세요.

  • AWS KMS 키링으로 암호화할 때 대칭 암호화 키에 유효한 KMS 키 식별자(키 ARN, 별칭 이름ARN, 별칭 또는 키 ID)를 지정할 수 있습니다. 비대칭 RSA KMS 키를 사용하는 경우 키 를 지정해야 합니다ARN.

    암호화할 때 KMS 키ARN의 별칭 이름 또는 별칭을 지정하면 AWS 데이터베이스 암호화는 ARN 현재 해당 별칭과 연결된 키를 SDK 저장하지만 별칭은 저장하지 않습니다. 별칭을 변경해도 데이터 KMS 키를 복호화하는 데 사용되는 키에는 영향을 주지 않습니다.

  • 기본적으로 AWS KMS 키링은 레코드를 엄격한 모드(특정 KMS 키를 지정하는 경우)로 복호화합니다. 키를 사용하여 AWS KMS keys 복호화를 ARN 식별해야 합니다.

    AWS KMS 키링으로 암호화하면 AWS 데이터베이스 암호화는 암호화된 데이터 키와 함께 ARN의 키를 자료 설명 AWS KMS key 에 SDK 저장합니다. 엄격한 모드에서 복호화할 때 AWS 데이터베이스 암호화는 래핑 키를 사용하여 암호화된 데이터 키를 SDK 복호화하려고 시도하기 전에 키링에 동일한 키가 ARN 나타나는지 확인합니다. 다른 키 식별자를 사용하는 경우 식별자가 동일한 키를 참조 AWS KMS key하더라도 AWS 데이터베이스 암호화SDK는 를 인식하거나 사용하지 않습니다.

  • 검색 모드에서 암호를 복호화할 때는 래핑 키를 지정하지 않습니다. 먼저 AWS 데이터베이스 암호화는 재료 설명에 ARN 저장된 키로 레코드를 복호화하려고 SDK 시도합니다. 그렇지 않으면 AWS 데이터베이스 암호화는 누가 해당 KMS 키를 소유하거나 액세스할 수 있는지에 관계없이 레코드를 암호화하는 KMS 키를 사용하여 레코드를 AWS KMS 복호화하도록 SDK 요청합니다.

원시 AES 키 또는 원시 RSA 키 페어를 키링의 래핑 키로 지정하려면 네임스페이스와 이름을 지정해야 합니다. 복호화할 때는 암호화할 때 사용한 것과 정확히 동일한 네임스페이스와 이름을 각 원시 래핑 키에 사용해야 합니다. 다른 네임스페이스 또는 이름을 사용하는 경우 키 구성 요소가 같더라도 AWS 데이터베이스 암호화는 래핑 키를 인식하거나 사용하지 SDK 않습니다.

검색 필터 생성

KMS 키로 암호화된 데이터를 복호화할 때는 엄격한 모드 에서 복호화하는 것이 가장 좋습니다. 즉, 사용하는 래핑 키를 지정한 키로 제한하는 것이 좋습니다. 하지만 필요한 경우 래핑 키를 지정하지 않는 검색 모드에서 복호화할 수도 있습니다. 이 모드에서는 누가 해당 키를 소유하거나 액세스할 AWS KMS 수 있는지에 관계없이 암호화된 데이터 KMS 키를 암호화된 KMS 키를 사용하여 복호화할 수 있습니다.

검색 모드에서 복호화해야 하는 경우 항상 검색 필터 를 사용하는 것이 좋습니다. 이 필터는 지정된 AWS 계정 및 파티션 의 키로 사용할 수 있는 KMS 키를 제한합니다. 검색 필터는 선택 사항이지만 모범 사례입니다.

다음 표를 사용하여 검색 필터의 파티션 값을 확인하세요.

리전 Partition
AWS 리전 aws
중국 리전 aws-cn
AWS GovCloud (US) Regions aws-us-gov

다음 예제에서는 검색 필터를 생성하는 방법을 보여줍니다. 코드를 사용하기 전에 예제 값을 AWS 계정 및 파티션의 유효한 값으로 바꿉니다.

Java
// Create the discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build();
C# / .NET
var discoveryFilter = new DiscoveryFilter { Partition = "aws", AccountIds = 111122223333 };

멀티테넌트 데이터베이스 작업

AWS 데이터베이스 암호화 를 사용하면 각 테넌트를 고유한 암호화 자료로 격리하여 공유 스키마가 있는 데이터베이스에 대한 클라이언트 측 암호화를 구성할 SDK수 있습니다. 멀티테넌트 데이터베이스를 고려할 때는 잠시 시간을 내어 보안 요구 사항과 멀티테넌시가 이에 미치는 영향을 검토하세요. 예를 들어 멀티테넌트 데이터베이스를 사용하면 AWS 데이터베이스 암호화를 다른 서버 측 암호화 솔루션SDK과 결합하는 데 영향을 미칠 수 있습니다.

데이터베이스 내에서 암호화 작업을 수행하는 사용자가 여러 명인 경우 AWS KMS 키링 중 하나를 사용하여 각 사용자에게 암호화 작업에 사용할 고유한 키를 제공할 수 있습니다. 멀티테넌트 클라이언트측 암호화 솔루션의 데이터 키 관리는 복잡할 수 있습니다. 가능하면 테넌트별로 데이터를 구성하는 것이 좋습니다. 테넌트가 프라이머리 키 값(예: Amazon DynamoDB 테이블의 파티션 키)으로 식별되는 경우 키를 더 쉽게 관리할 수 있습니다.

AWS KMS 키링을 사용하여 고유한 AWS KMS 키링 및 로 각 테넌트를 격리할 수 있습니다 AWS KMS keys. 테넌트당 수행된 통화량 AWS KMS 에 따라 AWS KMS 계층적 키링을 사용하여 에 대한 호출을 최소화할 수 있습니다 AWS KMS. AWS KMS 계층적 키링은 Amazon DynamoDB 테이블에 유지되는 AWS KMS 보호된 브랜치 키를 사용한 다음 암호화 및 복호화 작업에 사용되는 브랜치 키 자료를 로컬로 캐싱하여 AWS KMS 호출 수를 줄이는 암호화 자료 캐싱 솔루션입니다. AWS KMS 계층적 키링을 사용하여 데이터베이스에서 검색 가능한 암호화를 구현해야 합니다.

서명된 비컨 만들기

AWS 데이터베이스 암호화는 표준 비컨과 복합 비컨을 SDK 사용하여 쿼리된 전체 데이터베이스를 복호화하지 않고도 암호화된 레코드를 검색할 수 있는 검색 가능한 암호화 솔루션을 제공합니다. 그러나 AWS 데이터베이스 암호화는 일반 텍스트 서명 필드에서 완전히 구성할 수 있는 서명된 비컨SDK도 지원합니다. 서명된 비컨은 SIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 필드에서 복잡한 쿼리를 인덱싱하고 수행하는 복합 비컨의 한 유형입니다.

예를 들어 멀티테넌트 데이터베이스가 있는 경우 특정 테넌트의 키로 암호화된 레코드를 데이터베이스에 쿼리할 수 있는 서명된 비컨을 만들 수 있습니다. 자세한 내용은 멀티테넌트 데이터베이스의 비컨 쿼리 단원을 참조하십시오.

AWS KMS 계층적 키링을 사용하여 서명된 비컨을 생성해야 합니다.

서명된 비컨를 구성하려면 다음 값을 제공해야 합니다.

Java

복합 비컨 구성

다음 예제에서는 서명된 비컨 구성 내에서 로컬로 서명된 부분 목록을 정의합니다.

List<CompoundBeacon> compoundBeaconList = new ArrayList<>(); CompoundBeacon exampleCompoundBeacon = CompoundBeacon.builder() .name("compoundBeaconName") .split(".") .signed(signedPartList) .constructors(constructorList) .build(); compoundBeaconList.add(exampleCompoundBeacon);

비컨 버전 정의

다음 예제에서는 비컨 버전의 서명된 부분 목록을 전역적으로 정의합니다. 비컨 버전 정의에 대한 자세한 내용은 비컨 사용을 참조하세요.

List<BeaconVersion> beaconVersions = new ArrayList<>(); beaconVersions.add( BeaconVersion.builder() .standardBeacons(standardBeaconList) .compoundBeacons(compoundBeaconList) .signedParts(signedPartList) .version(1) // MUST be 1 .keyStore(keyStore) .keySource(BeaconKeySource.builder() .single(SingleKeyStore.builder() .keyId(branchKeyId) .cacheTTL(6000) .build()) .build()) .build() );
C# / .NET

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

서명된 비컨 구성

다음 예제에서는 서명된 비컨 구성 내에서 로컬로 서명된 부분 목록을 정의합니다.

var compoundBeaconList = new List<CompoundBeacon>(); var exampleCompoundBeacon = new CompoundBeacon { Name = "compoundBeaconName", Split = ".", Signed = signedPartList, Constructors = constructorList }; compoundBeaconList.Add(exampleCompoundBeacon);

비컨 버전 정의

다음 예제에서는 비컨 버전의 서명된 부분 목록을 전역적으로 정의합니다. 비컨 버전 정의에 대한 자세한 내용은 비컨 사용을 참조하세요.

var beaconVersions = new List<BeaconVersion> { new BeaconVersion { StandardBeacons = standardBeaconList, CompoundBeacons = compoundBeaconList, SignedParts = signedPartsList, Version = 1, // MUST be 1 KeyStore = keyStore, KeySource = new BeaconKeySource { Single = new SingleKeyStore { KeyId = branchKeyId, CacheTTL = 6000 } } } };

로컬 또는 전역적으로 정의된 목록에서 서명된 부분을 정의할 수 있습니다. 가능하면 비컨 버전의 글로벌 목록에서 서명된 부분을 정의하는 것이 좋습니다. 서명된 부분을 전역적으로 정의하면 각 부분을 한 번 정의한 다음 여러 복합 비컨 구성에서 해당 부분을 재사용할 수 있습니다. 서명된 부분을 한 번만 사용하려는 경우 서명된 비컨 구성의 로컬 목록에서 정의할 수 있습니다. 생성자 목록 에서 로컬 및 글로벌 부분을 모두 참조할 수 있습니다.

서명된 부분 목록을 전역적으로 정의하는 경우 서명된 비컨이 비컨 구성에서 필드를 모을 수 있는 가능한 모든 방법을 식별하는 생성자 부분 목록을 제공해야 합니다.

참고

서명된 부분 목록을 전역적으로 정의하려면 AWS 데이터베이스 암호화 버전 3.2 이상을 사용해야 합니다SDK. 전 세계적으로 새 부분을 정의하기 전에 모든 리더에 새 버전을 배포합니다.

기존 비컨 구성을 업데이트하여 서명된 부품 목록을 전역적으로 정의할 수 없습니다.

비컨 이름

비컨을 쿼리할 때 사용하는 이름.

서명된 비컨 이름은 암호화되지 않은 필드의 이름과 같을 수 없습니다. 두 비컨이 동일한 비컨 이름을 가질 수는 없습니다.

분할 캐릭터

서명된 비컨을 구성하는 부분을 구분하는 데 사용되는 문자입니다.

분할된 문자는 서명된 비컨을 구성하는 모든 필드의 일반 텍스트 값에 나타날 수 없습니다.

서명된 부분 목록

서명된 비컨에 포함된 서명된 필드를 식별합니다.

각 부분에는 이름, 출처 및 접두사가 포함되어야 합니다. 소스는 파트가 식별하는 SIGN_ONLY 또는 SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 필드입니다. 소스는 필드 이름이거나 중첩된 필드의 값을 참조하는 인덱스이어야 합니다. 부품 이름이 소스를 식별하는 경우 소스를 생략하면 AWS 데이터베이스 암호화SDK가 자동으로 해당 이름을 소스로 사용합니다. 가능하면 소스를 부분 이름으로 지정하는 것이 좋습니다. 접두사는 임의의 문자열일 수 있지만 고유해야 합니다. 서명된 비컨의 서명된 두 부분이 동일한 접두사를 가질 수 없습니다. 부분을 복합 비컨이 제공하는 다른 부분과 구분하는 짧은 값을 사용하는 것이 좋습니다.

가능한 한 서명 부분을 전역적으로 정의하는 것이 좋습니다. 하나의 복합 비컨에서만 사용하려는 경우 서명된 부분을 로컬에서 정의하는 것이 좋습니다. 로컬에서 정의된 파트는 전역적으로 정의된 파트와 동일한 접두사 또는 이름을 가질 수 없습니다.

Java
List<SignedPart> signedPartList = new ArrayList<>); SignedPart signedPartExample = SignedPart.builder() .name("signedFieldName") .prefix("S-") .build(); signedPartList.add(signedPartExample);
C# / .NET
var signedPartsList = new List<SignedPart> { new SignedPart { Name = "signedFieldName1", Prefix = "S-" }, new SignedPart { Name = "signedFieldName2", Prefix = "SF-" } };
구성자 목록(선택 사항)

서명된 비컨으로 서명된 부분을 조합할 수 있는 다양한 방법을 정의하는 생성자를 식별합니다.

생성자 목록을 지정하지 않으면 AWS 데이터베이스 암호화는 서명된 비컨을 다음 기본 생성자와 SDK 조립합니다.

  • 서명된 모든 부분은 서명된 부분 목록에 추가된 순서대로

  • 모든 부분이 필요합니다.

Constructors

각 생성자는 서명된 비컨을 조합할 수 있는 한 가지 방법을 정의하는 생성자 부분을 순서대로 나열한 목록입니다. 생성자 부분은 목록에 추가된 순서대로 함께 결합되며 각 부분은 지정된 분할 문자로 구분됩니다.

각 생성자 부분은 서명된 부분의 이름을 지정하고 생성자 내에서 해당 부분이 필수인지 선택적인지 정의합니다. 예를 들어 Field1, Field1.Field2, 및 Field1.Field2.Field3에 대한 서명된 비컨을 조회하고자 한다면, Field2Field3을 선택 사항으로 표시하고 생성자를 하나 생성합니다.

생성자마다 필수 부분이 하나 이상 있어야 합니다. 쿼리에 BEGINS_WITH 연산자를 사용할 수 있도록 각 생성자의 첫 번째 부분을 필수로 설정하는 것이 좋습니다.

생성자의 필수 부분이 모두 레코드에 있으면 생성자는 성공합니다. 새 레코드를 작성하면 서명된 비컨은 생성자 목록을 사용하여 제공된 값에서 비컨을 조합할 수 있는지 여부를 결정합니다. 생성자 목록에 생성자가 추가된 순서대로 비컨을 조합하려고 시도하고 성공한 첫 번째 생성자를 사용합니다. 생성자가 성공하지 못하면 비컨이 레코드에 기록되지 않습니다.

쿼리 결과가 정확한지 확인하려면 모든 리더와 작성자가 동일한 순서의 생성자를 지정해야 합니다.

다음 절차에 따라 생성자 목록을 지정하세요.

  1. 서명된 각 부분에 대해 생성자 부분을 만들어 해당 부분이 필요한지 여부를 정의합니다.

    생성자 부분 이름은 서명된 필드의 이름이어야 합니다.

    다음 예제에서는 서명된 필드 하나에 대해 생성자 부분을 만드는 방법을 보여줍니다.

    Java
    ConstructorPart field1ConstructorPart = ConstructorPart.builder() .name("Field1") .required(true) .build();
    C# / .NET
    var field1ConstructorPart = new ConstructorPart { Name = "Field1", Required = true };
  2. 1단계에서 만든 생성자 부분을 사용하여 서명된 비컨을 조합할 수 있는 가능한 모든 방법에 맞는 생성자를 만듭니다.

    예를 들어 Field1.Field2.Field3Field4.Field2.Field3에 대해 쿼리하려면 두 개의 생성자를 만들어야 합니다. Field1Field4은 두 개의 별도 생성자에 정의되어 있으므로 둘 다 필요할 수 있습니다.

    Java
    // Create a list for Field1.Field2.Field3 queries List<ConstructorPart> field123ConstructorPartList = new ArrayList<>(); field123ConstructorPartList.add(field1ConstructorPart); field123ConstructorPartList.add(field2ConstructorPart); field123ConstructorPartList.add(field3ConstructorPart); Constructor field123Constructor = Constructor.builder() .parts(field123ConstructorPartList) .build(); // Create a list for Field4.Field2.Field1 queries List<ConstructorPart> field421ConstructorPartList = new ArrayList<>(); field421ConstructorPartList.add(field4ConstructorPart); field421ConstructorPartList.add(field2ConstructorPart); field421ConstructorPartList.add(field1ConstructorPart); Constructor field421Constructor = Constructor.builder() .parts(field421ConstructorPartList) .build();
    C# / .NET
    // Create a list for Field1.Field2.Field3 queries var field123ConstructorPartList = new Constructor { Parts = new List<ConstructorPart> { field1ConstructorPart, field2ConstructorPart, field3ConstructorPart } }; // Create a list for Field4.Field2.Field1 queries var field421ConstructorPartList = new Constructor { Parts = new List<ConstructorPart> { field4ConstructorPart, field2ConstructorPart, field1ConstructorPart } };
  3. 2단계에서 만든 모든 생성자를 포함하는 생성자 목록을 만듭니다.

    Java
    List<Constructor> constructorList = new ArrayList<>(); constructorList.add(field123Constructor) constructorList.add(field421Constructor)
    C# / .NET
    var constructorList = new List<Constructor> { field123Constructor, field421Constructor };
  4. 서명된 constructorList 비컨을 만드는 시기를 지정합니다.