AWS KMS 계층적 키링 - AWS Encryption SDK

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

AWS KMS 계층적 키링

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

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

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

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

로컬 캐시는 암호화 자료를 복호화 자료와 분리합니다. 암호화 자료는 활성 브랜치 키에서 조립되어 캐시 제한이 만료될 때까지 모든 암호화 작업에 재사용됩니다. 복호화 자료는 암호화된 필드의 메타데이터에서 식별되는 브랜치 키 ID 및 버전에서 조립되며 캐시 제한이 만료될 때까지 브랜치 키 ID 및 버전과 관련된 모든 복호화 작업에 재사용됩니다. 로컬 캐시는 한 번에 여러 버전의 동일한 브랜치 키를 저장할 수 있습니다. 로컬 캐시가 를 사용하도록 구성된 경우 branch key ID supplier한 번에 여러 활성 브랜치 키의 브랜치 키 자료를 저장할 수도 있습니다.

참고

에서 계층적 키링에 대한 모든 언급은 AWS KMS 계층적 키링을 AWS Encryption SDK 참조합니다.

프로그래밍 언어 호환성

계층적 키링은 다음 프로그래밍 언어 및 버전에서 지원됩니다.

  • 의 버전 3.x AWS Encryption SDK for Java

  • AWS Encryption SDK 용 의 버전 4.x.NET

  • 선택적 MPL 종속성과 함께 사용되는 AWS Encryption SDK for Python경우 의 버전 4.x.

작동 방식

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

암호화 및 서명

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

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

  2. 유효한 브랜치 키 구성 요소가 없는 경우 계층적 키링은 활성 브랜치 키에 대해 키 스토어를 쿼리합니다.

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

    2. 키 스토어는 브랜치 키 버전과 같이 일반 텍스트 브랜치 키와 이를 식별하는 데이터를 반환합니다.

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

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

암호화 메서드로 암호화 자료를 사용하여 데이터를 암호화합니다. 자세한 내용은 AWS Encryption SDK 가 데이터를 암호화하는 방법을 참조하세요.

복호화 및 확인

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

  1. 복호화 메서드는 암호화된 메시지에서 암호화된 데이터 키를 식별하여 계층적 키링에 전달합니다.

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

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

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

  4. 유효한 브랜치 키 구성 요소가 없는 경우 계층적 키링은 키 스토어에 2단계에서 식별된 브랜치 키 버전과 일치하는 브랜치 키를 쿼리합니다.

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

    2. 키 스토어는 브랜치 키 버전과 같이 일반 텍스트 브랜치 키와 이를 식별하는 데이터를 반환합니다.

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

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

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

복호화 메서드는 복호화 자료와 일반 텍스트 데이터 키를 사용하여 암호화된 메시지를 복호화합니다. 자세한 내용은 이 암호화된 메시지를 AWS Encryption SDK 복호화하는 방법 단원을 참조하세요.

사전 조건

계층적 키링을 생성하고 사용하기 전에 다음 사전 요구 사항이 충족되었는지 확인합니다.

필수 권한

AWS Encryption SDK 에는 가 필요하지 AWS 계정 않으며 에 의존하지 않습니다 AWS 서비스. 그러나 계층적 키링을 사용하려면 키 스토어의 대칭 암호화 AWS KMS key()에 대한 AWS 계정 및 다음과 같은 최소 권한이 필요합니다.

브랜치 키 및 키 스토어에 대한 액세스 제어에 대한 자세한 내용은 섹션을 참조하세요최소 권한 구현.

캐시 선택

계층적 키링은 암호화 및 복호화 작업에 사용되는 브랜치 키 자료를 로컬에서 캐싱 AWS KMS 하여 에 대한 호출 수를 줄입니다. 계층적 키링을 생성하기 전에 사용할 캐시 유형을 결정해야 합니다. 기본 캐시를 사용하거나 필요에 맞게 캐시를 사용자 지정할 수 있습니다.

계층적 키링은 다음 캐시 유형을 지원합니다.

중요

지원되는 모든 캐시 유형은 멀티스레드 환경을 지원하도록 설계되었습니다.

그러나 와 함께 사용하는 경우 AWS Encryption SDK for Python계층적 키링은 멀티스레드 환경을 지원하지 않습니다. 자세한 내용은 의 -library 리포지토리에서 Python README.rst 파일을 참조하세요 GitHub. aws-cryptographic-material-providers

기본 캐시

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

기본 및 StormTracking 캐시는 동일한 스레드 모델을 지원하지만 기본 캐시를 사용하려면 입력 용량만 지정하면 됩니다. 보다 세분화된 캐시 사용자 지정을 위해 를 사용합니다StormTracking 캐시.

로컬 캐시에 저장할 수 있는 브랜치 키 자료 항목의 수를 사용자 지정하려는 경우가 아니면 계층적 키링을 생성할 때 캐시 유형을 지정할 필요가 없습니다. 캐시 유형을 지정하지 않으면 계층적 키링은 기본 캐시 유형을 사용하고 항목 용량을 1000으로 설정합니다.

기본 캐시를 사용자 지정하려면 다음 값을 지정합니다.

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

Java
.cache(CacheType.builder() .Default(DefaultCache.builder() .entryCapacity(100) .build())
C# / .NET
CacheType defaultCache = new CacheType { Default = new DefaultCache{EntryCapacity = 100} };
Python
default_cache = CacheTypeDefault( value=DefaultCache( entry_capacity=100 ) )

MultiThreaded 캐시

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

MultiThreaded 캐시를 사용하려면 다음 값을 지정합니다.

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

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

Java
.cache(CacheType.builder() .MultiThreaded(MultiThreadedCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .build())
C# / .NET
CacheType multithreadedCache = new CacheType { MultiThreaded = new MultiThreadedCache { EntryCapacity = 100, EntryPruningTailSize = 1 } };
Python
multithreaded_cache = CacheTypeMultiThreaded( value=MultiThreadedCache( entry_capacity=100, entry_pruning_tail_size=1 ) )

StormTracking 캐시

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

StormTracking 캐시를 사용하려면 다음 값을 지정합니다.

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

    기본값: 항목 1,000개

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

    기본값: 항목 1개

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

    기본값: 10초

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

    기본값: 1초

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

    기본값: 20회 시도

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

    기본값: 20초

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

    기본값: 20밀리초

Java
.cache(CacheType.builder() .StormTracking(StormTrackingCache.builder() .entryCapacity(100) .entryPruningTailSize(1) .gracePeriod(10) .graceInterval(1) .fanOut(20) .inFlightTTL(20) .sleepMilli(20) .build())
C# / .NET
CacheType stormTrackingCache = new CacheType { StormTracking = new StormTrackingCache { EntryCapacity = 100, EntryPruningTailSize = 1, FanOut = 20, GraceInterval = 1, GracePeriod = 10, InFlightTTL = 20, SleepMilli = 20 } };
Python
storm_tracking_cache = CacheTypeStormTracking( value=StormTrackingCache( entry_capacity=100, entry_pruning_tail_size=1, fan_out=20, grace_interval=1, grace_period=10, in_flight_ttl=20, sleep_milli=20 ) )

공유 캐시

기본적으로 계층적 키링은 키링을 인스턴스화할 때마다 새 로컬 캐시를 생성합니다. 그러나 공유 캐시를 사용하면 여러 계층적 키링에서 캐시를 공유할 수 있으므로 메모리를 절약하는 데 도움이 될 수 있습니다. 공유 캐시는 인스턴스화하는 각 계층적 키링에 대해 새 암호화 자료 캐시를 생성하는 대신 메모리에 하나의 캐시만 저장하며, 이를 참조하는 모든 계층적 키링에서 사용할 수 있습니다. 공유 캐시는 키링 간에 암호화 자료가 중복되는 것을 방지하여 메모리 사용을 최적화하는 데 도움이 됩니다. 대신 계층적 키링은 동일한 기본 캐시에 액세스하여 전체 메모리 공간을 줄일 수 있습니다.

공유 캐시를 생성할 때 여전히 캐시 유형을 정의합니다. 기본 캐시, MultiThreaded 캐시또는 를 캐시 유형StormTracking 캐시으로 지정하거나 호환되는 사용자 지정 캐시를 대체할 수 있습니다.

파티션

여러 계층적 키링은 단일 공유 캐시를 사용할 수 있습니다. 공유 캐시를 사용하여 계층적 키링을 생성할 때 선택적 파티션 ID 를 정의할 수 있습니다. 파티션 ID는 캐시에 쓰는 계층적 키링을 구분합니다. 두 계층 키링이 동일한 파티션 ID, logical key store name및 브랜치 키 ID를 참조하는 경우 두 키링은 캐시에서 동일한 캐시 항목을 공유합니다. 공유 캐시는 동일하지만 파티션은 다른 두 개의 계층적 키링을 생성하는 경우 IDs각 키링은 공유 캐시 내의 지정된 자체 파티션에서만 캐시 항목에 액세스합니다. 파티션은 공유 캐시 내에서 논리적 분할 역할을 하므로 각 계층적 키링이 다른 파티션에 저장된 데이터를 방해하지 않고 자체 지정된 파티션에서 독립적으로 작동할 수 있습니다.

파티션에서 캐시 항목을 재사용하거나 공유하려는 경우 고유한 파티션 ID를 정의해야 합니다. 계층적 키링에 파티션 ID를 전달하면 키링은 브랜치 키 자료를 다시 검색하고 다시 승인하지 않고 공유 캐시에 이미 있는 캐시 항목을 재사용할 수 있습니다. 파티션 ID를 지정하지 않으면 계층적 키링을 인스턴스화할 때마다 고유한 파티션 ID가 키링에 자동으로 할당됩니다.

다음 절차에서는 기본 캐시 유형을 사용하여 공유 캐시를 생성하고 계층적 키링에 전달하는 방법을 보여줍니다.

  1. Material Providers LibraryCryptographicMaterialsCache(CMC)를 사용하여 ()를 생성합니다MPL.

    Java
    // Instantiate the MPL final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); // Create a CacheType object for the Default cache final CacheType cache = CacheType.builder() .Default(DefaultCache.builder().entryCapacity(100).build()) .build(); // Create a CMC using the default cache final CreateCryptographicMaterialsCacheInput cryptographicMaterialsCacheInput = CreateCryptographicMaterialsCacheInput.builder() .cache(cache) .build(); final ICryptographicMaterialsCache sharedCryptographicMaterialsCache = matProv.CreateCryptographicMaterialsCache(cryptographicMaterialsCacheInput);
    C# / .NET
    // Instantiate the MPL var materialProviders = new MaterialProviders(new MaterialProvidersConfig()); // Create a CacheType object for the Default cache var cache = new CacheType { Default = new DefaultCache{EntryCapacity = 100} }; // Create a CMC using the default cache var cryptographicMaterialsCacheInput = new CreateCryptographicMaterialsCacheInput {Cache = cache}; var sharedCryptographicMaterialsCache = materialProviders.CreateCryptographicMaterialsCache(cryptographicMaterialsCacheInput);
    Python
    # Instantiate the MPL mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create a CacheType object for the default cache cache: CacheType = CacheTypeDefault( value=DefaultCache( entry_capacity=100, ) ) # Create a CMC using the default cache cryptographic_materials_cache_input = CreateCryptographicMaterialsCacheInput( cache=cache, ) shared_cryptographic_materials_cache = mat_prov.create_cryptographic_materials_cache( cryptographic_materials_cache_input )
  2. 공유 캐시에 대한 CacheType 객체를 생성합니다.

    1단계에서 sharedCryptographicMaterialsCache 생성한 를 새 CacheType 객체에 전달합니다.

    Java
    // Create a CacheType object for the sharedCryptographicMaterialsCache final CacheType sharedCache = CacheType.builder() .Shared(sharedCryptographicMaterialsCache) .build();
    C# / .NET
    // Create a CacheType object for the sharedCryptographicMaterialsCache var sharedCache = new CacheType { Shared = sharedCryptographicMaterialsCache };
    Python
    # Create a CacheType object for the shared_cryptographic_materials_cache shared_cache: CacheType = CacheTypeShared( value=shared_cryptographic_materials_cache )
  3. 2단계에서 계층적 키링으로 sharedCache 객체를 전달합니다.

    공유 캐시를 사용하여 계층적 키링을 생성할 때 선택적으로 를 정의partitionID하여 여러 계층적 키링에서 캐시 항목을 공유할 수 있습니다. 파티션 ID를 지정하지 않으면 계층적 키링이 자동으로 키링에 고유한 파티션 ID를 할당합니다.

    참고

    동일한 파티션 ID, logical key store name및 브랜치 키 ID를 참조하는 두 개 이상의 키링을 생성하는 경우 계층적 키링은 공유 캐시에서 동일한 캐시 항목을 공유합니다. 여러 키링이 동일한 캐시 항목을 공유하지 않도록 하려면 각 계층적 키링에 고유한 파티션 ID를 사용해야 합니다.

    다음 예제에서는 branch key ID supplier, 캐시 한도 600초로 계층적 키링을 생성합니다. 다음 계층적 키링 구성에 정의된 값에 대한 자세한 내용은 섹션을 참조하세요계층적 키링 생성.

    Java
    // Create the Hierarchical keyring final CreateAwsKmsHierarchicalKeyringInput keyringInput = CreateAwsKmsHierarchicalKeyringInput.builder() .keyStore(keystore) .branchKeyIdSupplier(branchKeyIdSupplier) .ttlSeconds(600) .cache(sharedCache) .partitionID(partitionID) .build(); final IKeyring hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);
    C# / .NET
    // Create the Hierarchical keyring var createKeyringInput = new CreateAwsKmsHierarchicalKeyringInput { KeyStore = keystore, BranchKeyIdSupplier = branchKeyIdSupplier, Cache = sharedCache, TtlSeconds = 600, PartitionId = partitionID }; var keyring = materialProviders.CreateAwsKmsHierarchicalKeyring(createKeyringInput);
    Python
    # Create the Hierarchical keyring keyring_input: CreateAwsKmsHierarchicalKeyringInput = CreateAwsKmsHierarchicalKeyringInput( key_store=keystore, branch_key_id_supplier=branch_key_id_supplier, ttl_seconds=600, cache=shared_cache, partition_id=partition_id ) hierarchical_keyring: IKeyring = mat_prov.create_aws_kms_hierarchical_keyring( input=keyring_input )

계층적 키링 생성

계층적 키링을 생성하려면 다음 값을 제공해야 합니다.

  • 키 스토어 이름

    사용자 또는 키 스토어 관리자가 키 스토어 역할을 하도록 생성한 DynamoDB 테이블의 이름입니다.

  • 캐시 제한 라이브 시간(TTL)

    로컬 캐시 내의 브랜치 키 자료 항목이 만료되기 전에 사용할 수 있는 시간(초) 입니다. 캐시 제한은 클라이언트가 TTL 브랜치 키 사용을 승인 AWS KMS 하기 위해 를 호출하는 빈도를 지정합니다. 이 값은 0보다 커야 합니다. 캐시 제한이 TTL 만료되면 항목이 제공되지 않으며 로컬 캐시에서 제거됩니다.

  • 브랜치 키 식별자

    키 스토어에서 단일 활성 브랜치 키를 branch-key-id 식별하는 를 정적으로 구성하거나 브랜치 키 ID 공급자를 제공할 수 있습니다.

    브랜치 키 ID 공급자는 암호화 컨텍스트에 저장된 필드를 사용하여 레코드를 복호화하는 데 필요한 브랜치 키를 결정합니다.

    각 테넌트에 자체 브랜치 키가 있는 멀티테넌트 데이터베이스에는 브랜치 키 ID 공급자를 사용하는 것이 좋습니다. 브랜치 키 ID 공급자를 사용하여 브랜치 키에 대한 친숙한 이름을 생성IDs하여 특정 테넌트에 대한 올바른 브랜치 키 ID를 쉽게 인식할 수 있습니다. 예를 들어 친숙한 이름을 사용하면 브랜치 키를 b3f61619-4d35-48ad-a275-050f87e15122 대신 tenant1로 참조할 수 있습니다.

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

  • (선택 사항) 캐시

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

    계층적 키링은 기본, 및 MultiThreaded StormTracking공유 캐시 유형을 지원합니다. 각 캐시 유형을 정의하는 방법을 보여주는 자세한 내용과 예제는 섹션을 참조하세요캐시 선택.

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

  • (선택 사항) 파티션 ID

    를 지정하는 경우 선택적으로 파티션 ID를 정의할 공유 캐시수 있습니다. 파티션 ID는 캐시에 쓰는 계층적 키링을 구분합니다. 파티션에서 캐시 항목을 재사용하거나 공유하려는 경우 고유한 파티션 ID를 정의해야 합니다. 파티션 ID에 대한 문자열을 지정할 수 있습니다. 파티션 ID를 지정하지 않으면 생성 시 고유한 파티션 ID가 키링에 자동으로 할당됩니다.

    자세한 내용은 Partitions 단원을 참조하십시오.

    참고

    동일한 파티션 ID, logical key store name및 브랜치 키 ID를 참조하는 두 개 이상의 키링을 생성하는 경우 계층적 키링은 공유 캐시에서 동일한 캐시 항목을 공유합니다. 여러 키링이 동일한 캐시 항목을 공유하지 않도록 하려면 각 계층적 키링에 고유한 파티션 ID를 사용해야 합니다.

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

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

다음 예제에서는 정적 브랜치 키 ID, 기본 캐시및 600초TTL의 캐시 제한으로 계층적 키링을 생성하는 방법을 보여줍니다.

Java
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);
C# / .NET
var matProv = new MaterialProviders(new MaterialProvidersConfig()); var keyringInput = new CreateAwsKmsHierarchicalKeyringInput { KeyStore = keystore, BranchKeyId = branch-key-id, TtlSeconds = 600 }; var hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);
Python
mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) keyring_input: CreateAwsKmsHierarchicalKeyringInput = CreateAwsKmsHierarchicalKeyringInput( key_store=keystore, branch_key_id=branch_key_id, ttl_seconds=600 ) hierarchical_keyring: IKeyring = mat_prov.create_aws_kms_hierarchical_keyring( input=keyring_input )

다음 절차에서는 브랜치 키 ID 공급자를 사용하여 계층적 키링을 생성하는 방법을 보여줍니다.

  1. 브랜치 키 ID 공급자 생성

    다음 예제에서는 브랜치 키 두 개에 대한 친숙한 이름을 생성하고 브랜치 키 ID 공급자를 생성하기 CreateDynamoDbEncryptionBranchKeyIdSupplier 위해 호출합니다.

    Java
    // 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();
    C# / .NET
    // Create friendly names for each branch-key-id class ExampleBranchKeyIdSupplier : DynamoDbKeyBranchKeyIdSupplierBase { private String _branchKeyIdForTenant1; private String _branchKeyIdForTenant2; public ExampleBranchKeyIdSupplier(String tenant1Id, String tenant2Id) { this._branchKeyIdForTenant1 = tenant1Id; this._branchKeyIdForTenant2 = tenant2Id; } // Create the branch key ID supplier var ddbEnc = new DynamoDbEncryption(new DynamoDbEncryptionConfig()); var branchKeyIdSupplier = ddbEnc.CreateDynamoDbEncryptionBranchKeyIdSupplier( new CreateDynamoDbEncryptionBranchKeyIdSupplierInput { DdbKeyBranchKeyIdSupplier = new ExampleBranchKeyIdSupplier(branch-key-ID-tenant1, branch-key-ID-tenant2) }).BranchKeyIdSupplier;
    Python
    # Create branch key ID supplier that maps the branch key ID to a friendly name branch_key_id_supplier: IBranchKeyIdSupplier = ExampleBranchKeyIdSupplier( tenant_1_id=branch_key_id_a, tenant_2_id=branch_key_id_b, )
  2. 계층적 키링 생성

    다음 예제에서는 1단계에서 생성된 브랜치 키 ID 공급자, 600초TLL의 캐시 제한, 1000의 최대 캐시 크기로 계층적 키링을 초기화합니다.

    Java
    final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); final CreateAwsKmsHierarchicalKeyringInput keyringInput = CreateAwsKmsHierarchicalKeyringInput.builder() .keyStore(keystore) .branchKeyIdSupplier(branchKeyIdSupplier) .ttlSeconds(600) .cache(CacheType.builder() //OPTIONAL .Default(DefaultCache.builder() .entryCapacity(100) .build()) .build(); final Keyring hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);
    C# / .NET
    var matProv = new MaterialProviders(new MaterialProvidersConfig()); var keyringInput = new CreateAwsKmsHierarchicalKeyringInput { KeyStore = keystore, BranchKeyIdSupplier = branchKeyIdSupplier, TtlSeconds = 600, Cache = new CacheType { Default = new DefaultCache { EntryCapacity = 100 } } }; var hierarchicalKeyring = matProv.CreateAwsKmsHierarchicalKeyring(keyringInput);
    Python
    mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) keyring_input: CreateAwsKmsHierarchicalKeyringInput = CreateAwsKmsHierarchicalKeyringInput( key_store=keystore, branch_key_id_supplier=branch_key_id_supplier, ttl_seconds=600, cache=CacheTypeDefault( value=DefaultCache( entry_capacity=100 ) ), ) hierarchical_keyring: IKeyring = mat_prov.create_aws_kms_hierarchical_keyring( input=keyring_input )