翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS SDK for PHP バージョン 3 での Amazon S3 クライアント側の暗号化
クライアント側の暗号化を使用すると、ユーザーの環境内でデータは直接暗号化と復号が実行されます。つまり、Amazon S3 に転送する前にこのデータは暗号化されるので、暗号処理を外部サービスに依存しないで済みます。新しい実装では、 S3EncryptionClientV3と S3EncryptionClientV2、および廃止された S3EncryptionMultipartUploaderV2と S3EncryptionMultipartUploaderV3に対して S3EncryptionClientと を使用することをお勧めしますS3EncryptionMultipartUploader。非推奨バージョンを使用している古い実装では、移行を試みることをお勧めします。S3EncryptionClientV3 は、レガシーの S3EncryptionClient で暗号化されたデータの復号化をサポートしています。
はエンベロープ暗号化 AWS SDK for PHP を実装し、暗号化と復号に OpenSSL
移行ガイド
非推奨のクライアントから新しいクライアントに に移行しようとしているユーザーには、ここで v1 から v2 に移行するための移行ガイドと、ここで v2 から v3 に移行するための移行ガイドがあります。
セットアップ
クライアント側の暗号化の使用を開始するには、次が必要です。
サンプルコードを実行する前に、 AWS 認証情報を設定します。AWS SDK for PHP 「バージョン 3 の認証情報」を参照してください。
暗号化
で暗号化されたオブジェクトをアップロードするには、標準パラメータに加えて 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'), ]);
注記
'@CipherOptions' が正しく設定されていない場合、Amazon S3 および AWS KMSベースのサービスエラーに加えて、スローされたInvalidArgumentExceptionオブジェクトが表示されることがあります。
復号
オブジェクトのダウンロードと復号には、標準パラメータに加えて 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, ]);
注記
'@CipherOptions' が正しく設定されていない場合、Amazon S3 および AWS KMSベースのサービスエラーに加えて、スローされたInvalidArgumentExceptionオブジェクトが表示されることがあります。
暗号設定
-
'Cipher'(文字列) -
暗号化中に暗号化クライアントが使用する暗号メソッド。現時点では、'gcm' のみがサポートされています。
重要
PHP が バージョン 7.1 に更新されるとS3EncryptionClientV2 および S3EncryptionMultipartUploaderV2 で使用されています。ただし、大きな入力のパフォーマンスは、PHP 7.1 以降のネイティブ実装を使用するよりも、polyfill を使用した方がはるかに遅くなるため、それらを効果的に使用するには、古い PHP バージョン環境のアップグレードが必要になる場合があります。
-
'KeySize'(int) -
暗号化のために生成するコンテンツ暗号化キーの長さ。デフォルトは 256 ビットです。有効な設定オプションは 256 ビットです。
-
'Aad'(文字列) -
暗号化されたペイロードに含める「追加認証データ」(オプション)。この情報は復号時に検証されます。
Aadは「GCM」暗号化を使用する場合にのみ使用できます。
重要
追加の認証データはすべての AWS SDKs でサポートされていないため、他の SDKs はこのパラメータを使用して暗号化されたファイルを復号できない場合があります。
メタデータ戦略
Aws\Crypto\MetadataStrategyInterface を実装するクラスのインスタンスを提供するオプションもあります。このシンプルなインターフェイスは、エンベロープ暗号化マテリアルを含む Aws\Crypto\MetadataEnvelope の保存とロードを処理します。SDK は 2 つのクラスを実装します。Aws\S3\Crypto\HeadersMetadataStrategy と Aws\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, ]);
HeadersMetadataStrategy と InstructionFileMetadataStrategy に対するクラス名の定数は、::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 は暗号化のためにソースストリームを準備します。1 つ作成すると Aws\S3\MultipartUploader と Aws\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();
注記
'@CipherOptions' が正しく設定されていない場合、Amazon S3 および AWS KMSベースのサービスエラーに加えて、スローされたInvalidArgumentExceptionオブジェクトが表示されることがあります。