Enkripsi di sisi klien Amazon S3 - Amazon EMR

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

Enkripsi di sisi klien Amazon S3

Dengan enkripsi sisi klien Amazon S3, enkripsi dan dekripsi Amazon S3 dilakukan di klien EMRFS pada klaster Anda. Objek dienkripsi sebelum diunggah ke Amazon S3 dan didekripsi setelah diunduh. Penyedia yang Anda tentukan menyediakan kunci enkripsi yang digunakan klien. Klien dapat menggunakan kunci yang disediakan olehAWS KMS (CSE-KMS) atau kelas Java khusus yang menyediakan kunci root sisi klien (CSE-C). Spesifikasi enkripsi sedikit berbeda antara CSE-KMS dan CSE-C, tergantung pada penyedia yang ditentukan dan metadata objek yang didekripsi atau dienkripsi. Untuk informasi selengkapnya, lihat Melindungi data menggunakan enkripsi sisi klien dalam Panduan Pengguna Amazon Simple Storage Service.

catatan

Amazon S3 CSE hanya memastikan bahwa data EMRFS yang dipertukarkan dengan Amazon S3 dienkripsi; tidak semua data pada volume instans klaster dienkripsi. Lebih lanjut, karena Hue tidak menggunakan EMRFS, objek yang ditulis oleh Peramban Berkas Hue S3 ke Amazon S3 tidak dienkripsi.

Untuk menentukan CSE-KMS pada data EMRFS di Amazon S3 menggunakan AWS CLI
  • Ketik perintah berikut dan ganti myKMSKeyID dengan ID kunci atau ARN kunci KMS untuk menggunakan:

    aws emr create-cluster --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=KMS,KMSKeyId=MyKMSKeyId

Membuat penyedia kunci khusus

Saat Anda membuat penyedia kunci khusus, aplikasi ini diharapkan akan mengimplementasikan EncryptionMaterialsProvider antarmuka, yang tersedia dalamAWS SDK for Java versi 1.11.0 dan yang lebih baru. Implementasinya dapat menggunakan strategi apapun untuk menyediakan materi enkripsi. Misalnya, Anda dapat memilih untuk menyediakan materi enkripsi statis atau mengintegrasikan dengan sistem manajemen kunci yang lebih kompleks.

Algoritma enkripsi yang digunakan untuk materi enkripsi khusus harus AE/GCM/NoPadding.

EncryptionMaterialsProvider Kelas mendapatkan materi enkripsi menggunakan konteks enkripsi. Amazon EMR mengisi informasi konteks enkripsi pada waktu aktif untuk membantu pemanggil dalam menentukan materi enkripsi yang benar untuk dikembalikan.

contoh Contoh: Menggunakan penyedia kunci khusus untuk enkripsi Amazon S3 dengan EMRFS

Saat Amazon EMR mengambil materi enkripsi dariEncryptionMaterialsProvider kelas untuk melakukan enkripsi, EMRFS secara opsional mengisi argumen materialsDescription dengan dua bidang: URI Amazon S3 untuk objek dan klaster, yang dapat digunakan olehEncryptionMaterialsProvider kelas untuk mengembalikan enkripsi JobFlowId bahan selektif.

Misalnya, penyedia dapat mengembalikan kunci yang berbeda untuk prefiks URI Amazon S3 yang berbeda. Ini adalah deskripsi materi enkripsi yang dikembalikan yang pada akhirnya disimpan dengan objek Amazon S3 bukan nilai materialsDescription yang dihasilkan oleh EMRFS dan diteruskan ke penyedia. Saat mendekripsi objek Amazon S3, deskripsi materi enkripsi diteruskan keEncryptionMaterialsProvider kelas, sehingga sekali lagi dapat, secara selektif mengembalikan kunci yang cocok untuk mendekripsi objek.

Implementasi EncryptionMaterialsProvider referensi disediakan di bawah ini. Penyedia kustom lain, EMRFSRSAEncryptionMaterialsProvider, tersedia dari GitHub.

import com.amazonaws.services.s3.model.EncryptionMaterials; import com.amazonaws.services.s3.model.EncryptionMaterialsProvider; import com.amazonaws.services.s3.model.KMSEncryptionMaterials; import org.apache.hadoop.conf.Configurable; import org.apache.hadoop.conf.Configuration; import java.util.Map; /** * Provides KMSEncryptionMaterials according to Configuration */ public class MyEncryptionMaterialsProviders implements EncryptionMaterialsProvider, Configurable{ private Configuration conf; private String kmsKeyId; private EncryptionMaterials encryptionMaterials; private void init() { this.kmsKeyId = conf.get("my.kms.key.id"); this.encryptionMaterials = new KMSEncryptionMaterials(kmsKeyId); } @Override public void setConf(Configuration conf) { this.conf = conf; init(); } @Override public Configuration getConf() { return this.conf; } @Override public void refresh() { } @Override public EncryptionMaterials getEncryptionMaterials(Map<String, String> materialsDescription) { return this.encryptionMaterials; } @Override public EncryptionMaterials getEncryptionMaterials() { return this.encryptionMaterials; } }

Menentukan penyedia materi khusus menggunakan AWS CLI

Untuk menggunakan AWS CLI, teruskan argumen Encryption, ProviderType, CustomProviderClass, dan CustomProviderLocation ke opsi emrfs.

aws emr create-cluster --instance-type m5.xlarge --release-label emr-4.7.2 or earlier --emrfs Encryption=ClientSide,ProviderType=Custom,CustomProviderLocation=s3://mybucket/myfolder/provider.jar,CustomProviderClass=classname

PengaturanEncryption untukClientSide mengaktifkan enkripsi sisi klien,CustomProviderClass adalah nama EncryptionMaterialsProvider objek Anda, danCustomProviderLocation merupakan lokasi lokal atau Amazon S3 tempat Amazon EMR menyalinCustomProviderClass ke setiap node dalam klaster dan menempatkannya di classpath.

Menentukan penyedia materi khusus menggunakan SDK

Untuk menggunakan SDK, Anda dapat mengatur propertifs.s3.cse.encryptionMaterialsProvider.uri untuk mengunduh EncryptionMaterialsProvider kelas khusus yang Anda simpan di Amazon S3 ke setiap simpul di klaster Anda. Anda mengonfigurasi ini dalam file emrfs-site.xml bersama dengan CSE yang diaktifkan dan lokasi yang tepat dari penyedia khusus.

Misalnya, jikaAWS SDK for Java menggunakan RunJobFlowRequest, kode Anda mungkin terlihat seperti berikut:

<snip> Map<String,String> emrfsProperties = new HashMap<String,String>(); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider.uri","s3://mybucket/MyCustomEncryptionMaterialsProvider.jar"); emrfsProperties.put("fs.s3.cse.enabled","true"); emrfsProperties.put("fs.s3.consistent","true"); emrfsProperties.put("fs.s3.cse.encryptionMaterialsProvider","full.class.name.of.EncryptionMaterialsProvider"); Configuration myEmrfsConfig = new Configuration() .withClassification("emrfs-site") .withProperties(emrfsProperties); RunJobFlowRequest request = new RunJobFlowRequest() .withName("Custom EncryptionMaterialsProvider") .withReleaseLabel("emr-5.36.0") .withApplications(myApp) .withConfigurations(myEmrfsConfig) .withServiceRole("EMR_DefaultRole") .withJobFlowRole("EMR_EC2_DefaultRole") .withLogUri("s3://myLogUri/") .withInstances(new JobFlowInstancesConfig() .withEc2KeyName("myEc2Key") .withInstanceCount(2) .withKeepJobFlowAliveWhenNoSteps(true) .withMasterInstanceType("m5.xlarge") .withSlaveInstanceType("m5.xlarge") ); RunJobFlowResult result = emr.runJobFlow(request); </snip>

KustomEncryptionMaterialsProvider dengan argumen

Anda mungkin perlu menyampaikan argumen langsung ke penyedia. Untuk melakukannya, Anda dapat menggunakan klasifikasi konfigurasi emrfs-site dengan argumen khusus yang didefinisikan sebagai properti. Contoh konfigurasi ditunjukkan di bawah ini, yang mana disimpan sebagai file, myConfig.json:

[ { "Classification": "emrfs-site", "Properties": { "myProvider.arg1":"value1", "myProvider.arg2":"value2" } } ]

Menggunakan perintah create-cluster dari AWS CLI, Anda dapat menggunakan opsi --configurations untuk menentukan file seperti yang ditunjukkan di bawah ini:

aws emr create-cluster --release-label emr-5.36.0 --instance-type m5.xlarge --instance-count 2 --configurations file://myConfig.json --emrfs Encryption=ClientSide,CustomProviderLocation=s3://mybucket/myfolder/myprovider.jar,CustomProviderClass=classname

Mengkonfigurasi dukungan EMRFS S3EC V2

Rilis S3 Java SDK (1.11.837 dan yang lebih baru) mendukung klien enkripsi Versi 2 (S3EC V2) dengan berbagai peningkatan keamanan. Untuk informasi selengkapnya, lihat postingan blog S3 Pembaruan untuk klien enkripsi Amazon S3. Lihat juga Migrasi klien enkripsi Amazon S3 di AWS SDK for JavaPanduan Developer.

Klien enkripsi V1 masih tersedia di SDK untuk kompatibilitas mundur. Secara default EMRFS akan menggunakan S3EC V1 untuk mengenkripsi dan mendekripsi objek S3 jika CSE diaktifkan.

Objek S3 yang dienkripsi dengan S3EC V2 tidak dapat didekripsi oleh EMRFS pada klaster EMR yang versi rilisnya lebih lama dari emr-5.31.0 (emr-5.30.1 dan yang lebih lama, emr-6.1.0 dan yang lebih lama).

contoh Konfigurasikan EMRFS untuk menggunakan S3EC V2

Untuk mengonfigurasi EMRFS agar S3EC V2 dapat digunakan, tambahkan konfigurasi berikut:

{ "Classification": "emrfs-site", "Properties": { "fs.s3.cse.encryptionV2.enabled": "true" } }

emrfs-site.xml Properti untuk enkripsi di sisi klien Amazon S3

Properti Nilai default Deskripsi
fs.s3.cse.enabled false

Jika disetel ke true, objek EMRFS yang disimpan di Amazon S3 dienkripsi menggunakan enkripsi di sisi klien.

fs.s3.cse.encryptionV2.enabled false

Jika disetel ke true, EMRFS menggunakan klien enkripsi S3 Versi 2 untuk mengenkripsi dan mendekripsi objek di S3. Tersedia untuk EMR versi 5.31.0 dan yang lebih baru.

fs.s3.cse.encryptionMaterialsProvider.uri N/A Berlaku saat menggunakan materi enkripsi khusus. URI Amazon S3 tempat JAR denganEncryptionMaterialsProvider berada. Saat Anda menyediakan URI ini, Amazon EMR secara otomatis mengunduh JAR ke semua simpul dalam klaster.
fs.s3.cse.encryptionMaterialsProvider N/A

Jalur kelas EncryptionMaterialsProvider yang digunakan dengan enkripsi di sisi klien. Saat menggunakan CSE-KMS, tentukan com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider.

fs.s3.cse.materialsDescription.enabled false

Jika disetel ketrue, materialsDescription akan diisi dari objek terenkripsi dengan URI Amazon S3 untuk objek dan objek JobFlowId. Setel ke true saat menggunakan materi enkripsi khusus.

fs.s3.cse.kms.keyId N/A

Berlaku saat menggunakan CSE-KMS. Nilai dari KeyId, ARN, atau alias kunci KMS yang digunakan untuk enkripsi.

fs.s3.cse.cryptoStorageMode ObjectMetadata

Mode penyimpanan Amazon S3. Secara default, deskripsi informasi enkripsi akan disimpan dalam metadata objek. Anda juga dapat menyimpan deskripsi dalam file instruksi. Nilai yang valid adalah ObjectMetadata danInstructionFile. Untuk informasi selengkapnya, lihat Enkripsi data sisi klien dengan AWS SDK for Java dan Amazon S3.