AWS SDK for PHP バージョン 3 による Amazon S3 クライアント側の暗号化 - AWS SDK for PHP

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS SDK for PHP バージョン 3 による Amazon S3 クライアント側の暗号化

クライアント側の暗号化を使用すると、ユーザーの環境内でデータは直接暗号化と復号が実行されます。つまり、Amazon S3 に転送する前にこのデータは暗号化されるので、暗号処理を外部サービスに依存しないで済みます。新規に実装する場合は、非推奨の S3EncryptionClientS3EncryptionMultipartUploader ではなく、S3EncryptionClientV2S3EncryptionMultipartUploaderV2 の使用をお勧めします。非推奨バージョンを使用している古い実装では、移行を試みることをお勧めします。S3EncryptionClientV2 は、レガシーの S3EncryptionClient で暗号化されたデータの復号化をサポートしています。

AWS SDK for PHP はエンベロープ暗号化を実装し、暗号化と復号に OpenSSL を使用します。この実装はこのサポート機能に適合する他の SDK と相互運用可能です。また、SDK の promise ベースの非同期ワークフローと互換性があります。

移行ガイド

非推奨のクライアントから新しいクライアントへの移行を考えている場合は、こちらの移行ガイドを参照してください。

設定

クライアント側の暗号化の使用を開始するには、次が必要です。

サンプルコードを実行する前に、AWS の認証情報を設定します。AWS SDK for PHP バージョン 3 の認証情報を参照してください。

暗号化

S3EncryptionClientV2 で暗号化されたオブジェクトをアップロードするには、標準の PutObject パラメータに加えて、さらに 3 つのパラメータが必要です。

  • '@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'), ]);
注記

Amazon S3 および AWS KMS ベースサービスのエラーに加えて、'@CipherOptions' が正しく設定されていない場合、スローされた InvalidArgumentException オブジェクトを受け取ることがあります。

復号

オブジェクトのダウンロードと復号化には、標準の GetObject パラメータに加えて、4 つの追加パラメータがあり、そのうち 2 つは必須です。クライアントは基本的な暗号オプションを検出します。

  • '@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, ]);
注記

Amazon S3 および AWS KMS ベースサービスのエラーに加えて、'@CipherOptions' が正しく設定されていない場合、スローされた InvalidArgumentException オブジェクトを受け取ることがあります。

暗号設定

'Cipher' (文字列)

暗号化中に暗号化クライアントが使用する暗号メソッド。現時点では、'gcm' のみがサポートされています。

重要

PHP が バージョン 7.1 に更新されると GCM 暗号向け OpenSSL を使用して 暗号化および復号するために必要な追加のパラメーターが含まれます。PHP バージョン 7.0 以前では、GCM サポート用の polyfill が提供されており、暗号化クライアント S3EncryptionClientV2 および S3EncryptionMultipartUploaderV2 で使用されています。ただし、大きな入力のパフォーマンスは、PHP 7.1 以降のネイティブ実装を使用するよりも、polyfill を使用した方がはるかに遅くなるため、それらを効果的に使用するには、古い PHP バージョン環境のアップグレードが必要になる場合があります。

'KeySize' (int)

暗号化のために生成するコンテンツ暗号化キーの長さ。デフォルトは 256 ビットです。有効な設定オプションは 256 および 128 です。

'Aad' (文字列)

暗号化されたペイロードに含める「追加認証データ」(オプション)。この情報は復号時に検証されます。Aad は「GCM」暗号化を使用する場合にのみ使用できます。

重要

追加の認証データはすべての AWS SDK でサポートされているわけではないので、他のSDK ではこのパラメータを使用して暗号化されたファイルを復号化できない可能性があります。

メタデータ戦略

Aws\Crypto\MetadataStrategyInterface を実装するクラスのインスタンスを提供するオプションもあります。このシンプルなインターフェイスは、エンベロープ暗号化マテリアルを含む Aws\Crypto\MetadataEnvelope の保存とロードを処理します。SDK は 2 つのクラスを実装します。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 は暗号化のためにソースストリームを準備します。1 つ作成すると 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();
注記

Amazon S3 および AWS KMS ベースサービスのエラーに加えて、'@CipherOptions' が正しく設定されていない場合、スローされた InvalidArgumentException オブジェクトを受け取ることがあります。