AWS KMS 계층형 키링 - AWS 데이터베이스 암호화 SDK

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

AWS KMS 계층형 키링

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

2023년 7월 24일부터 개발자 시험판 중에 생성된 브랜치 키는 지원되지 않습니다. 개발자 시험판 중에 생성한 브랜치 키 스토어를 계속 사용하려면 새 브랜치 키를 생성합니다.

AWS KMS 계층적 키링을 사용하면 레코드를 암호화하거나 해독할 때마다 전화를 걸지 않고도 대칭 암호화 KMS 키로 암호화 자료를 보호할 수 있습니다. AWS KMS 호출을 최소화해야 하는 애플리케이션과 보안 요구 사항을 위반하지 않고 일부 암호화 자료를 AWS KMS재사용할 수 있는 애플리케이션에 적합합니다.

계층적 키링은 Amazon DynamoDB 테이블에 AWS KMS 유지되는 보호된 분기 키를 사용하고 암호화 및 복호화 작업에 사용되는 분기 키 자료를 로컬에 캐싱하여 AWS KMS 호출 횟수를 줄이는 암호화 자료 캐싱 솔루션입니다. DynamoDB 테이블은 브랜치 키를 관리하고 보호하는 브랜치 키 스토어 역할을 합니다. 활성 브랜치 키와 모든 이하 버전의 브랜치 키를 저장합니다. 활성 브랜치 키는 최신 버전의 브랜치 키입니다. 계층적 키링은 고유한 데이터 키를 사용하여 각 필드를 암호화하고 활성 브랜치 키에서 파생된 고유한 래핑 키로 각 데이터 키를 암호화합니다. 계층적 키링은 활성 브랜치 키와 파생된 래핑 키 사이에 설정된 계층 구조에 따라 달라집니다.

계층적 키링은 일반적으로 각 브랜치 키 버전을 사용하여 여러 요청을 충족합니다. 하지만 활성 브랜치 키의 재사용 범위를 제어하고 활성 브랜치 키의 교체 빈도를 결정할 수 있습니다. 브랜치 키의 활성 버전은 교체할 때까지 활성 상태로 유지됩니다. 이하 버전의 활성 브랜치 키는 암호화 작업을 수행하는 데 사용되지 않지만 여전히 쿼리를 통해 복호화 작업에 사용할 수 있습니다.

계층적 키링을 인스턴스화하면 로컬 캐시가 생성됩니다. 캐시 제한을 지정하고 브랜치 키 자료가 만료되어 캐시에서 제거되기 전에 로컬 캐시에 저장되는 최대 시간을 정의합니다. 계층적 키링은 작업에서 a가 처음 지정될 때 한 번의 AWS KMS 호출을 통해 분기 키를 해독하고 분기 키 자료를 조합합니다. branch-key-id 그러면 브랜치 키 자료가 로컬 캐시에 저장되고 캐시 제한이 만료될 때까지 branch-key-id를 지정하는 모든 암호화 및 복호화 작업에 브랜치 키 자료가 재사용됩니다. 브랜치 키 자료를 로컬 캐시에 저장하면 호출 횟수가 줄어듭니다. AWS KMS 예를 들어, 캐시 한도를 15분으로 가정해 보겠습니다. 해당 캐시 한도 내에서 10,000개의 암호화 작업을 수행하는 경우 기존 AWS KMS 키링은 10,000개의 암호화 작업을 처리하기 위해 AWS KMS 10,000번의 호출을 수행해야 합니다. branch-key-id활성화된 키링이 하나라도 있는 경우 계층 키링을 한 번만 AWS KMS 호출하면 10,000개의 암호화 작업을 처리할 수 있습니다.

로컬 캐시는 두 개의 파티션으로 구성되어 있는데, 하나는 암호화 작업용이고 다른 하나는 복호화 작업용입니다. 암호화 파티션은 활성 브랜치 키에서 조합된 브랜치 키 자료를 저장하고 캐시 제한이 만료될 때까지 모든 암호화 작업에 이를 재사용합니다. 복호화 파티션에는 복호화 작업에서 식별된 다른 브랜치 키 버전용으로 조합된 브랜치 키 자료가 저장됩니다. 복호화 파티션은 한 번에 여러 활성 브랜치 키 자료 버전을 저장할 수 있습니다. 멀티테넌트 데이터베이스에서 브랜치 키 ID 공급자를 사용하도록 구성된 경우 암호화 파티션은 한 번에 여러 브랜치 키 자료 버전을 저장할 수도 있습니다. 자세한 설명은 멀티테넌트 데이터베이스에서 계층적 키링 사용 섹션을 참조하세요.

참고

AWS 데이터베이스 암호화 SDK의 계층적 키링에 대한 모든 언급은 계층적 키링을 가리킵니다. AWS KMS

작동 방식

다음 연습에서는 계층적 키링이 암호화 및 복호화 자료를 조합하는 방법과 암호화 및 복호화 작업에 대해 키링이 수행하는 다양한 호출을 설명합니다. 래핑 키 파생 및 일반 텍스트 데이터 키 암호화 프로세스에 대한 기술 세부 정보는 AWS KMS 계층적 키링 기술 세부 정보를 참조하세요.

암호화 및 서명

다음 연습에서는 계층적 키링이 암호화 자료를 조합하고 고유한 래핑 키를 도출하는 방법을 설명합니다.

  1. 암호화 메서드는 계층적 키링에 암호화 자료를 요청합니다. 키링은 일반 텍스트 데이터 키를 생성한 다음 로컬 캐시에 유효한 브랜치 자료가 있는지 확인하여 래핑 키를 생성합니다. 유효한 브랜치 키 자료가 있는 경우 키링은 5단계로 진행됩니다.

  2. 유효한 브랜치 키 자료가 없는 경우 계층적 키링은 브랜치 키 저장소에 활성 브랜치 키를 쿼리합니다.

    1. 브랜치 키 스토어는 활성 분기 키를 AWS KMS 호출하여 암호를 해독하고 일반 텍스트 활성 분기 키를 반환합니다. 활성 브랜치 키를 식별하는 데이터는 직렬화되어 AWS KMS복호화 호출 시 추가 인증 데이터(AAD)를 제공합니다.

    2. 브랜치 키 저장소는 일반 텍스트 브랜치 키와 이를 식별하는 데이터(예: 브랜치 키 버전)를 반환합니다.

  3. 계층적 키링은 브랜치 키 자료(일반 텍스트 브랜치 키 및 브랜치 키 버전)를 조합하여 로컬 캐시에 사본을 저장합니다.

  4. 계층적 키링은 일반 텍스트 브랜치 키와 16바이트 무작위 솔트에서 고유한 래핑 키를 가져옵니다. 파생된 래핑 키를 사용하여 일반 텍스트 데이터 키의 사본을 암호화합니다.

암호화 메서드로 암호화 자료를 사용하여 레코드를 암호화 및 서명합니다. AWS Database Encryption SDK에서 레코드를 암호화하고 서명하는 방법에 대한 자세한 내용은 암호화 및 서명을 참조하세요.

복호화 및 확인

다음 안내에서는 계층적 키링이 복호화 자료를 조합하고 암호화된 데이터 키를 복호화하는 방법을 설명합니다.

  1. 복호화 메서드는 암호화된 레코드의 자료 설명 필드에서 암호화된 데이터 키를 식별하고 이를 계층적 키링에 전달합니다.

  2. 계층적 키링은 브랜치 키 버전, 16바이트 솔트 및 데이터 키가 암호화된 방법을 설명하는 기타 정보 등 암호화된 데이터 키를 식별하는 데이터를 역직렬화합니다.

    자세한 내용은 AWS KMS 계층적 키링 기술 세부 정보 섹션을 참조하세요.

  3. 계층적 키링은 2단계에서 식별한 브랜치 키 버전과 일치하는 유효한 브랜치 키 자료가 로컬 캐시에 있는지 확인합니다. 유효한 브랜치 키 자료가 있는 경우 키링은 6단계로 진행됩니다.

  4. 유효한 브랜치 키 자료가 없는 경우 계층적 키링은 2단계에서 식별한 브랜치 키 버전과 일치하는 브랜치 키를 브랜치 키 저장소에 쿼리합니다.

    1. 브랜치 키 스토어는 브랜치 키를 AWS KMS 해독하기 위해 호출하고 일반 텍스트 활성 브랜치 키를 반환합니다. 활성 브랜치 키를 식별하는 데이터는 직렬화되어 AWS KMS복호화 호출 시 추가 인증 데이터(AAD)를 제공합니다.

    2. 브랜치 키 저장소는 일반 텍스트 브랜치 키와 이를 식별하는 데이터(예: 브랜치 키 버전)를 반환합니다.

  5. 계층적 키링은 브랜치 키 자료(일반 텍스트 브랜치 키 및 브랜치 키 버전)를 조합하여 로컬 캐시에 사본을 저장합니다.

  6. 계층적 키링은 조합된 브랜치 키 자료와 2단계에서 식별한 16바이트 솔트를 사용하여 데이터 키를 암호화한 고유 래핑 키를 재현합니다.

  7. 계층적 키링은 재생된 래핑 키를 사용하여 데이터 키를 복호화하고 일반 텍스트 데이터 키를 반환합니다.

복호화 메서드는 복호화 자료와 일반 텍스트 데이터 키를 이용해 레코드를 복호화하고 검증하는 방식입니다. AWS 데이터베이스 암호화 SDK에서 레코드를 복호화하고 확인하는 방법에 대한 자세한 내용은 암호 해독 및 확인을 참조하십시오.

필수 조건

AWS 데이터베이스 암호화 SDK는 필수적이지 AWS 계정 않으며 어떤 것에도 의존하지 않습니다. AWS 서비스하지만 계층적 키링은 Amazon AWS KMS DynamoDB에 따라 달라집니다.

계층적 키링을 사용하려면 KMS:Decrypt 권한을 사용한 대칭 암호화가 필요합니다. AWS KMS key 대칭 암호화 다중 리전 키를 사용할 수도 있습니다. AWS KMS keys권한에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드인증 및 액세스 제어를 참조하세요.

계층적 키링을 생성하여 사용하려면 먼저 브랜치 키 스토어를 생성하고 첫 번째 활성 브랜치 키로 이를 채워야 합니다.

1단계: 새 키 스토어 서비스 구성

키 스토어 서비스는 계층적 키링 사전 조건을 조합하고 브랜치 키 스토어를 관리하는 데 도움이 되는 여러 작업(예: CreateKeyStoreCreateKey)을 제공합니다.

다음 Java 예제에서는 키 스토어 서비스를 생성합니다. 브랜치 키 스토어의 이름으로 사용할 DynamoDB 테이블 이름, 브랜치 키 스토어의 논리적 이름, 브랜치 키를 보호할 KMS 키를 식별하는 KMS 키 ARN을 지정해야 합니다.

논리적 키 스토어 이름은 테이블에 저장된 모든 데이터에 암호로 바인딩되어 DynamoDB 복원 작업을 간소화합니다. 논리적 키 스토어 이름은 DynamoDB 테이블 이름과 같을 수 있지만 반드시 같을 필요는 없습니다. 키 스토어 서비스를 처음 구성할 때 DynamoDB 테이블 이름을 논리적 테이블 이름으로 지정할 것을 강력히 권장합니다. 항상 같은 논리적 테이블 이름을 지정해야 합니다. 백업에서 DynamoDB 테이블을 복원한 후 브랜치 키 스토어 이름이 변경된 경우, 계층적 키링이 브랜치 키 스토어에 계속 액세스할 수 있도록 논리적 키 스토어 이름이 지정한 DynamoDB 테이블 이름에 매핑됩니다.

final KeyStore keystore = KeyStore.builder().KeyStoreConfig( KeyStoreConfig.builder() .ddbClient(DynamoDbClient.create()) .ddbTableName(keyStoreName) .logicalKeyStoreName(logicalKeyStoreName) .kmsClient(KmsClient.create()) .kmsConfiguration(KMSConfiguration.builder() .kmsKeyArn(kmsKeyArn) .build()) .build()).build();
2단계: CreateKeyStore 호출을 통한 브랜치 키 저장소 생성

다음 Java 작업은 브랜치 키를 유지하고 보호하는 브랜치 키 저장소를 생성합니다.

keystore.CreateKeyStore(CreateKeyStoreInput.builder().build());

CreateKeyStore 작업을 수행하면 1단계에서 지정한 테이블 이름과 다음 필수 값을 사용하여 DynamoDB 테이블이 생성됩니다.

파티션 키 정렬 키
기본 테이블 branch-key-id version
3단계: CreateKey 호출을 통한 새 활성 브랜치 키 생성

다음 Java 작업은 1단계에서 지정한 KMS 키를 사용하여 새 활성 브랜치 키를 생성하고 2단계에서 생성한 DynamoDB 테이블에 활성 브랜치 키를 추가합니다.

CreateKey를 호출할 때 다음과 같은 선택적 값을 지정하도록 선택할 수 있습니다.

  • branchKeyIdentifier: 사용자 지정 branch-key-id를 정의합니다.

    사용자 지정 branch-key-id를 만들려면 encryptionContext 파라미터에 추가 암호화 컨텍스트도 포함해야 합니다.

  • encryptionContext: kms: 호출에 포함된 암호화 컨텍스트에서 추가 인증 데이터 (AAD) 를 제공하는 선택적 비비밀 키-값 쌍 세트를 정의합니다. GenerateDataKeyWithoutPlaintext

    이 추가 암호화 컨텍스트는 aws-crypto-ec: 접두사와 표시됩니다.

final Map<String, String> additionalEncryptionContext = Collections.singletonMap("contextKey", "contextValue"); final String BranchKey = keystore.CreateKey( CreateKeyInput.builder() .branchKeyIdentifier(custom-branch-key-id) //OPTIONAL .encryptionContext(additionalEncryptionContext) //OPTIONAL .build()).branchKeyIdentifier();

먼저, CreateKey 작업은 다음 값을 생성합니다.

그러면 CreateKey 작업은 다음 요청을 사용하여 kms:를 호출합니다. GenerateDataKeyWithoutPlaintext

{ "EncryptionContext": { "branch-key-id" : "branch-key-id", "type" : "type", "create-time" : "timestamp", "logical-key-store-name" : "the logical table name for your branch key store", "kms-arn" : the KMS key ARN, "hierarchy-version" : "1", "aws-crypto-ec:contextKey": "contextValue" }, "KeyId": "the KMS key ARN you specified in Step 1", "NumberOfBytes": "32" }
참고

데이터베이스를 검색 가능한 암호화로 구성하지 않았더라도 CreateKey 작업을 수행하면 활성 브랜치 키와 비컨 키가 생성됩니다. 두 키 모두 브랜치 키 스토어에 저장됩니다. 자세한 내용은 검색 가능한 암호화를 위한 계층적 키링 사용을 참조하세요.

그런 다음 CreateKey 작업은 ReEncryptkms:를 호출하여 암호화 컨텍스트를 업데이트하여 분기 키에 대한 활성 레코드를 생성합니다.

마지막으로 CreateKey 작업은 TransactWriteItemsddb:를 호출하여 2단계에서 만든 테이블에 분기 키를 유지할 새 항목을 작성합니다. 항목에는 다음 속성이 있습니다.

{ "branch-key-id" : branch-key-id, "type" : "branch:ACTIVE", "enc" : the branch key returned by the GenerateDataKeyWithoutPlaintext call, "version": "branch:version:the branch key version UUID", "create-time" : "timestamp", "kms-arn" : "the KMS key ARN you specified in Step 1", "hierarchy-version" : "1", "aws-crypto-ec:contextKey": "contextValue" }

계층적 키링 생성

계층적 키링을 초기화하려면 다음 값을 제공해야 합니다.

  • 브랜치 키 스토어 이름

    브랜치 키 스토어로 사용하기 위해 생성한 DynamoDB 테이블의 이름입니다.

  • 캐시 제한 유지 시간(TTL)

    로컬 캐시 내의 브랜치 키 자료 항목이 만료되기 전에 사용할 수 있는 시간(초) 입니다. 이 값은 0보다 커야 합니다. 캐시 제한 TTL이 만료되면 해당 항목이 로컬 캐시에서 제거됩니다.

  • 브랜치 키 식별자

    branch-key-id는 브랜치 키 스토어의 활성 브랜치 키를 식별합니다.

    참고

    멀티테넌트 사용을 위한 계층적 키링을 초기화하려면 branch-key-id 대신 브랜치 키 ID 공급자를 지정해야 합니다. 자세한 설명은 멀티테넌트 데이터베이스에서 계층적 키링 사용 섹션을 참조하세요.

  • (선택 사항) 권한 부여 토큰 목록

    권한 부여를 통해 계층적 키링의 KMS 키에 대한 액세스를 제어하는 경우 키링을 초기화할 때 필요한 모든 권한 부여 토큰을 제공해야 합니다.

다음 Java 예제는 AWS Database Encryption SDK for DynamoDB client를 사용하여 계층적 키링을 초기화하는 방법을 보여줍니다. 다음 예제에서는 캐시 제한 TTL을 600초로 지정합니다.

final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsHierarchicalKeyringInput keyringInput = CreateAwsKmsHierarchicalKeyringInput.builder() .keyStore(branchKeyStoreName) .branchKeyId(branch-key-id) .ttlSeconds(600) .build(); final Keyring hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);

활성 브랜치 키 교체

각 브랜치 키에는 한 번에 하나의 활성 버전만 있을 수 있습니다. 계층적 키링은 일반적으로 각 활성 브랜치 키 버전을 사용하여 여러 요청을 충족합니다. 하지만 활성 브랜치 키의 재사용 범위를 제어하고 활성 브랜치 키의 교체 빈도를 결정할 수 있습니다.

브랜치 키는 일반 텍스트 데이터 키를 암호화하는 데 사용되지 않습니다. 이들은 일반 텍스트 데이터 키를 암호화하는 고유한 래핑 키를 도출하는 데 사용됩니다. 래핑 키 추출 프로세스는 28바이트의 무작위성을 갖는 고유한 32바이트 래핑 키를 생성합니다. 즉, 브랜치 키는 암호화 마모가 발생하기 전에 79옥틸리온(296) 이상의 고유한 래핑 키를 도출할 수 있습니다. 이렇게 소진 위험은 매우 낮지만 비즈니스 또는 계약 규칙이나 정부 규정으로 인해 활성 브랜치 키를 교체해야 할 수도 있습니다.

브랜치 키의 활성 버전은 교체할 때까지 활성 상태로 유지됩니다. 이하 버전의 활성 브랜치 키는 암호화 작업을 수행하는 데 사용되지 않으며 새 래핑 키를 도출하는 데 사용할 수 없습니다. 단, 여전히 쿼리가 가능하며 활성 상태에서 암호화한 데이터 키를 복호화하기 위한 래핑 키를 제공할 수 있습니다.

키 스토어 서비스 VersionKey 작업을 사용하여 활성 브랜치 키를 교체할 수 있습니다. 활성 브랜치 키를 교체하면 이하 버전을 대체하는 새 브랜치 키가 생성됩니다. 활성 브랜치 키를 교체해도 branch-key-id는 변경되지 않습니다. VersionKey를 호출할 때 현재 활성 브랜치 키를 식별하는 branch-key-id를 지정해야 합니다.

keystore.VersionKey( VersionKeyInput.builder() .branchKeyIdentifier("branch-key-id") .build() );

멀티테넌트 데이터베이스에서 계층적 키링 사용

활성 브랜치 키와 파생 래핑 키 사이에 설정된 키 계층 구조에 따라 사용자 데이터베이스의 각 테넌트에 대한 브랜치 키를 생성하여 멀티테넌트 데이터베이스를 지원할 수 있습니다. 그러면 계층적 키링이 고유한 브랜치 키를 사용하여 지정된 테넌트의 모든 데이터를 암호화 및 서명합니다. 이를 통해 멀티테넌트 데이터를 단일 데이터베이스에 저장하고 브랜치 키로 테넌트 데이터를 격리할 수 있습니다.

각 테넌트에는 고유한 branch-key-id로 정의된 브랜치 키가 있습니다. 각 branch-key-id에는 한 번에 하나의 활성 버전만 있을 수 있습니다.

멀티테넌트 사용을 위한 계층적 키링을 초기화하려면 먼저 각 테넌트에 대한 브랜치 키를 생성하고 브랜치 키 ID 공급자를 생성해야 합니다. 브랜치 키 ID 공급자를 사용하여 테넌트에 맞는 올바른 branch-key-id를 쉽게 알아볼 수 있도록 branch-key-ids를 친숙한 이름을 만듭니다. 예를 들어 친숙한 이름을 사용하면 브랜치 키를 b3f61619-4d35-48ad-a275-050f87e15122 대신 tenant1로 참조할 수 있습니다.

복호화 작업의 경우 단일 계층적 키링을 정적으로 구성하여 복호화을 단일 테넌트로 제한하거나 브랜치 키 ID 공급자를 사용하여 레코드 복호화을 담당하는 테넌트를 식별할 수 있습니다.

먼저 사전 조건 절차의 1단계와 2단계를 따르세요. 그런 다음, 다음 절차를 사용하여 각 테넌트의 브랜치 키를 생성하고, 브랜치 키 ID 공급자를 생성하고, 멀티테넌트 사용을 위한 계층적 키링을 초기화합니다.

1단계: 데이터베이스에서 각 테넌트에 대한 브랜치 키 생성

데이터베이스의 각 테넌트에 대한 CreateKey를 호출합니다.

다음 Java 작업은 키 스토어 서비스를 생성할 때 지정한 KMS 키를 사용하여 두 개의 브랜치 키를 생성하고 브랜치 키 스토어로 사용하기 위해 생성한 DynamoDB 테이블에 브랜치 키를 추가합니다. 동일한 KMS 키로 모든 브랜치 키를 보호해야 합니다.

final String tenant1BranchKey = keystore.CreateKey( CreateKeyInput.builder().build()).branchKeyIdentifier(); final String tenant2BranchKey = keystore.CreateKey( CreateKeyInput.builder().build()).branchKeyIdentifier();
2단계: 브랜치 키 ID 공급자 생성

다음 Java 예제는 1단계에서 생성한 두 개의 분기 키에서 친숙한 이름을 생성하고 DynamoDB 클라이언트용 AWS 데이터베이스 암호화 SDK를 사용하여 분기 키 ID 공급자를 CreateDynamoDbEncryptionBranchKeyIdSupplier 생성하도록 호출합니다.

// Create friendly names for each branch-key-id class ExampleBranchKeyIdSupplier implements IDynamoDbKeyBranchKeyIdSupplier { private static String branchKeyIdForTenant1; private static String branchKeyIdForTenant2; public ExampleBranchKeyIdSupplier(String tenant1Id, String tenant2Id) { this.branchKeyIdForTenant1 = tenant1Id; this.branchKeyIdForTenant2 = tenant2Id; } // Create the branch key ID supplier final DynamoDbEncryption ddbEnc = DynamoDbEncryption.builder() .DynamoDbEncryptionConfig(DynamoDbEncryptionConfig.builder().build()) .build(); final BranchKeyIdSupplier branchKeyIdSupplier = ddbEnc.CreateDynamoDbEncryptionBranchKeyIdSupplier( CreateDynamoDbEncryptionBranchKeyIdSupplierInput.builder() .ddbKeyBranchKeyIdSupplier(new ExampleBranchKeyIdSupplier(branch-key-ID-tenant1, branch-key-ID-tenant2)) .build()).branchKeyIdSupplier();
3단계: 브랜치 키 ID 공급자를 통해 계층적 키링을 초기화합니다.

계층적 키링을 초기화하려면 다음 값을 제공해야 합니다.

  • 브랜치 키 스토어 이름

  • 캐시 제한 유지 시간(TTL)

  • 브랜치 키 ID 공급자

  • (선택 사항) 캐시

    캐시 유형이나 로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목 수를 사용자 지정하려면 키링을 초기화할 때 캐시 유형과 항목 용량을 지정하세요.

    캐시 유형은 스레딩 모델을 정의합니다. 계층적 키링은 멀티테넌트 데이터베이스를 지원하는 세 가지 캐시 유형 (Default,,) 을 제공합니다. MultiThreaded StormTracking

    캐시를 지정하지 않으면 계층적 키링은 자동으로 기본 캐시 유형을 사용하고 항목 용량을 1,000으로 설정합니다.

    Default (Recommended)

    대부분 사용자의 경우 기본 캐시로 스레딩 요구 사항을 충족합니다. 기본 캐시는 멀티스레드가 많은 환경을 지원하도록 설계되었습니다. 분기 키 자료 항목이 만료되면 기본 캐시는 분기 키 자료 항목이 만료되기 10초 전에 한 스레드에 알리므로 여러 스레드가 AWS KMS 호출되지 않도록 합니다. 이렇게 하면 하나의 스레드만 캐시 새로 고침 요청을 AWS KMS 보낼 수 있습니다.

    기본 캐시를 사용하여 계층적 키링을 초기화하려면 다음 값을 지정하세요.

    • 항목 용량: 로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목의 수를 제한합니다.

    .cache(CacheType.builder() .Default(DefaultCache.builder() .entryCapacity(100) .build())

    기본 StormTracking 캐시와 캐시는 동일한 스레딩 모델을 지원하지만 기본 캐시를 사용하여 계층적 키링을 초기화하려면 입력 용량만 지정하면 됩니다. 캐시를 더 세밀하게 사용자 지정하려면 캐시를 사용하십시오. StormTracking

    MultiThreaded

    MultiThreaded 캐시는 멀티스레드 환경에서 안전하게 사용할 수 있지만 Amazon AWS KMS DynamoDB 호출을 최소화하는 기능은 제공하지 않습니다. 따라서 브랜치 키 자료 입력이 만료되면 동시에 모든 스레드로 알림이 전송됩니다. 이로 인해 캐시 새로 고침을 위한 AWS KMS 호출이 여러 번 발생할 수 있습니다.

    MultiThreaded 캐시를 사용하여 계층적 키링을 초기화하려면 다음 값을 지정하십시오.

    • 항목 용량: 로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목의 수를 제한합니다.

    • 항목 정리 테일 크기: 항목 용량에 도달한 경우 정리할 항목 수를 정의합니다.

    .cache(CacheType.builder() .MultiThreaded(MultiThreadedCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .build())
    StormTracking

    StormTracking 캐시는 멀티스레드가 많은 환경을 지원하도록 설계되었습니다. 브랜치 키 자료 항목이 만료되면 StormTracking 캐시는 한 스레드에 브랜치 키 구성 요소 항목이 만료될 것임을 미리 알려 여러 스레드가 AWS KMS 호출하는 것을 방지합니다. 이렇게 하면 하나의 스레드만 캐시 새로 고침 요청을 AWS KMS 보낼 수 있습니다.

    StormTracking 캐시를 사용하여 계층적 키링을 초기화하려면 다음 값을 지정하십시오.

    • 항목 용량: 로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목의 수를 제한합니다.

    • 항목 정리 테일 크기: 한 번에 정리할 브랜치 키 자료 항목의 수를 정의합니다.

      기본값: 항목 1개

    • 유예 기간: 브랜치 키 자료를 새로 고치려는 시도가 만료되기까지 걸리는 시간(초)을 정의합니다.

      기본값: 10초

    • 유예 간격: 브랜치 키 자료의 새로 고침 시도 간격(초)을 정의합니다.

      기본값: 1초

    • 팬아웃: 브랜치 키 자료를 새로 고칠 수 있는 동시 시도 횟수를 정의합니다.

      기본값: 20회 시도

    • 전송 유지 시간(TTL): 브랜치 키 자료를 새로 고치려는 시도가 제한 시간 초과될 때까지의 시간(초)을 정의합니다. GetCacheEntry에 대한 응답으로 캐시가 NoSuchEntry를 반환할 때마다 해당 브랜치 키는 PutCache 항목과 동일한 키가 기록될 때까지 전송 중인 것으로 간주됩니다.

      기본값: 20초

    • 절전: fanOut 초과 시 스레드가 절전 상태로 유지되는 시간(초)을 정의합니다.

      기본값: 20밀리초

    .cache(CacheType.builder() .MultiThreaded(MultiThreadedCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .gracePeriod(10) .graceInterval(1) .fanOut(20) .inFlightTTL(20) .sleepMilli(20) .build())
  • (선택 사항) 권한 부여 토큰 목록

    권한 부여를 통해 계층적 키링의 KMS 키에 대한 액세스를 제어하는 경우 키링을 초기화할 때 필요한 모든 권한 부여 토큰을 제공해야 합니다.

다음 Java 예제는 2단계에서 생성된 브랜치 키 ID 공급자, 캐시 제한 TLL 600초, 최대 캐시 크기 1000을 사용하여 계층형 키링을 초기화합니다. 이 예제는 DynamoDB 클라이언트용 데이터베이스 AWS 암호화 SDK를 사용하여 계층적 키링을 초기화합니다.

final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsHierarchicalKeyringInput keyringInput = CreateAwsKmsHierarchicalKeyringInput.builder() .keyStore(branchKeyStoreName) .branchKeyIdSupplier(branchKeyIdSupplier) .ttlSeconds(600) .cache(CacheType.builder() //OPTIONAL .Default(DefaultCache.builder() .entryCapacity(100) .build()) .build(); final Keyring hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);

검색 가능한 암호화를 위한 계층적 키링 사용

검색 가능한 암호화를 사용하면 전체 데이터베이스를 복호화하지 않고도 암호화된 레코드를 검색할 수 있습니다. 이는 암호화된 필드의 일반 텍스트 값을 컨으로 인덱싱하여 수행됩니다. 검색 가능한 암호화를 구현하려면 계층적 키링을 사용해야 합니다.

키 스토어 CreateKey 작업은 브랜치 키와 비컨 키를 모두 생성합니다. 브랜치 키는 레코드 암호화 및 복호화 작업에 사용됩니다. 비컨 키는 비컨을 생성하는 데 사용됩니다.

브랜치 키와 비콘 키는 키 스토어 서비스를 생성할 때 AWS KMS key 지정하는 것과 동일한 방식으로 보호됩니다. CreateKey작업에서 브랜치 키 생성을 AWS KMS GenerateDataKeyWithoutPlaintext 호출한 후 kms를 두 번째로 호출하여 다음 요청을 사용하여 비콘 키를 생성합니다.

{ "EncryptionContext": { "branch-key-id" : "branch-key-id", "type" : type, "create-time" : "timestamp", "logical-key-store-name" : "the logical table name for your branch key store", "kms-arn" : the KMS key ARN, "hierarchy-version" : 1 }, "KeyId": "the KMS key ARN", "NumberOfBytes": "32" }

두 키를 모두 생성한 후 CreateKey 작업은 TransactWriteItemsddb:를 호출하여 브랜치 키 스토어에 브랜치 키와 비콘 키를 유지할 두 개의 새 항목을 작성합니다.

표준 비콘을 구성하면 AWS 데이터베이스 암호화 SDK가 분기 키 스토어에 비콘 키를 쿼리합니다. 그런 다음 HMAC 기반 extract-and-expand 키 도출 함수 (HKDF) 를 사용하여 비콘 키를 표준 비콘의 이름과 결합하여 지정된 비콘에 대한 HMAC 키를 생성합니다.

브랜치 키와 달리 브랜치 키 스토어에는 branch-key-id당 비컨 키 버전이 하나씩만 있습니다. 비컨 키는 절대 교체되지 않습니다.

비컨 키 소스 정의하기

표준 및 복합 비컨의 비컨 버전을 정의할 때는 비컨 키를 식별하고 비컨 키 자료에 대한 캐시 제한 수명(TTL)을 정의해야 합니다. 비컨 키 자료는 브랜치 키와는 별도의 로컬 캐시에 저장됩니다. 다음 스니펫은 단일 테넌트 데이터베이스용으로 keySource를 정의하는 방법을 보여줍니다. 연결된 branch-key-id에 의한 비컨 키로 비컨 키를 식별합니다.

keySource(BeaconKeySource.builder() .single(SingleKeyStore.builder() .keyId(branch-key-id) .cacheTTL(6000) .build()) .build())
멀티테넌트 데이터베이스의 비컨 소스 정의

멀티테넌트 데이터베이스를 사용하는 경우 keySource를 구성할 때 다음 값을 지정해야 합니다.

  • keyFieldName

    지정된 테넌트에 대한 비컨을 생성하는 데 사용된 비컨 키와 branch-key-id 관련된 필드를 저장하는 필드의 이름을 정의합니다. keyFieldName은 임의의 문자열일 수 있지만 데이터베이스의 다른 모든 필드에 고유해야 합니다. 데이터베이스에 새 레코드를 쓰는 경우 해당 레코드에 대한 비컨을 생성하는 데 사용되는 비컨 키를 식별하는 branch-key-id가 이 필드에 저장됩니다. 비컨 쿼리에 이 필드를 포함하고 비컨을 재계산하는 데 필요한 적절한 비컨 키 자료를 식별해야 합니다. 자세한 설명은 멀티테넌트 데이터베이스의 비컨 쿼리 섹션을 참조하세요.

  • cacheTTL

    로컬 비컨 캐시 내의 비컨 키 자료 항목이 만료되기 전에 사용할 수 있는 시간(초) 입니다. 이 값은 0보다 커야 합니다. 캐시 제한 TTL이 만료되면 해당 항목이 로컬 캐시에서 제거됩니다.

  • (선택 사항) 캐시

    캐시 유형이나 로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목 수를 사용자 지정하려면 키링을 초기화할 때 캐시 유형과 항목 용량을 지정하세요.

    캐시 유형은 스레딩 모델을 정의합니다. 계층적 키링은 멀티테넌트 데이터베이스를 지원하는 세 가지 캐시 유형 (Default,,) 을 제공합니다. MultiThreaded StormTracking

    캐시를 지정하지 않으면 계층적 키링은 자동으로 기본 캐시 유형을 사용하고 항목 용량을 1,000으로 설정합니다.

    Default (Recommended)

    대부분 사용자의 경우 기본 캐시로 스레딩 요구 사항을 충족합니다. 기본 캐시는 멀티스레드가 많은 환경을 지원하도록 설계되었습니다. 분기 키 자료 항목이 만료되면 기본 캐시는 분기 키 자료 항목이 만료되기 10초 전에 한 스레드에 알리므로 여러 스레드가 AWS KMS 호출되지 않도록 합니다. 이렇게 하면 하나의 스레드만 캐시 새로 고침 요청을 AWS KMS 보낼 수 있습니다.

    기본 캐시를 사용하여 계층적 키링을 초기화하려면 다음 값을 지정하세요.

    • 항목 용량: 로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목의 수를 제한합니다.

    .cache(CacheType.builder() .Default(DefaultCache.builder() .entryCapacity(100) .build())

    기본 StormTracking 캐시와 캐시는 동일한 스레딩 모델을 지원하지만 기본 캐시를 사용하여 계층적 키링을 초기화하려면 입력 용량만 지정하면 됩니다. 캐시를 더 세밀하게 사용자 지정하려면 캐시를 사용하십시오. StormTracking

    MultiThreaded

    MultiThreaded 캐시는 멀티스레드 환경에서 안전하게 사용할 수 있지만 Amazon AWS KMS DynamoDB 호출을 최소화하는 기능은 제공하지 않습니다. 따라서 브랜치 키 자료 입력이 만료되면 동시에 모든 스레드로 알림이 전송됩니다. 이로 인해 캐시 새로 고침을 위한 AWS KMS 호출이 여러 번 발생할 수 있습니다.

    MultiThreaded 캐시를 사용하여 계층적 키링을 초기화하려면 다음 값을 지정하십시오.

    • 항목 용량: 로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목의 수를 제한합니다.

    • 항목 정리 테일 크기: 항목 용량에 도달한 경우 정리할 항목 수를 정의합니다.

    .cache(CacheType.builder() .MultiThreaded(MultiThreadedCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .build())
    StormTracking

    StormTracking 캐시는 멀티스레드가 많은 환경을 지원하도록 설계되었습니다. 브랜치 키 자료 항목이 만료되면 StormTracking 캐시는 한 스레드에 브랜치 키 구성 요소 항목이 만료될 것임을 미리 알려 여러 스레드가 AWS KMS 호출하는 것을 방지합니다. 이렇게 하면 하나의 스레드만 캐시 새로 고침 요청을 AWS KMS 보낼 수 있습니다.

    StormTracking 캐시를 사용하여 계층적 키링을 초기화하려면 다음 값을 지정하십시오.

    • 항목 용량: 로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목의 수를 제한합니다.

    • 항목 정리 테일 크기: 한 번에 정리할 브랜치 키 자료 항목의 수를 정의합니다.

      기본값: 항목 1개

    • 유예 기간: 브랜치 키 자료를 새로 고치려는 시도가 만료되기까지 걸리는 시간(초)을 정의합니다.

      기본값: 10초

    • 유예 간격: 브랜치 키 자료의 새로 고침 시도 간격(초)을 정의합니다.

      기본값: 1초

    • 팬아웃: 브랜치 키 자료를 새로 고칠 수 있는 동시 시도 횟수를 정의합니다.

      기본값: 20회 시도

    • 전송 유지 시간(TTL): 브랜치 키 자료를 새로 고치려는 시도가 제한 시간 초과될 때까지의 시간(초)을 정의합니다. GetCacheEntry에 대한 응답으로 캐시가 NoSuchEntry를 반환할 때마다 해당 브랜치 키는 PutCache 항목과 동일한 키가 기록될 때까지 전송 중인 것으로 간주됩니다.

      기본값: 20초

    • 절전: fanOut 초과 시 스레드가 절전 상태로 유지되는 시간(초)을 정의합니다.

      기본값: 20밀리초

    .cache(CacheType.builder() .MultiThreaded(MultiThreadedCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .gracePeriod(10) .graceInterval(1) .fanOut(20) .inFlightTTL(20) .sleepMilli(20) .build())
keySource(BeaconKeySource.builder() .multi(MultiKeyStore.builder() .keyFieldName(beaconKeys) .cacheTTL(6000) .cache(CacheType.builder() // OPTIONAL .Default(DefaultCache.builder() .entryCapacity(100) .build()) .build()) .build())