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

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

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

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

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

프로그래밍 언어 선택

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

래핑 키 선택

AWS 데이터베이스 암호화는 고유한 대칭 데이터 키를 SDK 생성하여 각 필드를 암호화합니다. 데이터 키를 구성, 관리 또는 사용할 필요가 없습니다. AWS 데이터베이스 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 KMS 안내서의 키 식별자를 참조하십시오.AWS Key Management Service

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

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

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

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

  • 검색 모드에서 암호를 복호화할 때는 래핑 키를 지정하지 않습니다. 먼저 AWS 데이터베이스 암호화는 자료 SDK 설명에 ARN 저장된 키를 사용하여 레코드의 암호를 해독하려고 시도합니다. 그래도 문제가 해결되지 않으면 AWS 데이터베이스 암호화는 누가 키를 소유했든 액세스 권한이 있든 상관없이 레코드를 암호화한 KMS 키를 사용하여 레코드를 SDK AWS KMS 해독하도록 요청합니다. KMS

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

검색 필터 생성

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

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

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

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

다음 예제는 검색 필터를 만드는 방법을 보여줍니다. 코드를 사용하기 전에 예제 값을 AND 파티션의 유효한 값으로 바꾸십시오 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 사용하면 각 테넌트를 별도의 암호화 자료로 격리하여 공유 스키마를 사용하는 데이터베이스의 클라이언트 측 암호화를 구성할 수 있습니다. 멀티테넌트 데이터베이스를 고려할 때는 잠시 시간을 내어 보안 요구 사항과 멀티테넌시가 이에 미치는 영향을 검토하세요. 예를 들어 멀티테넌트 데이터베이스를 사용하면 데이터베이스 암호화를 다른 서버측 암호화 SDK 솔루션과 결합하는 데 영향을 미칠 수 있습니다. AWS

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

키링을 사용하여 각 테넌트를 별도의 AWS KMS 키링으로 분리할 수 있습니다. AWS KMS AWS KMS keys테넌트당 AWS KMS 걸려오는 통화량을 기준으로 AWS KMS 계층적 키링을 사용하여 호출을 최소화하는 것이 좋습니다. AWS KMSAWS KMS 계층적 키링은 Amazon DynamoDB 테이블에 AWS KMS 유지되는 보호된 분기 키를 사용하고 암호화 및 복호화 작업에 사용되는 분기 키 자료를 로컬에 캐싱하여 AWS KMS 호출 횟수를 줄이는 암호화 자료 캐싱 솔루션입니다. 데이터베이스에서 검색 가능한 암호화를 구현하려면 계층적 키링을 사용해야 합니다. AWS KMS

서명된 비컨 만들기

AWS 데이터베이스 암호화는 표준 비콘과 복합 비콘을 SDK 사용하여 쿼리된 전체 데이터베이스를 해독하지 않고도 암호화된 레코드를 검색할 수 있는 검색 가능한 암호화 솔루션을 제공합니다. 하지만 AWS 데이터베이스 암호화는 일반 텍스트 서명 필드만으로 구성할 수 있는 서명된 SDK 비콘도 지원합니다. 서명된 비콘은 및 필드에 대해 복잡한 쿼리를 인덱싱하고 수행하는 복합 비콘의 일종입니다. SIGN_ONLY SIGN_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

전체 코드 샘플: .cs를 참조하십시오. BeaconConfig

서명된 비콘 구성

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

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 } } } };

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

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

참고

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

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

비컨 이름

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

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

분할 캐릭터

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

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

서명된 부분 목록

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

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

가능하면 서명된 부품을 전역적으로 정의하는 것이 좋습니다. 서명된 부품을 하나의 복합 신호에서만 사용하려는 경우 서명된 부품을 로컬로 정의하는 것을 고려할 수 있습니다. 로컬에서 정의된 부품은 전체적으로 정의된 부품과 동일한 접두사 또는 이름을 가질 수 없습니다.

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 비컨을 만드는 시기를 지정합니다.