Mengkonfigurasi Enkripsi AWS Database SDK - AWS Enkripsi Database SDK

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

Mengkonfigurasi Enkripsi AWS Database SDK

Pustaka enkripsi sisi klien kami diubah namanya menjadi Enkripsi AWS Database. SDK Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi DynamoDB.

Enkripsi AWS Database SDK dirancang agar mudah digunakan. Meskipun Enkripsi AWS Database SDK memiliki beberapa opsi konfigurasi, nilai default dipilih dengan cermat agar praktis dan aman untuk sebagian besar aplikasi. Namun, Anda mungkin perlu menyesuaikan konfigurasi untuk meningkatkan kinerja atau menyertakan fitur khusus dalam desain Anda.

Memilih bahasa pemrograman

Enkripsi AWS Database SDK untuk DynamoDB tersedia dalam beberapa bahasa pemrograman. Implementasi bahasa dirancang untuk sepenuhnya dapat dioperasikan dan menawarkan fitur yang sama, meskipun mereka mungkin diimplementasikan dengan cara yang berbeda. Biasanya, Anda menggunakan perpustakaan yang kompatibel dengan aplikasi Anda.

Memilih tombol pembungkus

Enkripsi AWS Database SDK menghasilkan kunci data simetris yang unik untuk mengenkripsi setiap bidang. Anda tidak perlu mengkonfigurasi, mengelola, atau menggunakan kunci data. Enkripsi AWS Database SDK melakukannya untuk Anda.

Namun, Anda harus memilih satu atau lebih kunci pembungkus untuk mengenkripsi setiap kunci data. Enkripsi AWS Database SDK mendukung AWS Key Management Service(AWS KMS) KMS kunci enkripsi simetris dan kunci asimetris RSAKMS. Ini juga mendukung tombol AES simetris dan tombol RSA asimetris yang Anda berikan dalam berbagai ukuran. Anda bertanggung jawab atas keamanan dan daya tahan kunci pembungkus Anda, jadi kami sarankan Anda menggunakan kunci enkripsi dalam modul keamanan perangkat keras atau layanan infrastruktur utama, seperti AWS KMS.

Untuk menentukan kunci pembungkus Anda untuk enkripsi dan dekripsi, Anda menggunakan keyring. Bergantung pada jenis keyring yang Anda gunakan, Anda dapat menentukan satu kunci pembungkus atau beberapa kunci pembungkus dari jenis yang sama atau berbeda. Jika Anda menggunakan beberapa kunci pembungkus untuk membungkus kunci data, setiap kunci pembungkus akan mengenkripsi salinan kunci data yang sama. Kunci data terenkripsi (satu per kunci pembungkus) disimpan dalam deskripsi material yang disimpan di samping bidang terenkripsi. Untuk mendekripsi data, Enkripsi AWS Database SDK harus terlebih dahulu menggunakan salah satu kunci pembungkus Anda untuk mendekripsi kunci data terenkripsi.

Kami merekomendasikan menggunakan salah satu AWS KMS gantungan kunci bila memungkinkan. Enkripsi AWS Database SDK menyediakan AWS KMS keyring dan keyring AWS KMS Hierarkis, yang mengurangi jumlah panggilan yang dilakukan. AWS KMS Untuk menentukan AWS KMS key dalam keyring, gunakan pengenal AWS KMS kunci yang didukung. Jika Anda menggunakan keyring AWS KMS Hierarkis, Anda harus menentukan kuncinya. ARN Untuk detail tentang pengidentifikasi kunci untuk AWS KMS kunci, lihat Pengidentifikasi Kunci di Panduan AWS Key Management Service Pengembang.

  • Saat Anda mengenkripsi dengan AWS KMS keyring, Anda dapat menentukan pengidentifikasi kunci yang valid (kunciARN, nama alias, aliasARN, atau ID kunci) untuk kunci enkripsi simetris. KMS Jika Anda menggunakan RSA KMS kunci asimetris, Anda harus menentukan kuncinyaARN.

    Jika Anda menentukan nama alias atau alias ARN untuk KMS kunci saat mengenkripsi, Enkripsi AWS Database SDK menyimpan kunci yang ARN saat ini terkait dengan alias tersebut; itu tidak menyimpan alias. Perubahan pada alias tidak memengaruhi kunci yang digunakan untuk mendekripsi KMS kunci data Anda.

  • Secara default, AWS KMS keyring mendekripsi catatan dalam mode ketat (tempat Anda menentukan kunci tertentuKMS). Anda harus menggunakan kunci ARN AWS KMS keys untuk mengidentifikasi dekripsi.

    Ketika Anda mengenkripsi dengan AWS KMS keyring, Enkripsi AWS Database SDK menyimpan kunci ARN AWS KMS key dalam deskripsi materi dengan kunci data terenkripsi. Saat mendekripsi dalam mode ketat, Enkripsi AWS Database SDK memverifikasi bahwa kunci yang sama ARN muncul di keyring sebelum mencoba menggunakan kunci pembungkus untuk mendekripsi kunci data terenkripsi. Jika Anda menggunakan pengenal kunci yang berbeda, Enkripsi AWS Database tidak SDK akan mengenali atau menggunakan AWS KMS key, bahkan jika pengidentifikasi merujuk ke kunci yang sama.

  • Saat mendekripsi dalam mode penemuan, Anda tidak menentukan kunci pembungkus apa pun. Pertama, Enkripsi AWS Database SDK mencoba untuk mendekripsi catatan dengan kunci yang ARN disimpan dalam deskripsi materi. Jika itu tidak berhasil, Enkripsi AWS Database SDK meminta AWS KMS untuk mendekripsi catatan menggunakan KMS kunci yang mengenkripsi itu, terlepas dari siapa yang memiliki atau memiliki akses ke kunci itu. KMS

Untuk menentukan AESkunci mentah atau raw RSA key pair sebagai kunci pembungkus dalam keyring, Anda harus menentukan namespace dan nama. Saat mendekripsi, Anda harus menggunakan namespace dan nama yang sama persis untuk setiap kunci pembungkus mentah seperti yang Anda gunakan saat mengenkripsi. Jika Anda menggunakan namespace atau nama yang berbeda, Enkripsi AWS Database tidak SDK akan mengenali atau menggunakan kunci pembungkus, meskipun materi kuncinya sama.

Membuat filter penemuan

Saat mendekripsi data yang dienkripsi dengan KMS kunci, ini adalah praktik terbaik untuk mendekripsi dalam mode ketat, yaitu membatasi kunci pembungkus yang digunakan hanya untuk yang Anda tentukan. Namun, jika perlu, Anda juga dapat mendekripsi dalam mode penemuan, di mana Anda tidak menentukan kunci pembungkus apa pun. Dalam mode ini, AWS KMS dapat mendekripsi kunci data terenkripsi menggunakan kunci yang mengenkripsi itu, terlepas dari siapa yang memiliki atau memiliki akses ke KMS kunci itu. KMS

Jika Anda harus mendekripsi dalam mode penemuan, kami sarankan Anda selalu menggunakan filter penemuan, yang membatasi KMS kunci yang dapat digunakan untuk yang ada di partisi Akun AWS dan yang ditentukan. Filter penemuan adalah opsional, tetapi ini adalah praktik terbaik.

Gunakan tabel berikut untuk menentukan nilai partisi untuk filter penemuan Anda.

Wilayah Partition
Wilayah AWS aws
Wilayah China aws-cn
AWS GovCloud (US) Regions aws-us-gov

Contoh berikut menunjukkan cara membuat filter penemuan. Sebelum menggunakan kode, ganti nilai contoh dengan nilai yang valid untuk Anda Akun AWS dan partisi.

Java
// Create the discovery filter DiscoveryFilter discoveryFilter = DiscoveryFilter.builder() .partition("aws") .accountIds(111122223333) .build();
C# / .NET
var discoveryFilter = new DiscoveryFilter { Partition = "aws", AccountIds = 111122223333 };

Bekerja dengan database multitenant

Dengan Enkripsi AWS DatabaseSDK, Anda dapat mengonfigurasi enkripsi sisi klien untuk database dengan skema bersama dengan mengisolasi setiap penyewa dengan bahan enkripsi yang berbeda. Saat mempertimbangkan database multitenant, luangkan waktu untuk meninjau persyaratan keamanan Anda dan bagaimana multitenansi dapat memengaruhi mereka. Misalnya, menggunakan database multitenant dapat memengaruhi kemampuan Anda untuk menggabungkan Enkripsi AWS Database SDK dengan solusi enkripsi sisi server lainnya.

Jika Anda memiliki beberapa pengguna yang melakukan operasi enkripsi dalam database Anda, Anda dapat menggunakan salah satu AWS KMS keyring untuk menyediakan setiap pengguna dengan kunci yang berbeda untuk digunakan dalam operasi kriptografi mereka. Mengelola kunci data untuk solusi enkripsi sisi klien multitenant bisa rumit. Kami merekomendasikan untuk mengatur data Anda dengan penyewa bila memungkinkan. Jika penyewa diidentifikasi oleh nilai kunci primer (misalnya, kunci partisi dalam tabel Amazon DynamoDB), maka mengelola kunci Anda lebih mudah.

Anda dapat menggunakan AWS KMS keyring untuk mengisolasi setiap penyewa dengan keyring yang berbeda AWS KMS dan. AWS KMS keys Berdasarkan volume AWS KMS panggilan yang dilakukan per penyewa, Anda mungkin ingin menggunakan keyring AWS KMS Hierarkis untuk meminimalkan panggilan Anda. AWS KMSAWS KMS Hierarchical keyring adalah solusi caching materi kriptografi yang mengurangi jumlah AWS KMS panggilan dengan menggunakan kunci cabang yang AWS KMS dilindungi yang disimpan dalam tabel Amazon DynamoDB, dan kemudian secara lokal menyimpan materi kunci cabang yang digunakan dalam operasi enkripsi dan dekripsi. Anda harus menggunakan keyring AWS KMS Hierarkis untuk mengimplementasikan enkripsi yang dapat dicari di database Anda.

Membuat suar yang ditandatangani

Enkripsi AWS Database SDK menggunakan beacon standar dan suar majemuk untuk menyediakan solusi enkripsi yang dapat dicari yang memungkinkan Anda mencari catatan terenkripsi tanpa mendekripsi seluruh database yang ditanyakan. Namun, Enkripsi AWS Database SDK juga mendukung suar bertanda tangan yang dapat dikonfigurasi sepenuhnya dari bidang yang ditandatangani teks biasa. Signed beacon adalah jenis suar majemuk yang mengindeks dan melakukan kueri kompleks pada dan bidang. SIGN_ONLY SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

Misalnya, jika Anda memiliki database multitenant, Anda mungkin ingin membuat suar bertanda tangan yang memungkinkan Anda untuk menanyakan database Anda untuk catatan yang dienkripsi oleh kunci penyewa tertentu. Untuk informasi selengkapnya, lihat Menanyakan beacon dalam database multitenant.

Anda harus menggunakan keyring AWS KMS Hierarkis untuk membuat suar bertanda tangan.

Untuk mengonfigurasi suar yang ditandatangani, berikan nilai berikut.

Java

Konfigurasi suar majemuk

Contoh berikut mendefinisikan daftar bagian yang ditandatangani secara lokal dalam konfigurasi suar yang ditandatangani.

List<CompoundBeacon> compoundBeaconList = new ArrayList<>(); CompoundBeacon exampleCompoundBeacon = CompoundBeacon.builder() .name("compoundBeaconName") .split(".") .signed(signedPartList) .constructors(constructorList) .build(); compoundBeaconList.add(exampleCompoundBeacon);

Definisi versi suar

Contoh berikut mendefinisikan daftar bagian yang ditandatangani secara global dalam versi beacon. Untuk informasi selengkapnya tentang mendefinisikan versi beacon, lihat Menggunakan beacon.

List<BeaconVersion> beaconVersions = new ArrayList<>(); beaconVersions.add( BeaconVersion.builder() .standardBeacons(standardBeaconList) .compoundBeacons(compoundBeaconList) .signedParts(signedPartList) .version(1) // MUST be 1 .keyStore(keyStore) .keySource(BeaconKeySource.builder() .single(SingleKeyStore.builder() .keyId(branchKeyId) .cacheTTL(6000) .build()) .build()) .build() );
C# / .NET

Lihat contoh kode lengkapnya: BeaconConfig.cs

Konfigurasi suar yang ditandatangani

Contoh berikut mendefinisikan daftar bagian yang ditandatangani secara lokal dalam konfigurasi suar yang ditandatangani.

var compoundBeaconList = new List<CompoundBeacon>(); var exampleCompoundBeacon = new CompoundBeacon { Name = "compoundBeaconName", Split = ".", Signed = signedPartList, Constructors = constructorList }; compoundBeaconList.Add(exampleCompoundBeacon);

Definisi versi suar

Contoh berikut mendefinisikan daftar bagian yang ditandatangani secara global dalam versi beacon. Untuk informasi selengkapnya tentang mendefinisikan versi beacon, lihat Menggunakan beacon.

var beaconVersions = new List<BeaconVersion> { new BeaconVersion { StandardBeacons = standardBeaconList, CompoundBeacons = compoundBeaconList, SignedParts = signedPartsList, Version = 1, // MUST be 1 KeyStore = keyStore, KeySource = new BeaconKeySource { Single = new SingleKeyStore { KeyId = branchKeyId, CacheTTL = 6000 } } } };

Anda dapat menentukan bagian yang ditandatangani dalam daftar yang ditentukan secara lokal atau global. Kami merekomendasikan untuk menentukan bagian yang Anda tandatangani dalam daftar global dalam versi suar bila memungkinkan. Dengan mendefinisikan bagian yang ditandatangani secara global, Anda dapat menentukan setiap bagian sekali dan kemudian menggunakan kembali bagian-bagian tersebut dalam beberapa konfigurasi suar majemuk. Jika Anda hanya ingin menggunakan bagian yang ditandatangani sekali, Anda dapat mendefinisikannya dalam daftar lokal dalam konfigurasi suar yang ditandatangani. Anda dapat mereferensikan bagian lokal dan global dalam daftar konstruktor Anda.

Jika Anda menentukan daftar bagian yang ditandatangani secara global, Anda harus memberikan daftar bagian konstruktor yang mengidentifikasi semua kemungkinan cara suar yang ditandatangani dapat merakit bidang dalam konfigurasi suar Anda.

catatan

Untuk menentukan daftar bagian yang ditandatangani secara global, Anda harus menggunakan Enkripsi AWS Database versi 3.2 atau yang lebih baruSDK. Terapkan versi baru ke semua pembaca sebelum mendefinisikan bagian baru secara global.

Anda tidak dapat memperbarui konfigurasi suar yang ada untuk menentukan daftar bagian yang ditandatangani secara global.

Nama suar

Nama yang Anda gunakan saat menanyakan suar.

Nama suar yang ditandatangani tidak bisa menjadi nama yang sama dengan bidang yang tidak terenkripsi. Tidak ada dua suar yang dapat memiliki nama suar yang sama.

Karakter split

Karakter yang digunakan untuk memisahkan bagian-bagian yang membentuk suar yang ditandatangani Anda.

Karakter split tidak dapat muncul dalam nilai plaintext dari salah satu bidang tempat suar yang ditandatangani dibuat.

Daftar bagian yang ditandatangani

Mengidentifikasi bidang yang ditandatangani termasuk dalam suar yang ditandatangani.

Setiap bagian harus menyertakan nama, sumber, dan awalan. Sumbernya adalah SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT bidang SIGN_ONLY atau yang diidentifikasi oleh bagian tersebut. Sumber harus berupa nama bidang atau indeks yang mengacu pada nilai bidang bersarang. Jika nama bagian Anda mengidentifikasi sumber, Anda dapat menghilangkan sumber dan Enkripsi AWS Database SDK akan secara otomatis menggunakan nama sebagai sumbernya. Sebaiknya tentukan sumber sebagai nama bagian bila memungkinkan. Awalan dapat berupa string apa saja, tetapi harus unik. Tidak ada dua bagian yang ditandatangani dalam suar bertanda tangan yang dapat memiliki awalan yang sama. Sebaiknya gunakan nilai pendek yang membedakan bagian dari bagian lain yang dilayani oleh suar majemuk.

Kami merekomendasikan untuk menentukan suku cadang Anda yang ditandatangani secara global bila memungkinkan. Anda dapat mempertimbangkan untuk mendefinisikan bagian yang ditandatangani secara lokal jika Anda hanya bermaksud menggunakannya dalam satu suar majemuk. Bagian yang didefinisikan secara lokal tidak dapat memiliki awalan atau nama yang sama dengan bagian yang didefinisikan secara global.

Java
List<SignedPart> signedPartList = new ArrayList<>); SignedPart signedPartExample = SignedPart.builder() .name("signedFieldName") .prefix("S-") .build(); signedPartList.add(signedPartExample);
C# / .NET
var signedPartsList = new List<SignedPart> { new SignedPart { Name = "signedFieldName1", Prefix = "S-" }, new SignedPart { Name = "signedFieldName2", Prefix = "SF-" } };
Daftar konstruktor (Opsional)

Mengidentifikasi konstruktor yang menentukan berbagai cara agar bagian yang ditandatangani dapat dirakit oleh suar yang ditandatangani.

Jika Anda tidak menentukan daftar konstruktor, Enkripsi AWS Database SDK merakit suar yang ditandatangani dengan konstruktor default berikut.

  • Semua bagian yang ditandatangani dalam urutan mereka ditambahkan ke daftar bagian yang ditandatangani

  • Semua bagian diperlukan

Konstruktor

Setiap konstruktor adalah daftar terurut dari bagian-bagian konstruktor yang mendefinisikan satu cara bahwa suar yang ditandatangani dapat dirakit. Bagian konstruktor digabungkan bersama dalam urutan mereka ditambahkan ke daftar, dengan setiap bagian dipisahkan oleh karakter split yang ditentukan.

Setiap bagian konstruktor memberi nama bagian yang ditandatangani, dan menentukan apakah bagian itu diperlukan atau opsional dalam konstruktor. Misalnya, jika Anda ingin menanyakan suar yang ditandatangani padaField1,, dan Field1.Field2Field1.Field2.Field3, tandai dan Field3 sebagai opsional Field2 dan buat satu konstruktor.

Setiap konstruktor harus memiliki setidaknya satu bagian yang diperlukan. Sebaiknya buat bagian pertama di setiap konstruktor yang diperlukan sehingga Anda dapat menggunakan BEGINS_WITH operator dalam kueri Anda.

Konstruktor berhasil jika semua bagian yang diperlukan ada dalam catatan. Saat Anda menulis catatan baru, suar yang ditandatangani menggunakan daftar konstruktor untuk menentukan apakah suar dapat dirakit dari nilai yang diberikan. Ini mencoba untuk merakit suar dalam urutan bahwa konstruktor ditambahkan ke daftar konstruktor, dan menggunakan konstruktor pertama yang berhasil. Jika tidak ada konstruktor yang berhasil, suar tidak ditulis ke catatan.

Semua pembaca dan penulis harus menentukan urutan konstruktor yang sama untuk memastikan bahwa hasil kueri mereka benar.

Gunakan prosedur berikut untuk menentukan daftar konstruktor Anda sendiri.

  1. Buat bagian konstruktor untuk setiap bagian yang ditandatangani untuk menentukan apakah bagian itu diperlukan atau tidak.

    Nama bagian konstruktor harus nama bidang yang ditandatangani.

    Contoh berikut menunjukkan cara membuat bagian konstruktor untuk satu bidang ditandatangani.

    Java
    ConstructorPart field1ConstructorPart = ConstructorPart.builder() .name("Field1") .required(true) .build();
    C# / .NET
    var field1ConstructorPart = new ConstructorPart { Name = "Field1", Required = true };
  2. Buat konstruktor untuk setiap cara yang mungkin agar suar yang ditandatangani dapat dirakit menggunakan bagian konstruktor yang Anda buat di Langkah 1.

    Misalnya, jika Anda ingin menanyakan Field1.Field2.Field3 danField4.Field2.Field3, maka Anda harus membuat dua konstruktor. Field1dan keduanya Field4 dapat diperlukan karena mereka didefinisikan dalam dua konstruktor terpisah.

    Java
    // Create a list for Field1.Field2.Field3 queries List<ConstructorPart> field123ConstructorPartList = new ArrayList<>(); field123ConstructorPartList.add(field1ConstructorPart); field123ConstructorPartList.add(field2ConstructorPart); field123ConstructorPartList.add(field3ConstructorPart); Constructor field123Constructor = Constructor.builder() .parts(field123ConstructorPartList) .build(); // Create a list for Field4.Field2.Field1 queries List<ConstructorPart> field421ConstructorPartList = new ArrayList<>(); field421ConstructorPartList.add(field4ConstructorPart); field421ConstructorPartList.add(field2ConstructorPart); field421ConstructorPartList.add(field1ConstructorPart); Constructor field421Constructor = Constructor.builder() .parts(field421ConstructorPartList) .build();
    C# / .NET
    // Create a list for Field1.Field2.Field3 queries var field123ConstructorPartList = new Constructor { Parts = new List<ConstructorPart> { field1ConstructorPart, field2ConstructorPart, field3ConstructorPart } }; // Create a list for Field4.Field2.Field1 queries var field421ConstructorPartList = new Constructor { Parts = new List<ConstructorPart> { field4ConstructorPart, field2ConstructorPart, field1ConstructorPart } };
  3. Buat daftar konstruktor yang mencakup semua konstruktor yang Anda buat di Langkah 2.

    Java
    List<Constructor> constructorList = new ArrayList<>(); constructorList.add(field123Constructor) constructorList.add(field421Constructor)
    C# / .NET
    var constructorList = new List<Constructor> { field123Constructor, field421Constructor };
  4. Tentukan constructorList kapan Anda membuat suar yang ditandatangani.