Enkripsi modular parket di Hive - Amazon EMR

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

Enkripsi modular parket di Hive

Enkripsi modular parket menyediakan kontrol akses tingkat kolumnar dan enkripsi untuk meningkatkan privasi dan integritas data untuk data yang disimpan dalam format file Parket. Fitur ini tersedia di Amazon EMR Hive dimulai dengan rilis 6.6.0.

Solusi yang didukung sebelumnya untuk keamanan dan integritas, yang mencakup mengenkripsi file atau mengenkripsi lapisan penyimpanan, dijelaskan dalam Opsi Enkripsi di Panduan Manajemen Amazon EMR. Solusi ini dapat digunakan untuk file Parket, tetapi memanfaatkan fitur baru dari mekanisme enkripsi Parket terintegrasi menyediakan akses granular ke tingkat kolom, serta peningkatan kinerja dan keamanan. Pelajari lebih lanjut tentang fitur ini di halaman github Apache Parquet Modular Encryption.

Pengguna lulus konfigurasi untuk pembaca Parket dan penulis menggunakan konfigurasi Hadoop. Konfigurasi terperinci bagi pengguna untuk mengonfigurasi pembaca dan penulis untuk mengaktifkan enkripsi serta beralih fitur-fitur canggih didokumentasikan di PARQUET-1854: Antarmuka berbasis properti ke Manajemen Enkripsi Parket

Contoh penggunaan

Contoh berikut mencakup membuat dan menulis ke tabel Hive menggunakanAWS KMS untuk mengelola kunci enkripsi.

  1. Menerapkan KmsClient untukAWS KMS layanan seperti yang dijelaskan dalam dokumen PARQUET-1373: Encryption Key Management Tools. Sampel berikut menunjukkan cuplikan implementasi.

    package org.apache.parquet.crypto.keytools; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.kms.AWSKMS; import com.amazonaws.services.kms.AWSKMSClientBuilder; import com.amazonaws.services.kms.model.DecryptRequest; import com.amazonaws.services.kms.model.EncryptRequest; import com.amazonaws.util.Base64; import org.apache.hadoop.conf.Configuration; import org.apache.parquet.crypto.KeyAccessDeniedException; import org.apache.parquet.crypto.ParquetCryptoRuntimeException; import org.apache.parquet.crypto.keytools.KmsClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; public class AwsKmsClient implements KmsClient { private static final AWSKMS AWSKMS_CLIENT = AWSKMSClientBuilder .standard() .withRegion(Regions.US_WEST_2) .build(); public static final Logger LOG = LoggerFactory.getLogger(AwsKmsClient.class); private String kmsToken; private Configuration hadoopConfiguration; @Override public void initialize(Configuration configuration, String kmsInstanceID, String kmsInstanceURL, String accessToken) throws KeyAccessDeniedException { hadoopConfiguration = configuration; kmsToken = accessToken; } @Override public String wrapKey(byte[] keyBytes, String masterKeyIdentifier) throws KeyAccessDeniedException { String value = null; try { ByteBuffer plaintext = ByteBuffer.wrap(keyBytes); EncryptRequest req = new EncryptRequest().withKeyId(masterKeyIdentifier).withPlaintext(plaintext); ByteBuffer ciphertext = AWSKMS_CLIENT.encrypt(req).getCiphertextBlob(); byte[] base64EncodedValue = Base64.encode(ciphertext.array()); value = new String(base64EncodedValue, Charset.forName("UTF-8")); } catch (AmazonClientException ae) { throw new KeyAccessDeniedException(ae.getMessage()); } return value; } @Override public byte[] unwrapKey(String wrappedKey, String masterKeyIdentifier) throws KeyAccessDeniedException { byte[] arr = null; try { ByteBuffer ciphertext = ByteBuffer.wrap(Base64.decode(wrappedKey.getBytes(StandardCharsets.UTF_8))); DecryptRequest request = new DecryptRequest().withKeyId(masterKeyIdentifier).withCiphertextBlob(ciphertext); ByteBuffer decipheredtext = AWSKMS_CLIENT.decrypt(request).getPlaintext(); arr = new byte[decipheredtext.remaining()]; decipheredtext.get(arr); } catch (AmazonClientException ae) { throw new KeyAccessDeniedException(ae.getMessage()); } return arr; } }
  2. Buat kunciAWS KMS enkripsi Anda untuk footer serta kolom dengan peran IAM Anda yang memiliki akses seperti yang dijelaskan dalam Membuat kunci di PanduanAWS Key Management Service Pengembang. Peran IAM default adalah EMR_ECS_Default.

  3. Pada aplikasi Hive pada klaster Amazon EMR, tambahkan klien di atas menggunakanADD JAR pernyataan, seperti yang dijelaskan dalam dokumentasi Apache Hive Resources. Berikut ini adalah contoh pernyataan:

    ADD JAR 's3://location-to-custom-jar';

    Metode alternatif adalah dengan menambahkan JAR keauxlib dari Hive menggunakan tindakan bootstrap. Berikut ini adalah contoh baris yang akan ditambahkan ke tindakan boostrap:

    aws s3 cp 's3://location-to-custom-jar' /usr/lib/hive/auxlib
  4. Tetapkan konfigurasi berikut:

    set parquet.crypto.factory.class=org.apache.parquet.crypto.keytools.PropertiesDrivenCryptoFactory; set parquet.encryption.kms.client.class=org.apache.parquet.crypto.keytools.AwsKmsClient;
  5. Buat tabel Hive dengan format Parket dan tentukanAWS KMS kunci di SERDEPROPERTIES dan masukkan beberapa data untuk itu:

    CREATE TABLE my_table(name STRING, credit_card STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe’ WITH SERDEPROPERTIES ( 'parquet.encryption.column.key’=<aws-kms-key-id-for-column-1>: credit_card’, 'parquet.encryption.footer.key’='<aws-kms-key-id-for-footer>’) STORED AS parquet LOCATION “s3://<bucket/<warehouse-location>/my_table”; INSERT INTO my_table SELECT java_method ('org.apache.commons.lang.RandomStringUtils','randomAlphabetic',5) as name, java_method ('org.apache.commons.lang.RandomStringUtils','randomAlphabetic',10) as credit_card from (select 1) x lateral view posexplode(split(space(100),' ')) pe as i,x; select * from my_table;
  6. Pastikan bahwa ketika Anda membuat tabel eksternal di lokasi yang sama tanpa akses keAWS KMS kunci (misalnya, akses peran IAM ditolak), Anda tidak dapat membaca data.

    CREATE EXTERNAL TABLE ext_table (name STRING, credit_card STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe’ STORED AS parquet LOCATION “s3://<bucket>/<warehouse-location>/my_table”; SELECT * FROM ext_table;
  7. Pernyataan terakhir harus membuang pengecualian berikut:

    Failed with exception java.io.IOException:org.apache.parquet.crypto.KeyAccessDeniedException: Footer key: access denied