AWS SDK for PHP 버전 3를 사용한 Amazon S3 클라이언트측 암호화 - AWS SDK for PHP

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

AWS SDK for PHP 버전 3를 사용한 Amazon S3 클라이언트측 암호화

클라이언트 측 암호화를 사용하여 사용자 환경에서 직접 데이터를 암호화 및 암호화 해제합니다. 즉, 이 데이터를 Amazon S3에 전송하기 이전에 암호화하므로 암호화 처리를 위해 외부 서비스를 이용할 필요가 없습니다. 새 구현의 경우 더 이상 사용되지 않는 S3EncryptionClientS3EncryptionMultipartUploader 대신 S3EncryptionClientV2S3EncryptionMultipartUploaderV2를 사용하는 것이 좋습니다. 더 이상 사용되지 않는 버전을 계속 사용하고 있는 이전 구현에서는 마이그레이션을 시도하는 것이 좋습니다. S3EncryptionClientV2S3EncryptionClient 레거시를 사용하여 암호화된 데이터의 암호 해독에 대한 지원을 유지합니다.

AWS SDK for PHP는 봉투 암호화를 구현하고 OpenSSL을 사용하여 암호화 및 암호화 해제를 수행합니다. 구현은 지원하는 기능이 일치하는 다른 SDK와 상호 연동이 가능합니다. SDK의 promise 기반 비동기 워크플로와도 호환됩니다.

마이그레이션 가이드

더 이상 사용되지 않는 클라이언트에서 새 클라이언트로 마이그레이션하려는 사용자를 위해 여기에서 마이그레이션 안내서를 찾을 수 있습니다.

설정

클라이언트 측 암호화를 시작하려면 다음이 필요합니다.

예제 코드를 실행하기 전에 AWS 보안 인증을 구성합니다. AWS SDK for PHP 버전 3의 보안 인증을 참조하세요.

암호화

암호화된 객체를 업로드하려면 표준 PutObject 매개변수 외에 다음과 같은 S3EncryptionClientV2의 세 가지 추가 매개변수가 필요합니다.

  • '@KmsEncryptionContext'는 암호화된 객체에 추가 보안 계층을 추가하는 데 사용할 수 있는 키-값 쌍입니다. 암호화 클라이언트는 동일한 키를 전달해야 하며, 이 키는 get 호출 시 자동으로 전달됩니다. 추가 컨텍스트가 필요하지 않은 경우 빈 배열을 전달하세요.

  • @CipherOptions는 사용할 암호와 키 크기를 포함한 암호화를 위한 추가 구성입니다.

  • @MaterialsProvider는 암호 키 및 초기화 벡터 생성과 암호 키 암호화를 처리할 뿐만 아니라 암호 키를 암호화는 공급자입니다.

use Aws\S3\S3Client; use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\Kms\KmsClient; use Aws\Crypto\KmsMaterialsProviderV2; // Let's construct our S3EncryptionClient using an S3Client $encryptionClient = new S3EncryptionClientV2( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, // Additional configuration options ]; $result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
참고

'@CipherOptions'를 올바르게 구성하지 않을 경우 Amazon S3 및 AWS KMS 기반 서비스 오류 이외에 InvalidArgumentException 객체가 발생될 수 있습니다.

해독

객체 다운로드 및 암호 해독에는 GetObject 표준 매개 변수 외에 네 개의 추가 매개 변수가 있으며 그 중 두 개는 필수 매개 변수입니다. 클라이언트는 기본 암호 옵션을 자동으로 검색합니다.

  • '@SecurityProfile': 'V2'로 설정하면 V2와 호환되도록 암호화된 객체만

    형식을 해독할 수 있습니다. 이 매개변수를 'V2_AND_LEGACY'로 설정하면 V1 호환 형식으로 암호화된 객체도 해독할 수 있습니다. 마이그레이션을 지원하려면 @SecurityProfile를 'V2_AND_LEGACY'로 설정하세요. 'V2'는 새 애플리케이션 개발에만 사용하세요.

  • '@MaterialsProvider'는 다음과 같이 암호 키 및 초기화 벡터 생성을 처리하는 공급자입니다.

    암호 키 암호화도 마찬가지입니다.

  • '@KmsAllowDecryptWithAnyCmk': (선택 사항) 이 매개변수를 true로 설정하면 복호화가 활성화됩니다.

    MaterialsProvider의 생성자에 KMS 키 ID를 제공하지 않아도 됩니다. 기본값은 false입니다.

  • '@CipherOptions'(선택 사항)은 다음을 포함한 암호화를 위한 추가 구성입니다.

    사용할 암호 및 키 크기.

$result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
참고

'@CipherOptions'가 올바르게 구성하지 않으면 Amazon S3 및 Amazon S3 기반 서비스 오류 외에 InvalidArgumentException 객체가 발생될 수 있습니다.

암호 구성

'Cipher'(문자열)

암호화 중에 암호화 클라이언트에서 사용되는 암호 메서드입니다. 현재는 'gcm'만 지원됩니다.

중요

PHP는 GCM 암호화를 위해 OpenSSL을 사용하여 암호화해독하는 데 필요한 추가 매개변수를 포함하도록 버전 7.1로 업데이됩니다. PHP 버전 7.0 및 이전 버전의 경우 GCM 지원을 위한 폴리필이 제공되어 암호화 클라이언트 S3EncryptionClientV2S3EncryptionMultipartUploaderV2에서 사용됩니다. 그러나 대규모 입력의 경우 폴리필을 사용하면 PHP 7.1+의 기본 구현을 사용하는 것보다 성능이 훨씬 느려지므로 효과적으로 사용하려면 이전 PHP 버전 환경을 업그레이드해야 할 수 있습니다.

'KeySize' (int)

암호화를 위해 생성할 콘텐츠 암호화 키의 길이입니다. 기본값은 256비트입니다. 유효한 구성 옵션은 256 및 128입니다.

'Aad'(문자열)

암호화된 페이로드와 함께 포함할 선택적 '추가 인증 데이터'입니다. 이 정보는 암호화를 풀 때 확인됩니다. Aad는 'gcm' 암호를 사용할 경우에만 사용할 수 있습니다.

중요

모든 AWS SDK에서 추가 인증 데이터를 지원하는 것은 아니므로 다른 SDK에서는 이 매개변수로 암호화된 파일을 해독하지 못할 수 있습니다.

메타데이터 전략

Aws\Crypto\MetadataStrategyInterface를 구현하는 클래스의 인스턴스를 제공할 수도 있습니다. 이 간단한 인터페이스는 봉투 암호화 자료를 포함하는 Aws\Crypto\MetadataEnvelope의 저장 및 로드를 처리합니다. SDK는 이를 구현하는 Aws\S3\Crypto\HeadersMetadataStrategyAws\S3\Crypto\InstructionFileMetadataStrategy 클래스를 제공합니다. 기본적으로 HeadersMetadataStrategy가 사용됩니다.

$strategy = new InstructionFileMetadataStrategy( $s3Client ); $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => $strategy, '@KmsEncryptionContext' => [], '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => false, '@MaterialsProvider' => $materialsProvider, '@SecurityProfile' => 'V2', '@MetadataStrategy' => $strategy, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

HeadersMetadataStrategyInstructionFileMetadataStrategy의 클래스 이름 상수는 ::class 를 호출하여 제공할 수도 있습니다.

$result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => HeadersMetadataStrategy::class, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
참고

지침 파일을 업로드한 이후에 오류가 발생하는 경우 지침 파일이 자동으로 삭제됩니다.

멀티파트 업로드

클라이언트 측 암호화를 사용하여 멀티파트 업로드를 수행할 수도 있습니다. Aws\S3\Crypto\S3EncryptionMultipartUploaderV2는 업로드 전에 암호화를 위해 소스 스트림을 준비합니다. Aws\S3\MultipartUploaderAws\S3\Crypto\S3EncryptionClientV2를 사용할 때와 비슷한 방식으로 생성합니다. S3EncryptionMultipartUploaderV2'@MetadataStrategy'와 동일한 S3EncryptionClientV2 옵션과 모든 사용 가능한 '@CipherOptions' 구성을 처리할 수 있습니다.

$kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( new KmsClient([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-upload-key'; $cipherOptions = [ 'Cipher' => 'gcm' 'KeySize' => 256, // Additional configuration options ]; $multipartUploader = new S3EncryptionMultipartUploaderV2( new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), fopen('large-file-to-encrypt.txt', 'r'), [ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'bucket' => $bucket, 'key' => $key, ] ); $multipartUploader->upload();
참고

'@CipherOptions'를 올바르게 구성하지 않을 경우 Amazon S3 및 AWS KMS 기반 서비스 오류 이외에 InvalidArgumentException 객체가 발생될 수 있습니다.