AWS SDK for PHP 버전 3의 Amazon S3 클라이언트 측 암호화 - AWS SDK for PHP

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

AWS SDK for PHP 버전 3의 Amazon S3 클라이언트 측 암호화

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

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

마이그레이션 가이드

더 이상 사용되지 않는 클라이언트에서 새 클라이언트로 마이그레이션하려는 사용자를 위해 v1에서 v2로 마이그레이션하는 마이그레이션 가이드와 v2에서 v3로 마이그레이션하는 마이그레이션 가이드가 있습니다.

설정

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

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

암호화(Encryption)

에 암호화된 객체를 업로드하면 표준 파라미터 외에 4개의 추가 PutObject 파라미터가 S3EncryptionClientV3 사용됩니다.

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

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

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

  • @CommitmentPolicy는 키 커밋 또는 키 커밋 없이 객체를 읽는 방법과 키 커밋 또는 키 커밋 없이 객체를 쓰는 방법을 지정하는 정책 옵션입니다.

use Aws\S3\S3Client; use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\Kms\KmsClient; use Aws\Crypto\KmsMaterialsProviderV3; // Let's construct our S3EncryptionClient using an S3Client $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( 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, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
참고

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

해독

객체 다운로드 및 복호화에는 표준 파라미터 외에도 5개의 추가 GetObject 파라미터가 있으며,이 중 2개가 필요합니다. 클라이언트는 기본 암호 옵션을 자동으로 검색합니다.

  • '@SecurityProfile': 'V3'로 설정된 경우 V3-compatible으로 암호화된 객체만

    형식을 해독할 수 있습니다. 이 파라미터를 'V3_AND_LEGACY'로 설정하면 V1-compatible 형식으로 암호화된 객체도 해독할 수 있습니다. 마이그레이션을 지원하려면 @SecurityProfile을 'V3_AND_LEGACY'로 설정합니다. 새 애플리케이션 개발에만 'V3'를 사용합니다.

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

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

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

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

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

    사용할 암호 및 키 크기.

  • @CommitmentPolicy를 사용하여 객체를 읽는 방법을 지정하는 정책 옵션

    키 커밋 또는 키 커밋 없음 및 키 커밋 또는 키 커밋 없이 객체를 작성하는 방법.

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

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

암호 구성

'Cipher'(문자열)

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

중요

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

'KeySize' (int)

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

'Aad'(문자열)

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

중요

추가 인증 데이터는 모든 AWS SDKs에서 지원되지 않으므로 다른 SDKs는이 파라미터를 사용하여 암호화된 파일을 해독하지 못할 수 있습니다.

메타데이터 전략

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, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@KmsEncryptionContext' => [], '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => false, '@MaterialsProvider' => $materialsProvider, '@SecurityProfile' => 'V3', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => $strategy, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

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

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

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

멀티파트 업로드

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

$kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( 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 S3EncryptionMultipartUploaderV3( new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), fopen('large-file-to-encrypt.txt', 'r'), [ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', 'bucket' => $bucket, 'key' => $key, ] ); $multipartUploader->upload();
참고

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