Migrasi Klien Enkripsi Amazon S3 (V2 ke V3) di Versi 3 AWS SDK untuk PHP - AWS SDK untuk PHP

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Migrasi Klien Enkripsi Amazon S3 (V2 ke V3) di Versi 3 AWS SDK untuk PHP

catatan

Jika Anda menggunakan Versi 1 (V1) klien enkripsi Amazon S3, Anda harus terlebih dahulu bermigrasi ke Versi 2 (V2) sebelum bermigrasi ke Versi 3 (V3). Lihat Migrasi Klien Enkripsi Amazon S3 (V1 ke V2) di Versi 3 AWS SDK untuk PHP.

Topik ini menunjukkan cara memigrasikan aplikasi Anda dari klien enkripsi Amazon Simple Storage Service (Amazon S3) ke Versi 2 (V3) Amazon Simple Storage Service (Amazon S3) ke Versi 3 (V3), dan memastikan ketersediaan aplikasi selama proses migrasi. Versi 3 memperkenalkan AES GCM dengan Kebijakan Komitmen dan Komitmen Utama untuk meningkatkan keamanan dan melindungi terhadap gangguan kunci data.

Ikhtisar migrasi

Migrasi ini terjadi dalam dua fase:

1. Perbarui klien yang ada untuk membaca format baru. Pertama, gunakan versi terbaru dari aplikasi AWS SDK untuk PHP Anda. Ini memungkinkan klien enkripsi V2 yang ada untuk mendekripsi objek yang ditulis oleh klien V3 baru. Jika aplikasi Anda menggunakan beberapa AWS SDKs, Anda harus memutakhirkan setiap SDK secara terpisah.

2. Migrasikan enkripsi dan dekripsi klien ke V3. Setelah semua klien enkripsi V2 Anda dapat membaca format baru, Anda dapat memigrasikan klien enkripsi dan dekripsi yang ada ke versi V3 masing-masing.

Memahami konsep V3

Versi 3 dari klien enkripsi Amazon S3 memperkenalkan dua peningkatan keamanan utama: Kebijakan Komitmen dan AES GCM dengan algoritma Komitmen Kunci. Memahami konsep-konsep ini sangat penting untuk migrasi yang sukses.

Kebijakan Komitmen

Kebijakan Komitmen mengontrol cara klien enkripsi menangani komitmen utama selama operasi enkripsi dan dekripsi. Versi 3 menyediakan tiga opsi kebijakan:

FORBID_ENCRYPT_ALLOW_DECRYPT

Perilaku enkripsi: Mengenkripsi objek tanpa komitmen utama.

Perilaku dekripsi: Memungkinkan dekripsi objek yang dienkripsi dengan atau tanpa komitmen kunci.

Implikasi keamanan: Kebijakan ini tidak memberlakukan komitmen utama pada objek yang baru dienkripsi, yang memungkinkan perusakan kunci data. Gunakan kebijakan ini hanya selama fase migrasi awal ketika Anda perlu mempertahankan kompatibilitas dengan klien V2.

Kompatibilitas versi: Objek yang dienkripsi dengan kebijakan ini dapat dibaca oleh semua implementasi V2 dan V3.

REQUIRE_ENCRYPT_ALLOW_DECRYPT

Perilaku enkripsi: Mengenkripsi objek dengan komitmen utama menggunakan algoritma. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

Perilaku dekripsi: Memungkinkan dekripsi objek yang dienkripsi dengan atau tanpa komitmen kunci.

Implikasi keamanan: Kebijakan ini memberikan keamanan yang ditingkatkan untuk objek yang baru dienkripsi sambil mempertahankan kemampuan untuk membaca objek yang ada. Ini adalah kebijakan yang direkomendasikan untuk sebagian besar skenario migrasi.

Kompatibilitas versi: Objek yang dienkripsi dengan kebijakan ini hanya dapat dibaca oleh V3 dan implementasi V2 terbaru.

Pertimbangan migrasi: Sebelum menggunakan kebijakan ini, pastikan semua klien yang perlu membaca objek terenkripsi telah ditingkatkan ke V3 atau V2 terbaru.

REQUIRE_ENCRYPT_REQUIRE_DECRYPT

Perilaku enkripsi: Mengenkripsi objek dengan komitmen utama menggunakan algoritma. ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY

Perilaku dekripsi: Hanya memungkinkan dekripsi objek yang dienkripsi dengan komitmen utama. Objek yang dienkripsi tanpa komitmen kunci akan gagal didekripsi.

Implikasi keamanan: Kebijakan ini memberikan tingkat keamanan tertinggi dengan menegakkan komitmen utama untuk enkripsi dan dekripsi. Gunakan kebijakan ini hanya setelah semua objek dimigrasi untuk menggunakan komitmen utama.

Kompatibilitas versi: Hanya implementasi V3 yang dapat menggunakan kebijakan ini. Mencoba mendekripsi objek terenkripsi V1 atau V2 dengan kebijakan ini akan gagal.

Pertimbangan migrasi: Kebijakan ini hanya boleh digunakan setelah menyelesaikan migrasi penuh dan mengenkripsi ulang semua objek yang ada dengan komitmen utama.

AES GCM dengan Komitmen Utama

Algoritma AES GCM with Key Commitment (ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY) adalah algoritma enkripsi baru yang diperkenalkan di V3 yang memberikan perlindungan terhadap serangan gangguan kunci data.

Peningkatan keamanan: ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY melindungi terhadap gangguan kunci data dengan mengikat kunci data secara kriptografis ke konten terenkripsi. Ini mencegah penyerang mengganti kunci data yang berbeda selama dekripsi, yang dapat menyebabkan dekripsi data yang tidak diinginkan.

Kompatibilitas versi: Objek yang dienkripsi hanya ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY dapat didekripsi oleh V3 dan implementasi V2 terbaru dari klien enkripsi Amazon S3. Klien V1 tidak dapat mendekripsi objek yang dienkripsi dengan algoritma ini.

penting

Persyaratan peningkatan: Sebelum mengaktifkan enkripsi dengan ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY (dengan menggunakan kebijakan REQUIRE_ENCRYPT_ALLOW_DECRYPT atau REQUIRE_ENCRYPT_REQUIRE_DECRYPT), Anda harus memastikan bahwa semua klien yang perlu membaca objek terenkripsi telah ditingkatkan ke V3. Kegagalan untuk meng-upgrade semua pembaca akan mengakibatkan kegagalan dekripsi untuk objek yang dienkripsi dengan komitmen utama.

Perbarui klien yang ada untuk membaca format baru

Klien enkripsi V3 menggunakan algoritma enkripsi dan fitur komitmen utama yang tidak didukung oleh versi klien yang lebih lama. Langkah pertama dalam migrasi adalah memperbarui klien dekripsi V2 Anda ke rilis SDK terbaru. Setelah menyelesaikan langkah ini, klien V2 aplikasi Anda akan dapat mendekripsi objek yang dienkripsi oleh klien enkripsi V3. Lihat detail di bawah untuk setiap metode instalasi AWS SDK untuk PHP.

Membangun dan menginstal versi SDK terbaru

Untuk menyelesaikan migrasi ini, Anda harus menggunakan versi terbaru dari aws/aws-sdk-php paket yang menyertakan dukungan klien enkripsi V3.

Instalasi dari Komposer

Untuk proyek yang diinstal menggunakan Composer, dalam file Composer, perbarui paket SDK ke versi terbaru SDK dan kemudian jalankan perintah berikut.

composer update aws/aws-sdk-php

Menginstal Menggunakan File Phar atau Zip

Gunakan salah satu metode berikut. Pastikan untuk menempatkan file SDK yang diperbarui di lokasi yang diperlukan oleh kode Anda, yang ditentukan oleh pernyataan require.

Untuk proyek yang diinstal menggunakan file Phar, unduh file yang diperbarui: aws.phar.

<?php require '/path/to/aws.phar'; ?>

Untuk proyek yang diinstal menggunakan file Zip, unduh file yang diperbarui: .

<?php require '/path/to/aws-autoloader.php'; ?>

Membangun, menginstal, dan menyebarkan aplikasi

Setelah memperbarui SDK, buat kembali dan terapkan ulang aplikasi Anda untuk memastikan semua komponen menggunakan versi yang diperbarui. Langkah ini sangat penting untuk memastikan bahwa klien V2 Anda dapat membaca objek yang dienkripsi oleh klien V3.

Ikuti prosedur penerapan standar organisasi Anda untuk meluncurkan aplikasi yang diperbarui. Pastikan semua instance aplikasi Anda diperbarui sebelum melanjutkan untuk memigrasikan klien enkripsi dan dekripsi Anda ke V3.

Setelah penerapan, verifikasi bahwa aplikasi Anda masih dapat mendekripsi objek yang ada dan tidak ada kesalahan yang terjadi selama operasi normal. Ini mengonfirmasi bahwa pembaruan SDK berhasil dan aplikasi Anda siap untuk fase migrasi berikutnya.

Migrasikan klien Enkripsi dan Dekripsi ke V3

Setelah memperbarui klien Anda untuk membaca format enkripsi baru, Anda dapat memperbarui aplikasi Anda ke klien enkripsi dan dekripsi V3. Contoh berikut menunjukkan cara memigrasi kode Anda dari V2 ke V3 dengan sukses.

Menggunakan Klien Enkripsi V3

V3 memperkenalkan S3EncryptionClientV3 kelas dan KmsMaterialsProviderV3 untuk menggantikan setara V2. Perbedaan utama dalam V3 adalah:

  • V3 menggunakan KmsMaterialsProviderV3 (sama seperti V2) tetapi memverifikasi konteks enkripsi saat mendekripsi objek dalam panggilan. GetObject

  • V3 memperkenalkan Kebijakan Komitmen untuk mengontrol perilaku enkripsi dan dekripsi.

Contoh: Migrasi dari V2 ke V3 dengan Enkripsi KMS

Pra-migrasi (V2)

use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV2; use Aws\Kms\KmsClient; $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, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@CommitmentPolicy' => 'FORBID_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

Selama migrasi (V3 dengan kompatibilitas mundur)

use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; // Create V3 encryption client $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); // Create encryption materials $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, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3_AND_LEGACY', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

Pasca-migrasi (V3 dengan komitmen utama)

use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; // Create V3 encryption client $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); // Create encryption materials $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, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, // Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3', // Use the commitment policy (REQUIRE_ENCRYPT_REQUIRE_DECRYPT) // This encrypts with key commitment and does not decrypt V2 objects '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

Perbedaan utama dalam V3:

  • Gunakan KmsMaterialsProviderV3 alih-alih KmsMaterialsProviderV2

  • @KmsEncryptionContextParameter masih diperlukan untuk putObject operasi

  • @KmsEncryptionContextParameter ini opsional untuk getObject operasi dan akan memverifikasi bahwa konteks enkripsi yang disediakan cocok dengan yang ada di objek.

  • @SecurityProfileParameter mengontrol versi enkripsi mana yang dapat didekripsi. Setel 'V3_AND_LEGACY' untuk mendukung membaca objek terenkripsi V1 dan V2 selama migrasi

  • @CommitmentPolicyParameter mengontrol kebijakan komitmen untuk operasi ini. Setel 'FORBID_ENCRYPT_ALLOW_DECRYPT' untuk mendukung membaca objek terenkripsi non komitmen selama migrasi

Contoh tambahan

Contoh berikut menunjukkan opsi konfigurasi tambahan yang tersedia di V3 yang dapat membantu Anda mengelola proses migrasi dan mengontrol perilaku enkripsi.

Mengaktifkan dukungan lama

Selama migrasi, Anda mungkin perlu mendekripsi objek yang dienkripsi dengan V1 atau V2 dari klien enkripsi Amazon S3. @SecurityProfileParameter mengontrol versi enkripsi mana yang dapat didekripsi klien V3 Anda.

Kapan menggunakan konfigurasi ini: Gunakan profil 'V3_AND_LEGACY' keamanan saat aplikasi Anda perlu membaca objek yang dienkripsi oleh klien V1 atau V2. Ini biasa terjadi selama periode migrasi ketika Anda memiliki campuran objek terenkripsi lama dan baru di ember Anda.

use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; // Decrypt objects encrypted with V1, V2, or V3 $result = $encryptionClient->getObject([ '@SecurityProfile' => 'V3_AND_LEGACY', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

@SecurityProfileParameter menerima nilai-nilai berikut:

  • 'V3'(default): Hanya mendekripsi objek yang dienkripsi dengan V3 menggunakan komitmen utama

  • 'V3_AND_LEGACY': Dekripsi objek yang dienkripsi dengan V1, V2, atau V3

penting

Setelah menyelesaikan migrasi dan mengenkripsi ulang semua objek dengan V3, Anda harus menghapus @SecurityProfile parameter atau mengaturnya 'V3' untuk memastikan keamanan maksimum.

Mengkonfigurasi metode penyimpanan

Klien enkripsi Amazon S3 dapat menyimpan metadata enkripsi dengan dua cara: di header metadata objek atau dalam file instruksi terpisah. @MetadataStrategyParameter mengontrol metode penyimpanan mana yang digunakan.

Kapan menggunakan konfigurasi ini: Gunakan 'INSTRUCTION_FILE' saat Anda perlu mempertahankan metadata objek asli atau saat bekerja dengan objek yang memiliki batasan ukuran metadata. Gunakan 'METADATA' (default) untuk penerapan yang lebih sederhana di mana metadata enkripsi dapat disimpan di samping objek.

use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\S3\S3Client; use Aws\Crypto\KmsMaterialsProviderV3; use Aws\Kms\KmsClient; $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; // Store encryption metadata in a separate instruction file $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => 'INSTRUCTION_FILE', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); // Store encryption metadata in object headers (default) $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => 'METADATA', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);

@MetadataStrategyParameter menerima nilai-nilai berikut:

  • 'METADATA'(default): Simpan metadata enkripsi di header metadata objek

  • 'INSTRUCTION_FILE': Simpan metadata enkripsi dalam file instruksi terpisah dengan akhiran .instruction

catatan

Saat menggunakan'INSTRUCTION_FILE', algoritma AES GCM dengan Key Commitment memberikan perlindungan tambahan terhadap gangguan kunci data. Objek yang menggunakan 'METADATA' penyimpanan tidak mendapat manfaat dari perlindungan tambahan ini.