기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Amazon S3 암호화 클라이언트 마이그레이션(V2에서 V3로)
참고
Amazon S3 암호화 클라이언트의 V1을 사용하는 경우 V3로 마이그레이션하기 전에 먼저 V2로 마이그레이션해야 합니다. V3 Amazon S3 암호화 클라이언트 마이그레이션(V1에서 V2로)을(를) 참조하세요.
이 주제에서는 애플리케이션을 Amazon Simple Storage Service(Amazon S3) 암호화 클라이언트 버전 2(V2)에서 버전 3(V3)으로 마이그레이션하고 마이그레이션 프로세스 전반에 걸쳐 애플리케이션 가용성을 보장하는 방법을 보여줍니다. V3는 명령 파일의 데이터 키 변조를 방지하여 보안을 강화하는 ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY 알고리즘과 커밋 정책을 도입합니다.
마이그레이션 개요
이 마이그레이션은 다음 두 단계로 진행됩니다.
1. 새 형식을 읽도록 기존 클라이언트를 업데이트하세요. 먼저, AWS SDK for C++ 의 업데이트된 버전을 애플리케이션에 배포합니다. 이렇게 하면 기존 V2 암호화 클라이언트가 새 V3 클라이언트가 작성한 객체를 복호화할 수 있습니다. 애플리케이션에서 다중 AWS SDKs 사용하는 경우 각 SDK를 별도로 업그레이드해야 합니다.
2. 암호화 및 복호화 클라이언트를 V3로 마이그레이션합니다. 모든 V2 암호화 클라이언트가 새 형식을 읽을 수 있게 되면 기존 암호화 및 복호화 클라이언트를 해당 V3 버전으로 마이그레이션할 수 있습니다.
V3 개념 이해
Amazon S3 암호화 클라이언트 버전 3에는 데이터 키 변조에 대한 보호를 강화하는 새로운 보안 기능이 도입되었습니다. 이러한 개념을 이해하는 것은 성공적인 마이그레이션에 필수적입니다.
약정 정책
커밋 정책은 암호화 및 복호화 작업 중에 암호화 클라이언트가 키 커밋을 처리하는 방법을 제어합니다. V3는 다양한 마이그레이션 시나리오 및 보안 요구 사항을 지원하기 위한 세 가지 정책 옵션을 제공합니다.
FORBID_ENCRYPT_ALLOW_DECRYPT-
암호화 동작: V2와 동일한 알고리즘을 사용하여 키 커밋 없이 객체를 암호화합니다.
복호화 동작: 키 커밋을 사용하거나 사용하지 않고 암호화된 객체의 복호화를 허용합니다.
보안 영향:이 정책은 키 커밋을 적용하지 않으며 지침 파일에서 암호화된 데이터 키의 변조를 허용할 수 있습니다. 이 정책은 V2 클라이언트가 새로 암호화된 객체를 읽어야 하는 초기 마이그레이션 단계에서만 사용합니다.
버전 호환성:이 정책으로 암호화된 객체는 모든 V2 및 V3 구현에서 읽을 수 있습니다.
REQUIRE_ENCRYPT_ALLOW_DECRYPT(기본값)-
암호화 동작:
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY알고리즘을 사용하여 키 커밋으로 객체를 암호화합니다.복호화 동작: 키 커밋으로 암호화된 객체와 키 커밋 없이 암호화된 객체를 모두 복호화할 수 있습니다.
보안 영향:이 정책은 이전 객체를 읽을 때 이전 버전과의 호환성을 유지하면서 새로 암호화된 객체에 대한 강력한 보안을 제공합니다. 이는 대부분의 마이그레이션 시나리오에 권장되는 정책입니다.
버전 호환성:이 정책으로 암호화된 객체는 V3 및 최신 V2 구현에서만 읽을 수 있습니다. V2 클라이언트는 이러한 객체를 해독할 수 없습니다. 그러나이 정책을 사용하는 V3 클라이언트는 V2 클라이언트로 암호화된 객체를 복호화할 수 있습니다.
REQUIRE_ENCRYPT_REQUIRE_DECRYPT-
암호화 동작:
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY알고리즘을 사용하여 키 커밋으로 객체를 암호화합니다.복호화 동작: 키 커밋으로 암호화된 객체의 복호화만 허용합니다. 키 커밋 없이 암호화된 객체를 거부합니다.
보안 영향:이 정책은 모든 작업에 키 커밋을 적용하여 최고 수준의 보안을 제공합니다. 모든 객체가 키 커밋으로 다시 암호화되어 더 이상 레거시 V1 또는 V2 암호화 객체를 읽을 필요가 없는 경우에만이 정책을 사용합니다.
버전 호환성:이 정책으로 암호화된 객체는 V3 및 최신 V2 구현에서만 읽을 수 있습니다. 또한이 정책을 사용하는 클라이언트는 V1 또는 V2 클라이언트로 암호화된 객체를 해독할 수 없습니다.
마이그레이션 고려 사항: 마이그레이션 중에 V2 클라이언트가 새 객체를 읽어야 하는 FORBID_ENCRYPT_ALLOW_DECRYPT 경우 로 시작한 다음 모든 클라이언트가 V3로 업그레이드REQUIRE_ENCRYPT_ALLOW_DECRYPT되면 로 이동합니다. 마지막으로 모든 레거시 객체를 다시 암호화한 후에REQUIRE_ENCRYPT_REQUIRE_DECRYPT만 고려합니다.
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY 알고리즘
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY 알고리즘은 지침 파일에 저장된 암호화된 데이터 키에 대한 향상된 보안을 제공하는 V3에 도입된 새로운 암호화 알고리즘입니다.
지침 파일 영향: ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY 알고리즘은 암호화된 데이터 키를 포함한 암호화 메타데이터를 저장하는 별도의 S3 객체인 지침 파일에만 영향을 미칩니다. 객체 메타데이터에 암호화 메타데이터를 저장하는 객체(기본 스토리지 방법)는이 알고리즘 변경의 영향을 받지 않습니다.
변조 방지: ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY 알고리즘은 암호화된 데이터 키를 암호화 컨텍스트에 암호화 방식으로 바인딩하여 데이터 키 변조를 방지합니다. 이렇게 하면 공격자가 지침 파일에서 다른 암호화된 데이터 키를 대체하지 못하여 의도하지 않은 키로 복호화될 수 있습니다.
버전 호환성: ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY 알고리즘으로 암호화된 객체는 V3 복호화 지원이 포함된 SDK의 V3 구현 및 최신 V3 V2 전환 버전에서만 복호화할 수 있습니다.
주의
중요: ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY 알고리즘으로 암호화를 활성화하기 전에( REQUIRE_ENCRYPT_ALLOW_DECRYPT 또는 REQUIRE_ENCRYPT_REQUIRE_DECRYPT 커밋 정책을 사용하여) 이러한 객체를 읽을 모든 클라이언트가 V3 복호화를 지원하는 V3 또는 최신 V3 V2 전환 버전으로 업그레이드되었는지 확인해야 합니다. 먼저 모든 리더를 업그레이드하지 않으면 새로 암호화된 객체에 대한 복호화 실패가 발생합니다.
새 형식을 읽도록 기존 클라이언트를 업데이트하세요
먼저 기존 클라이언트를 최신 SDK 릴리스로 업데이트해야 합니다. 이 단계를 완료한 후 애플리케이션의 V2 클라이언트는 애플리케이션의 코드 기반을 업데이트하지 않고도 V3 암호화 클라이언트로 암호화된 객체를 해독할 수 있습니다.
최신 버전의 빌드 및 설치 AWS SDK for C++
소스에서 SDK를 사용하는 애플리케이션
소스 AWS SDK for C++ 에서를 빌드하고 설치하는 경우 GitHub의 aws/aws-sdk-cpp
1.11.x 이전 버전 AWS SDK for C++ 에서 업그레이드하는 경우 각 메이저 버전에 도입된 주요 변경 사항은이 변경 로그
Vcpkg에서 SDK를 사용하는 애플리케이션
애플리케이션에서 Vcpkg
다음 명령을 실행하여 aws-sdk-cpp 패키지를 업그레이드할 수 있습니다.
vcpkg upgrade aws-sdk-cpp
aws-sdk-cpp 패키지의 버전을 확인합니다.
vcpkg list aws-sdk-cpp
V3-encrypted 객체의 복호화를 지원하려면 버전이 1.11.x 이상이어야 합니다.
에서 Vcpkg을 사용하는 방법에 대한 자세한 내용은 섹션을 AWS SDK for C++참조하세요 패키지 관리자에서 AWS SDK for C++ 가져오기.
애플리케이션 빌드, 설치 및 배포
애플리케이션이에 정적으로 연결되어 있는 경우 애플리케이션에서 AWS SDK for C++코드 변경이 필요하지 않지만 최신 SDK 변경 사항을 사용하려면 애플리케이션을 다시 빌드해야 합니다. 동적 연결의 경우에는 이 단계가 필요하지 않습니다.
애플리케이션의 종속성 버전을 업그레이드하고 애플리케이션 기능을 확인한 후 플릿에 애플리케이션 배포를 진행합니다. 애플리케이션 배포가 완료되면 V3 암호화 및 복호화 클라이언트를 사용하도록 애플리케이션을 마이그레이션하는 다음 단계를 진행할 수 있습니다.
암호화 및 복호화 클라이언트를 V3로 마이그레이션
다음 단계에서는 Amazon S3 암호화 클라이언트의 V2에서 V3로 코드를 성공적으로 마이그레이션하는 방법을 보여줍니다. V3 코드 변경이 필요하므로 애플리케이션을에 정적으로 연결하든 동적으로 연결하든 관계없이 애플리케이션을 다시 빌드해야 합니다 AWS SDK for C++.
V3 암호화 클라이언트 사용
V3는 S3EncryptionClientV3 클래스 및를 도입CryptoConfigurationV3하여 V2에 상응하는 클래스를 대체합니다. V3의 주요 차이점은 다음과 같습니다.
-
V3는
KMSWithContextEncryptionMaterials(V2와 동일)를 사용하지만에서 명시적 구성이 필요합니다CryptoConfigurationV3. -
모든
PutObject작업에는 암호화 컨텍스트 맵이 필요합니다(비어 있을 수 있음). -
V3는 암호화 및 복호화 동작을 제어하는 커밋 정책을 도입합니다.
-
기본적으로 V3는
ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY알고리즘을 사용하여 키 커밋으로 암호화합니다. -
레거시 알고리즘 복호화 구성 API가에서
config.SetSecurityProfile(SecurityProfile::V2_AND_LEGACY);로 변경됩니다config.AllowLegacy();.
예: KMS 암호화를 사용하여 V2에서 V3로 마이그레이션
마이그레이션 전(V2)
// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV2", CUSTOMER_MASTER_KEY_ID); // Create V2 crypto configuration CryptoConfigurationV2 cryptoConfig(materials); // Create V2 encryption client S3EncryptionClientV2 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);
마이그레이션 중(이전 버전과의 호환성을 갖춘 V3)
// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration with materials CryptoConfigurationV3 cryptoConfig(materials); // Set commitment policy to maintain compatibility with V2 encrypted objects // This allows V3 clients to decrypt objects encrypted by the V2 client cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);
마이그레이션 후(키 커밋이 포함된 V3)
// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration with materials CryptoConfigurationV3 cryptoConfig(materials); // Use the default commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects // cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object with encryption context Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); encryptionContext.emplace("version", "1.11.0"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // Get object with encryption context GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(OBJECT_KEY); auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);
추가 예제
이 섹션에서는 다양한 마이그레이션 시나리오 및 요구 사항을 지원하도록 V3 암호화 클라이언트 옵션을 구성하는 추가 예제를 제공합니다.
레거시 지원 활성화
V3 클라이언트는 REQUIRE_ENCRYPT_ALLOW_DECRYPT 또는 FORBID_ENCRYPT_ALLOW_DECRYPT 커밋 정책을 사용하는 경우에만 V2 클라이언트로 암호화된 객체를 복호화할 수 있습니다. 그러나 V1 클라이언트로 암호화된 객체를 복호화해야 하는 경우 AllowLegacy() 메서드를 사용하여 레거시 지원을 명시적으로 활성화해야 합니다.
레거시 지원을 사용해야 하는 경우:
-
S3 암호화 클라이언트의 V1을 사용하여 암호화된 객체가 S3에 있습니다.
-
마이그레이션 프로세스 중에 V3 클라이언트를 사용하여 이러한 V1-encrypted 객체를 읽어야 합니다.
-
REQUIRE_ENCRYPT_ALLOW_DECRYPT또는FORBID_ENCRYPT_ALLOW_DECRYPT커밋 정책을 사용하고 있습니다.
주의
레거시 지원은 마이그레이션 중에 일시적으로만 활성화해야 합니다. 모든 V1 객체가 V2 또는 V3로 다시 암호화되면 보안을 극대화하기 위해 레거시 지원을 비활성화합니다.
예: 레거시 지원 활성화
// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration CryptoConfigurationV3 cryptoConfig(materials); // Enable legacy support to read V1 encrypted objects cryptoConfig.AllowLegacy(); // Set commitment policy (default is REQUIRE_ENCRYPT_REQUIRE_DECRYPT but we need to allow decryption) cryptoConfig.SetCommitmentPolicy(CommitmentPolicy::REQUIRE_ENCRYPT_ALLOW_DECRYPT); // Create V3 encryption client with legacy support enabled S3EncryptionClientV3 encryptionClient(cryptoConfig); // Now you can decrypt objects encrypted by V1, V2, and V3 clients GetObjectRequest getObjectRequest; getObjectRequest.SetBucket(BUCKET_NAME); getObjectRequest.SetKey(LEGACY_OBJECT_KEY); Aws::Map<Aws::String, Aws::String> encryptionContext; auto getOutcome = encryptionClient.GetObject(getObjectRequest, encryptionContext);
스토리지 방법 구성
S3 암호화 클라이언트는 객체 메타데이터(기본값) 또는 별도의 명령 파일이라는 두 가지 방법으로 암호화 메타데이터를 저장할 수 있습니다. 에서 메서드를 사용하여 스토리지 SetStorageMethod() 메서드를 구성할 수 있습니다CryptoConfigurationV3.
스토리지 방법 옵션:
METADATA(기본값)-
암호화 메타데이터는 객체의 메타데이터 헤더에 저장됩니다. 이는 모든 암호화 정보가 객체 자체와 함께 저장되므로 가장 일반적이고 편리한 방법입니다.
사용 시기: 대부분의 시나리오에서이 방법을 사용합니다. 암호화 메타데이터가 객체와 함께 이동하므로 객체 관리를 간소화합니다.
INSTRUCTION_FILE-
암호화 메타데이터는 접미사를 사용하여 별도의 S3 객체(지침 파일)에 저장됩니다
.instruction.사용 방법: 객체 메타데이터 크기가 문제가 되거나 암호화된 객체와 암호화 메타데이터를 분리해야 하는 경우이 방법을 사용합니다. 지침 파일을 사용하려면 S3 객체(암호화된 객체와 해당 명령 파일)를 하나 대신 관리해야 합니다.
예: 스토리지 방법 구성
// Create encryption materials auto materials = Aws::MakeShared<KMSWithContextEncryptionMaterials>("s3EncryptionV3", CUSTOMER_MASTER_KEY_ID); // Create V3 crypto configuration CryptoConfigurationV3 cryptoConfig(materials); // Option 1: Use metadata storage (default, can be omitted) cryptoConfig.SetStorageMethod(StorageMethod::METADATA); // Option 2: Use instruction file storage cryptoConfig.SetStorageMethod(StorageMethod::INSTRUCTION_FILE); // Create V3 encryption client with the configured storage method S3EncryptionClientV3 encryptionClient(cryptoConfig); // Put object - encryption metadata will be stored according to the configured method Aws::Map<Aws::String, Aws::String> encryptionContext; encryptionContext.emplace("client", "aws-sdk-cpp"); PutObjectRequest putObjectRequest; putObjectRequest.SetBucket(BUCKET_NAME); putObjectRequest.SetKey(OBJECT_KEY); // Set object body... auto putOutcome = encryptionClient.PutObject(putObjectRequest, encryptionContext); // If using INSTRUCTION_FILE, a separate object with key "OBJECT_KEY.instruction" will be created
참고
INSTRUCTION_FILE 스토리지 방법을 사용할 때는 암호화된 객체를 삭제해도 명령 파일이 자동으로 삭제되지 않습니다. 두 객체를 별도로 관리해야 합니다.