AWS KMS 키링 - AWS Encryption SDK

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

AWS KMS 키링

AWS KMS 키링은 대칭 암호화 AWS KMS keys를 사용하여 데이터 키를 생성, 암호화 및 복호화합니다. AWS Key Management Service(AWS KMS)는 KMS 키를 보호하고 FIPS 경계 내에서 암호화 작업을 수행합니다. 가능하면 AWS KMS 키링 또는 유사한 보안 속성을 가진 키링을 사용할 것을 권장합니다.

버전 2.3부터 AWS KMS 키링 또는 마스터 키 제공자에서 AWS KMS 다중 지역 키를 사용할 수 있습니다. x 또는 버전 AWS Encryption SDK 3.0입니다. AWS암호화 CLI의 x 새로운 다중 리전 인식 기호 사용에 대한 자세한 내용 및 예제는 다중 리전 AWS KMS keys 사용 섹션을 참조하세요. 다중 리전 키에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드다중 리전 키 사용을 참조하세요.

참고

버전 4. AWS Encryption SDK.NET용 x 및 버전 3입니다. AWS Encryption SDK for Javax는 비대칭 RSA를 사용하는 AWS KMS 키링을 지원하는 유일한 프로그래밍 언어 구현입니다. AWS KMS keys

다른 언어 구현의 암호화 키링에 비대칭 KMS 키를 포함하려고 하면 암호화 호출이 실패합니다. 복호화 키링에 포함하면 무시됩니다.

AWS Encryption SDK의 KMS 키링에 대한 모든 설명은 AWS KMS 키링을 참조합니다.

AWS KMS 키링에는 두 가지 유형의 래핑 키가 포함될 수 있습니다.

  • 생성기 키: 일반 텍스트 데이터 키를 생성하고 암호화합니다. 데이터를 암호화하는 키링에는 하나의 생성기 키가 있어야 합니다.

  • 추가 키: 생성기 키가 생성한 일반 텍스트 데이터 키를 암호화합니다. AWS KMS 키링에는 0개 이상의 추가 키가 있을 수 있습니다.

암호화할 때 사용하는 AWS KMS 키링에 생성기 키가 있어야 합니다. 복호화 시 생성기 키는 선택 사항이며 생성기 키와 추가 키 간의 구분은 무시됩니다.

AWS KMS 암호화 키링에 AWS KMS 키가 하나뿐인 경우 해당 키를 사용하여 데이터 키를 생성하고 암호화합니다.

모든 키링과 마찬가지로 AWS KMS 키링도 독립적으로 사용하거나, 동일하거나 여러 유형의 다른 키링과 함께 다중 키링으로 사용할 수 있습니다.

AWS KMS 키링에 필요한 권한

AWS Encryption SDK는 AWS 계정가 필요하지 않으며 AWS 서비스를 사용하지 않습니다. 하지만 AWS KMS 키링을 사용하려면 키링의 AWS KMS keys에 대한 AWS 계정 및 다음과 같은 최소 권한이 필요합니다.

  • AWS KMS키링으로 암호화하려면 생성기 키에 대한 kms: 권한이 필요합니다. GenerateDataKey AWS KMS 키링의 모든 추가 키에는 kms:Encrypt 권한이 필요합니다.

  • AWS KMS 키링으로 암호를 복호화하려면 AWS KMS 키링에 있는 하나 이상의 키에 대한 kms:Decrypt 권한이 필요합니다.

  • 키링으로 구성된 다중 키링으로 암호화하려면 생성기 AWS KMS 키링의 생성기 키에 대한 kms: GenerateDataKey 권한이 필요합니다. 다른 모든 AWS KMS 키링의 모든 기타 키에는 kms:Encrypt 권한이 필요합니다.

AWS KMS keys 권한에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드인증 및 액세스 제어를 참조하세요.

AWS KMS 키링의 AWS KMS keys 식별

AWS KMS 키링에는 하나 이상의 AWS KMS keys가 포함될 수 있습니다. AWS KMS 키링에서 AWS KMS key를 지정하려면 지원되는 AWS KMS 키 식별자를 사용합니다. 키링에서 AWS KMS key를 식별하는 데 사용할 수 있는 키 식별자는 작업 및 언어 구현에 따라 다릅니다. AWS KMS key의 키 식별자에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드키 식별자를 참조하세요.

작업에 가장 적합한 키 식별자를 사용하는 것이 모범 사례입니다.

  • AWS Encryption SDK for C의 암호화 키링에서 키 ARN 또는 별칭 ARN을 사용하여 KMS 키를 식별할 수 있습니다. 다른 모든 언어 구현에서는 키 ID, 키 ARN, 별칭 이름 또는 별칭 ARN을 사용하여 데이터를 암호화할 수 있습니다.

  • 복호화 키링에서는 키 ARN을 사용하여 AWS KMS keys를 식별해야 합니다. 이 요구 사항은 AWS Encryption SDK의 모든 언어 구현에 적용됩니다. 자세한 내용은 래핑 키 선택 섹션을 참조하세요.

  • 암호화 및 복호화에 사용되는 키링에서는 키 ARN을 사용하여 AWS KMS keys를 식별해야 합니다. 이 요구 사항은 AWS Encryption SDK의 모든 언어 구현에 적용됩니다.

암호화 키링에서 KMS 키에 대해 별칭 이름 또는 별칭 ARN을 지정하는 경우 암호화 작업은 현재 별칭과 연결된 키 ARN을 암호화된 데이터 키의 메타데이터에 저장합니다. 별칭은 저장되지 않습니다. 별칭을 변경해도 암호화된 데이터 키를 복호화하는 데 사용되는 KMS 키에는 영향을 주지 않습니다.

암호화를 위한 AWS KMS 키링 생성

동일하거나 다른 AWS 계정 및 AWS 리전에서 단일 AWS KMS key 또는 여러 개의 AWS KMS keys로 각 AWS KMS 키링을 구성할 수 있습니다. AWS KMS keys는 대칭 암호화 키(SYMMETRIC_DEFAULT)여야 합니다. 대칭 암호화 다중 리전 KMS 키를 사용할 수도 있습니다. 모든 키링과 마찬가지로 다중 키링에서도 하나 이상의 AWS KMS 키링을 사용할 수 있습니다.

AWS KMS 키링을 암호화 데이터로 생성하는 경우 생성기 키, 즉 일반 텍스트 데이터 키를 생성하고 암호화하는 데 사용되는 AWS KMS key를 지정해야 합니다. 데이터 키는 KMS 키와 수학적으로 관련이 없습니다. 그런 다음 동일한 일반 텍스트 데이터 키를 암호화하는 AWS KMS keys를 추가로 지정할 수도 있습니다.

이 키링으로 보호되는 암호화된 메시지를 복호화하려면 사용하는 키링이 키링에서 정의된 AWS KMS keys 중 하나 이상 포함하거나 AWS KMS keys가 없어야 합니다. (AWS KMS keys가 없는 AWS KMS 키링을 AWS KMS 검색 키링이라고 합니다.)

AWS Encryption SDK for C를 제외한 AWS Encryption SDK 언어 구현에서는 암호화 키링 또는 다중 키링의 모든 래핑 키가 데이터 키를 암호화할 수 있어야 합니다. 래핑 키가 암호화되지 않으면 암호화 메서드가 실패합니다. 따라서 호출자는 키링의 모든 키에 필요한 권한을 가지고 있어야 합니다. 검색 키링을 사용하여 단독 또는 다중 키링으로 데이터를 암호화하는 경우 암호화 작업이 실패합니다. 단, AWS Encryption SDK for C에서 표준 검색 키링을 무시하지만 다중 리전 검색 키링을 단독 또는 다중 키링으로 지정하면 암호화 작업이 실패하는 경우는 예외입니다.

다음 예제에서는 생성기 키 하나와 추가 키 하나를 사용하여 AWS KMS 키링을 만듭니다. 이 예제에서는 키 ARN을 사용하여 KMS 키를 식별합니다. 이는 암호화에 사용되는 AWS KMS 키링의 모범 사례이며, 복호화에 사용되는 AWS KMS 키링의 요구 사항입니다. 자세한 내용은 AWS KMS 키링의 AWS KMS keys 식별 섹션을 참조하세요.

C

AWS Encryption SDK for C에서 암호화 키링의 AWS KMS key를 식별하려면 키 ARN 또는 별칭 ARN을 지정합니다. 복호화 키링에서는 키 ARN을 사용해야 합니다. 자세한 내용은 AWS KMS 키링의 AWS KMS keys 식별 섹션을 참조하세요.

전체 예를 보려면 string.cpp를 참조하세요.

const char * generator_key = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" const char * additional_key = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" struct aws_cryptosdk_keyring *kms_encrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(generator_key,{additional_key});
C# / .NET

AWS Encryption SDK for .NET에서 하나 또는 여러 AWS KMS 키가 포함된 AWS KMS 키링을 만들려면 다중 키링을 생성하세요. AWS Encryption SDK for .NET에는 AWS KMS 키만을 위한 다중 키링이 포함되어 있습니다.

AWS Encryption SDK for .NET에서 암호화 키링에 대한 AWS KMS key를 지정하는 경우 키 ID, 키 ARN, 별칭 이름, 별칭 ARN과 같은 유효한 키 식별자를 사용할 수 있습니다. AWS KMS 키링에서 AWS KMS keys를 식별하는 데 도움이 필요하면 AWS KMS 키링의 AWS KMS keys 식별 섹션을 참조하세요.

다음 예제에서는 AWS Encryption SDK for .NET의 4.x 버전을 사용하여 생성기 키와 추가 키가 포함된 AWS KMS 키링을 생성합니다. 전체 예시는 .cs를 참조하십시오. AwsKmsMultiKeyringExample

// Instantiate the AWS Encryption SDK and material provider var mpl = new MaterialProviders(new MaterialProvidersConfig()); var esdk = new ESDK(new AwsEncryptionSdkConfig()); string generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; List<string> additionalKey = new List<string> { "alias/exampleAlias" }; // Instantiate the keyring input object var kmsEncryptKeyringInput = new CreateAwsKmsMultiKeyringInput { Generator = generatorKey, KmsKeyIds = additionalKey }; var kmsEncryptKeyring = materialProviders.CreateAwsKmsMultiKeyring(kmsEncryptKeyringInput);
JavaScript Browser

AWS Encryption SDK for JavaScript에서 암호화 키링에 대한 AWS KMS key를 지정하는 경우 키 ID, 키 ARN, 별칭 이름, 별칭 ARN과 같은 유효한 키 식별자를 사용할 수 있습니다. AWS KMS 키링에서 AWS KMS keys를 식별하는 데 도움이 필요하면 AWS KMS 키링의 AWS KMS keys 식별 섹션을 참조하세요.

전체 예제를 보려면 의 저장소에서 kms_simple.ts를 참조하십시오. AWS Encryption SDK for JavaScript GitHub

const clientProvider = getClient(KMS, { credentials }) const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' const additionalKey = 'alias/exampleAlias' const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey] })
JavaScript Node.js

AWS Encryption SDK for JavaScript에서 암호화 키링에 대한 AWS KMS key를 지정하는 경우 키 ID, 키 ARN, 별칭 이름, 별칭 ARN과 같은 유효한 키 식별자를 사용할 수 있습니다. AWS KMS 키링에서 AWS KMS keys를 식별하는 데 도움이 필요하면 AWS KMS 키링의 AWS KMS keys 식별 섹션을 참조하세요.

전체 예제를 보려면 의 저장소에 있는 kms_simple.ts를 참조하십시오. AWS Encryption SDK for JavaScript GitHub

const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' const additionalKey = 'alias/exampleAlias' const keyring = new KmsKeyringNode({ generatorKeyId, keyIds: [additionalKey] })
Java

에 하나 또는 여러 개의 AWS KMS 키가 있는 AWS KMS 키링을 만들려면 멀티 키링을 만드세요. AWS Encryption SDK for Java 키만 사용할 수 있는 멀티 키링이 AWS Encryption SDK for Java 포함되어 있습니다. AWS KMS

AWS Encryption SDK for Java에서 암호화 키링에 대한 AWS KMS key를 지정하는 경우 키 ID, 키 ARN, 별칭 이름, 별칭 ARN과 같은 유효한 키 식별자를 사용할 수 있습니다. AWS KMS 키링에서 AWS KMS keys를 식별하는 데 도움이 필요하면 AWS KMS 키링의 AWS KMS keys 식별 섹션을 참조하세요.

전체 예제를 보려면 의 저장소에 BasicEncryptionKeyringExample있는.java를 AWS Encryption SDK for Java 참조하십시오. GitHub

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; List<String> additionalKey = Collections.singletonList("alias/exampleAlias"); // Create the AWS KMS keyring final CreateAwsKmsMultiKeyringInput keyringInput = CreateAwsKmsMultiKeyringInput.builder() .generator(generatorKey) .kmsKeyIds(additionalKey) .build(); final IKeyring kmsKeyring = matProv.CreateAwsKmsMultiKeyring(keyringInput);

복호화를 위한 AWS KMS 키링 생성

AWS Encryption SDK가 반환하는 암호화된 메시지를 복호화할 때도 AWS KMS 키링을 지정합니다. 복호화 키링에서 AWS KMS keys를 지정하는 경우 AWS Encryption SDK는 해당 래핑 키만 사용하여 암호화된 메시지의 암호화된 데이터 키를 복호화합니다. (아무 AWS KMS keys도 지정하지 않는 AWS KMS 검색 키링을 사용할 수도 있습니다.)

암호를 복호화할 때 AWS Encryption SDK는 AWS KMS 키링에서 암호화된 데이터 키 중 하나를 복호화할 수 있는 AWS KMS key를 검색합니다. 특히 AWS Encryption SDK에서는 암호화된 메시지에서 암호화된 각 데이터 키에 대해 다음 패턴을 사용합니다.

  • AWS Encryption SDK는 암호화된 메시지의 메타데이터에서 데이터 키를 암호화한 AWS KMS key의 키 ARN을 가져옵니다.

  • AWS Encryption SDK는 복호화 키링에서 일치하는 키 ARN이 있는 AWS KMS key를 검색합니다.

  • 키링에서 일치하는 키 ARN이 있는 AWS KMS key를 찾으면 AWS Encryption SDK는 KMS 키를 사용하여 암호화된 데이터 키를 복호화하도록 AWS KMS에 요청합니다.

  • 그러지 않으면 암호화된 다음 데이터 키(있는 경우)로 건너뛰게 됩니다.

AWS Encryption SDK는 데이터 키를 암호화한 AWS KMS key의 키 ARN이 복호화 키링에 포함되어 있지 않으면 암호화된 데이터 키의 암호화 해제를 시도하지 않습니다. 암호화 해제 키링에 데이터 키를 암호화한 AWS KMS keys의 ARN이 포함되어 있지 않을 경우 AWS Encryption SDK는 AWS KMS를 호출하지 않고 암호화 해제 호출에 실패합니다.

version 1.7.x부터 암호화된 데이터 키를 복호화할 때 AWS Encryption SDK는 항상AWS KMS key 의 키 ARN을 AWS KMS 복호화 작업의 KeyId 파라미터에 전달합니다. 복호화 시 AWS KMS key를 식별하는 것은 사용하려는 래핑 키로 암호화된 데이터 키의 암호를 복호화하는 AWS KMS 모범 사례입니다.

AWS KMS 키링을 사용한 복호화 호출은 복호화 키링에, 암호화된 메시지의 암호화된 데이터 키 중 하나를 복호화할 수 있는 AWS KMS key가 적어도 한 개 이상 있어야 성공합니다. 또한 호출자는 이 AWS KMS key에 대한 kms:Decrypt 권한이 있어야 합니다. 이 동작을 사용하면 서로 다른 AWS 리전 및 계정의 여러 AWS KMS keys를 사용하여 데이터를 암호화할 수 있지만 특정 계정, 리전, 사용자, 그룹 또는 역할에 맞춰 보다 제한적인 복호화 키링을 제공할 수 있습니다.

복호화 키링에서 AWS KMS key를 지정하는 경우 해당 키 ARN을 사용해야 합니다. 그러지 않으면 AWS KMS key가 인식되지 않습니다. 키 ARN을 찾으려면 AWS Key Management Service 개발자 가이드키 ID 및 ARN 찾기를 참조하세요.

참고

복호화를 위해 암호화 키링을 재사용하는 경우 키링의 AWS KMS keys가 해당 키 ARN에 의해 식별되는지 확인합니다.

예를 들어, 다음 AWS KMS 키링은 암호화 키링에 사용된 추가 키만 포함합니다. 그러나 이 예제에서는 별칭(alias/exampleAlias)으로 추가 키를 참조하는 대신 복호화 호출에 필요한 추가 키의 키 ARN을 사용합니다.

추가 키를 사용하여 데이터를 복호화할 수 있는 권한이 있는 경우 이 키링을 사용하여 생성기 키와 추가 키로 암호화된 메시지를 복호화할 수 있습니다.

C
const char * additional_key = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" struct aws_cryptosdk_keyring *kms_decrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(additional_key);
C# / .NET

이 복호화 키링에는 AWS KMS 키가 하나만 포함되므로 예제에서는 CreateAwsKmsKeyring() 메서드를 해당 CreateAwsKmsKeyringInput 객체의 인스턴스와 함께 사용합니다. 단일 키 또는 다중 키 키링을 사용하여 하나의 AWS KMS 키로 AWS KMS 키링을 생성할 수 있습니다. 자세한 내용은 AWS Encryption SDK for .NET의 데이터 암호화 섹션을 참조하세요. 다음 예제에서는 AWS Encryption SDK for .NET 4.x 버전을 사용하여 복호화 AWS KMS 키링을 생성합니다.

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); string additionalKey = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; // Instantiate a KMS keyring for one AWS KMS key. var kmsDecryptKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = additionalKey }; var kmsDecryptKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const additionalKey = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' const keyring = new KmsKeyringBrowser({ clientProvider, keyIds: [additionalKey] })
JavaScript Node.js
const additionalKey = 'arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321' const keyring = new KmsKeyringNode({ keyIds: [additionalKey] })
Java

이 복호화 키링에는 AWS KMS 키가 하나만 포함되므로 예제에서는 CreateAwsKmsKeyring() 메서드를 해당 CreateAwsKmsKeyringInput 객체의 인스턴스와 함께 사용합니다. 단일 키 또는 다중 키 키링을 사용하여 하나의 AWS KMS 키로 AWS KMS 키링을 생성할 수 있습니다.

// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String additionalKey = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"; // Create a AwsKmsKeyring CreateAwsKmsKeyringInput kmsDecryptKeyringInput = CreateAwsKmsKeyringInput.builder() .generator(additionalKey) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);

또한 다음과 같이 복호화를 위한 생성기를 지정하는 AWS KMS 키링을 사용할 수도 있습니다. 복호화할 때는 생성기 키와 추가 키 간의 AWS Encryption SDK 구분을 무시합니다. 지정된 AWS KMS keys를 사용하여, 암호화된 데이터 키를 암호화 해제할 수 있습니다. AWS KMS 호출은 호출자가 해당 AWS KMS key를 사용하여 데이터를 암호화 해제할 수 있는 권한이 있어야만 성공합니다.

C
struct aws_cryptosdk_keyring *kms_decrypt_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(generator_key, {additional_key, other_key});
C# / .NET

다음 예제에서는 AWS Encryption SDK for .NET 4.x 버전을 사용합니다.

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); string generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; // Instantiate a KMS keyring for one AWS KMS key. var kmsDecryptKeyringInput = new CreateAwsKmsKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), KmsKeyId = generatorKey }; var kmsDecryptKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds: [additionalKey, otherKey] })
JavaScript Node.js
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds: [additionalKey, otherKey] })
Java
// Instantiate the AWS Encryption SDK and material providers final AwsCrypto crypto = AwsCrypto.builder().build(); final MaterialProviders materialProviders = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); String generatorKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; // Create a AwsKmsKeyring CreateAwsKmsKeyringInput kmsDecryptKeyringInput = CreateAwsKmsKeyringInput.builder() .generator(generatorKey) .kmsClient(KmsClient.create()) .build(); IKeyring kmsKeyring = materialProviders.CreateAwsKmsKeyring(kmsDecryptKeyringInput);

지정된 AWS KMS keys를 모두 사용하는 암호화 키링과 달리, 암호화된 메시지와 무관한 AWS KMS keys 및 호출자가 사용 권한이 없는 AWS KMS keys를 포함하는 암호화 해제 키링을 사용하여, 암호화된 메시지를 암호화 해제할 수 있습니다. 호출자가 필요한 권한이 없는 경우와 같이 AWS KMS에 대한 암호화 해제 호출이 실패하면 AWS Encryption SDK는 다음 암호화된 데이터 키로 건너뜁니다.

AWS KMS 검색 키링 사용

복호화할 때는 AWS Encryption SDK에서 사용할 수 있는 래핑 키를 지정하는 것이 모범 사례입니다. 이 모범 사례를 따르려면 AWS KMS 래핑 키를 지정한 키로 제한하는 AWS KMS 복호화 키링을 사용하세요. 그러나 AWS KMS 검색 키링, 즉 아무 래핑 키도 지정하지 않는 AWS KMS 키링을 만들 수도 있습니다.

AWS Encryption SDK는 표준 AWS KMS 검색 키링과 AWS KMS 다중 리전 키에 대한 검색 키링을 제공합니다. AWS Encryption SDK에서 다중 리전 키 사용에 관한 정보는 다중 리전 AWS KMS keys 사용 섹션을 참조하세요.

래핑 키를 지정하지 않기 때문에 검색 키링은 데이터를 암호화할 수 없습니다. 검색 키링을 사용하여 단독 또는 다중 키링으로 데이터를 암호화하는 경우 암호화 작업이 실패합니다. 단, AWS Encryption SDK for C에서 표준 검색 키링을 무시하지만 다중 리전 검색 키링을 단독 또는 다중 키링으로 지정하면 암호화 작업이 실패하는 경우는 예외입니다.

복호화 시 검색 키링은 AWS Encryption SDK가 AWS KMS key를 소유하거나 액세스할 수 있는 사용자와 관계없이 그것을 암호화한 AWS KMS key를 사용하여 암호화된 데이터 키를 복호화하도록 AWS KMS에 요청합니다. 호출자가 AWS KMS key에 대한 kms:Decrypt 권한이 있는 경우에만 호출이 성공합니다.

중요

복호화 다중 키링에 AWS KMS 검색 키링을 포함하는 경우 검색 키링이 다중 키링의 다른 키링에 지정된 모든 KMS 키 제한보다 우선 적용됩니다. 다중 키링은 제한이 가장 적은 키링처럼 동작합니다. AWS KMS 검색 키링은 단독으로 사용되거나 다중 키링에 사용되는 경우 암호화에 영향을 주지 않습니다.

AWS Encryption SDK는 편의를 위해 AWS KMS 검색 키링을 제공합니다. 단, 다음과 같은 이유로 가능하면 더 제한적인 키링을 사용하는 것이 좋습니다.

  • 신뢰성 - AWS KMS 검색 키링은 암호화된 메시지의 데이터 키를 암호화하는 데 사용된 모든 AWS KMS key를 사용할 수 있습니다. 따라서 호출자는 해당 AWS KMS key를 사용하여 복호화할 수 있는 권한이 있습니다. 이것이 호출자가 사용하려는 AWS KMS key가 아닐 수도 있습니다. 예를 들어, 암호화된 데이터 키 중 하나가 누구나 사용할 수 있어서 보안성이 약한 AWS KMS key를 사용하여 암호화되었을 수 있습니다.

  • 지연 시간 및 성능 – AWS KMS 검색 키링은 다른 AWS 계정 및 리전에서 AWS KMS keys로 암호화된 키와, 호출자에게 복호화 권한이 없는 AWS KMS keys를 포함하여 AWS Encryption SDK는 암호화된 모든 데이터 키를 복호화하려고 시도하기 때문에 다른 키링보다 느릴 수 있습니다.

검색 키링을 사용하는 경우 검색 필터를 사용하여 사용할 수 있는 KMS 키를 지정된 AWS 계정 및 파티션에 있는 키로 제한하는 것이 좋습니다. 검색 필터는 AWS Encryption SDK 버전 1.7.x 이상에서 지원됩니다. 계정 ID 및 파티션을 찾는 데 도움이 필요하면 AWS 일반 참조AWS 계정 식별자ARN 형식을 참조하세요.

다음 코드는 AWS Encryption SDK가 사용할 수 있는 KMS 키를 aws 파티션 및 111122223333 예제 계정의 KMS 키로 지정하는 검색 필터를 사용하여 AWS KMS 검색 키링을 인스턴스화합니다.

이 코드를 사용하기 전에 예제 AWS 계정와 파티션 값을 AWS 계정와 파티션에 유효한 값으로 바꾸세요. KMS 키가 중국 리전에 있는 경우 aws-cn 파티션 값을 사용하세요. KMS 키가 AWS GovCloud (US) Regions에 있는 경우 aws-us-gov 파티션 값을 사용하세요. 다른 AWS 리전에 있는 경우 aws 파티션 값을 사용하세요.

C

전체 예제는 kms_discovery.cpp를 참조하세요.

std::shared_ptr<KmsKeyring::> discovery_filter( KmsKeyring::DiscoveryFilter::Builder("aws") .AddAccount("111122223333") .Build()); struct aws_cryptosdk_keyring *kms_discovery_keyring = Aws::Cryptosdk::KmsKeyring::Builder() .BuildDiscovery(discovery_filter));
C# / .NET

다음 예제에서는 AWS Encryption SDK for .NET 4.x 버전을 사용합니다.

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // In a discovery keyring, you specify an AWS KMS client and a discovery filter, // but not a AWS KMS key var kmsDiscoveryKeyringInput = new CreateAwsKmsDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(), DiscoveryFilter = new DiscoveryFilter() { AccountIds = account, Partition = "aws" } }; var kmsDiscoveryKeyring = materialProviders.CreateAwsKmsDiscoveryKeyring(kmsDiscoveryKeyringInput);
JavaScript Browser

JavaScript에서는 검색 속성을 명시적으로 지정해야 합니다.

const clientProvider = getClient(KMS, { credentials }) const discovery = true const keyring = new KmsKeyringBrowser(clientProvider, { discovery, discoveryFilter: { accountIDs: [111122223333], partition: 'aws' } })
JavaScript Node.js

JavaScript에서는 검색 속성을 명시적으로 지정해야 합니다.

const discovery = true const keyring = new KmsKeyringNode({ discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
Java
// Create discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build(); // Create the discovery keyring CreateAwsKmsMrkDiscoveryMultiKeyringInput createAwsKmsMrkDiscoveryMultiKeyringInput = CreateAwsKmsMrkDiscoveryMultiKeyringInput.builder() .discoveryFilter(discoveryFilter) .build(); IKeyring decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);

AWS KMS 리전 검색 키링 사용

AWS KMS 리전 검색 키링은 KMS 키의 ARN을 지정하지 않는 키링입니다. 대신 AWS Encryption SDK가 특정 AWS 리전의 KMS 키만 사용하여 복호화할 수 있도록 허용합니다.

AWS KMS 리전 검색 키링을 사용하여 복호화할 경우, AWS Encryption SDK는 지정한 AWS 리전으로 암호화된 데이터 키를 복호화하도록 AWS KMS key에 요청합니다. 성공하려면 호출자는 데이터 키를 암호화하여 지정된 AWS 리전의 AWS KMS keys 중 하나 이상에 대한 kms:Decrypt 권한을 가지고 있어야 합니다.

다른 검색 키링과 마찬가지로 리전 검색 키링은 암호화에 영향을 주지 않습니다. 암호화된 메시지를 복호화할 때만 작동합니다. 암호화 및 복호화에 사용되는 다중 키링에서 리전 검색 키링을 사용하는 경우 복호화 시에만 유효합니다. 다중 리전 검색 키링을 사용하여 단독 또는 다중 키링으로 데이터를 암호화하는 경우 암호화 작업이 실패합니다.

중요

복호화 다중 키링에 AWS KMS 리전 검색 키링을 추가할 경우 리전 검색 키링이 다중 키링의 다른 키링에 지정된 모든 KMS 키 제한을 재정의합니다. 다중 키링은 제한이 가장 적은 키링처럼 동작합니다. AWS KMS 검색 키링은 단독으로 사용되거나 다중 키링에 사용되는 경우 암호화에 영향을 주지 않습니다.

AWS Encryption SDK for C의 리전 검색 키링은 지정된 리전의 KMS 키로만 복호화하도록 시도합니다. AWS Encryption SDK for JavaScript 및 AWS Encryption SDK for .NET에서 검색 키링을 사용하는 경우 AWS KMS 클라이언트에서 리전을 구성합니다. 이러한 AWS Encryption SDK 구현에서는 KMS 키를 리전별로 필터링하지 않지만 AWS KMS를 통한 지정된 리전 외부의 KMS 키에 대한 복호화 요청은 실패합니다.

검색 키링을 사용하는 경우 검색 필터를 사용하여 복호화된 KMS 키를 지정된 AWS 계정 및 파티션에 있는 키로 지정하는 것이 좋습니다. 검색 필터는 AWS Encryption SDK 버전 1.7.x 이상에서 지원됩니다.

예를 들어, 다음 코드는 검색 필터를 사용하여 AWS KMS 리전 검색 키링으로 만듭니다. 이 키링은 미국 서부(오리건) 리전(us-west-2)에서 111122223333 계정의 KMS 키로 AWS Encryption SDK를 지정합니다.

C

작동 예제에서 이 키링과 create_kms_client 메서드를 보려면 kms_discovery.cpp를 참조하세요.

std::shared_ptr<KmsKeyring::DiscoveryFilter> discovery_filter( KmsKeyring::DiscoveryFilter::Builder("aws") .AddAccount("111122223333") .Build()); struct aws_cryptosdk_keyring *kms_regional_keyring = Aws::Cryptosdk::KmsKeyring::Builder() .WithKmsClient(create_kms_client(Aws::Region::US_WEST_2)).BuildDiscovery(discovery_filter));
C# / .NET

AWS Encryption SDK for .NET에는 전용 리전 검색 키링이 없습니다. 단, 여러 기술을 사용하여 복호화할 때 사용되는 KMS 키를 특정 리전으로 제한할 수 있습니다.

검색 키링에서 리전을 제한하는 가장 효율적인 방법은 단일 리전 키만 사용하여 데이터를 암호화한 경우에도 다중 리전 인식 검색 키링을 사용하는 것입니다. 단일 리전 키가 발견되면 다중 리전 인식 키링은 다중 리전 기능을 사용하지 않습니다.

CreateAwsKmsMrkDiscoveryKeyring() 메서드에서 반환된 키링은 AWS KMS를 호출하기 전에 리전별로 KMS 키를 필터링합니다. CreateAwsKmsMrkDiscoveryKeyringInput 객체의 Region 파라미터로 지정된 리전에서 KMS 키로 암호화된 데이터 키를 암호화한 경우에만 AWS KMS에 복호화 요청을 보냅니다.

다음 예제에서는 AWS Encryption SDK for .NET 4.x 버전을 사용합니다.

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // Create the discovery filter var filter = DiscoveryFilter = new DiscoveryFilter { AccountIds = account, Partition = "aws" }; var regionalDiscoveryKeyringInput = new CreateAwsKmsMrkDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(RegionEndpoint.USWest2), Region = RegionEndpoint.USWest2, DiscoveryFilter = filter }; var kmsRegionalDiscoveryKeyring = materialProviders.CreateAwsKmsMrkDiscoveryKeyring(regionalDiscoveryKeyringInput);

AWS KMS클라이언트 인스턴스 () 에서 지역을 AWS 리전 지정하여 KMS 키를 특정 키로만 제한할 수도 있습니다. AmazonKeyManagementServiceClient 단, 이 구성은 multi-Region-aware 검색 키링을 사용하는 것보다 효율성이 떨어지고 비용이 더 많이 들 수 있습니다. AWS KMS를 호출하기 전에 리전별로 KMS 키를 필터링하는 대신 AWS Encryption SDK for .NET은 암호화된 각 데이터 키에 대해 AWS KMS를 호출하고(복호화할 때까지) AWS KMS를 사용하여 지정된 리전에 사용하는 KMS 키를 지정합니다.

다음 예제에서는 AWS Encryption SDK for .NET 4.x 버전을 사용합니다.

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); List<string> account = new List<string> { "111122223333" }; // Create the discovery filter, // but not a AWS KMS key var createRegionalDiscoveryKeyringInput = new CreateAwsKmsDiscoveryKeyringInput { KmsClient = new AmazonKeyManagementServiceClient(RegionEndpoint.USWest2), DiscoveryFilter = new DiscoveryFilter() { AccountIds = account, Partition = "aws" } }; var kmsRegionalDiscoveryKeyring = materialProviders.CreateAwsKmsDiscoveryKeyring(createRegionalDiscoveryKeyringInput);
JavaScript Browser
const clientProvider = getClient(KMS, { credentials }) const discovery = true const clientProvider = limitRegions(['us-west-2'], getKmsClient) const keyring = new KmsKeyringBrowser(clientProvider, { discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
JavaScript Node.js

작동 예제에서 이 키링과 limitRegions 및 함수를 보려면 kms_리전_discovery.ts를 참조하세요.

const discovery = true const clientProvider = limitRegions(['us-west-2'], getKmsClient) const keyring = new KmsKeyringNode({ clientProvider, discovery, discoveryFilter: { accountIDs: ['111122223333'], partition: 'aws' } })
Java
// Create the discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build(); // Create the discovery keyring CreateAwsKmsMrkDiscoveryMultiKeyringInput createAwsKmsMrkDiscoveryMultiKeyringInput = CreateAwsKmsMrkDiscoveryMultiKeyringInput.builder() .discoveryFilter(discoveryFilter) .regions("us-west-2") .build(); IKeyring decryptKeyring = matProv.CreateAwsKmsMrkDiscoveryMultiKeyring(createAwsKmsMrkDiscoveryMultiKeyringInput);

AWS Encryption SDK for JavaScript 또한 Node.js 및 브라우저에 대한 excludeRegions 함수를 내보냅니다. 이 함수는 특정 리전에서 AWS KMS keys를 생략하는 AWS KMS 리전 검색 키링을 만듭니다. 다음 예제에서는 미국 동부(버지니아 북부)(us-east-1)를 제외한 모든 AWS 리전의 111122223333 계정에서 AWS KMS keys를 사용할 수 있는 AWS KMS 리전 검색 키링을 만듭니다.

에는 유사한 방법이 없지만 사용자 지정을 생성하여 구현할 수 있습니다. AWS Encryption SDK for C ClientSupplier

이 예는 Node.js에 대한 코드를 보여줍니다.

const discovery = true const clientProvider = excludeRegions(['us-east-1'], getKmsClient) const keyring = new KmsKeyringNode({ clientProvider, discovery, discoveryFilter: { accountIDs: [111122223333], partition: 'aws' } })