Fitur basis data Always confidential dapat digunakan untuk melindungi data privasi dan mencegah kebocoran data. Topik ini menjelaskan praktik terbaik untuk perlindungan data privasi menggunakan fitur tersebut.
Skenario
Sebuah perusahaan asuransi ingin melindungi data privasi yang disimpan dalam tabel informasi pemegang polis bernama person. Tabel berikut adalah contohnya.
Nama (name) | Nomor telepon (phone) | Nomor kartu identitas (ID) | Nomor kartu bank (debit_card) | Alamat (address) |
Xiaobao TAO | 13900001111 | 111222190002309999 | 6225888888888888 | No. 888, Jalan ABC, Hangzhou, Zhejiang |
Sanduo DING | 13900002222 | 111222190002308888 | 6225666666666666 | No. 666, Jalan DEF, Hangzhou, Zhejiang |
Data dalam tabel di atas hanya untuk referensi.
Informasi sensitif tentang pemegang polis dienkripsi oleh departemen data setelah dikirim dari perangkat seluler pemegang polis. Personel di departemen penjualan, pengguna aplikasi terkait, dan pengguna basis data hanya dapat mengakses data teks terenkripsi, sehingga mencegah kebocoran data privasi.
Pemegang polis dapat menggunakan aplikasi seluler perusahaan asuransi untuk mengenkripsi data sebelum menulis atau memperbarui informasi pribadi mereka.
Departemen penjualan perusahaan asuransi dapat terhubung ke basis data untuk menanyakan data, tetapi hanya dapat melihat data teks terenkripsi, bukan data teks biasa.
Prasyarat
Anda memahami cara menggunakan fitur basis data Always confidential. Untuk informasi lebih lanjut, lihat Ikhtisar.
Client SDK atau Java Database Connectivity (JDBC) yang disediakan untuk fitur basis data Always confidential telah diunduh dan diinstal. Untuk informasi lebih lanjut, lihat Konfigurasikan fitur basis data Always confidential pada instance ApsaraDB RDS for PostgreSQL yang ditingkatkan keamanannya berbasis Intel SGX.
Ekstensi EncDB telah diunduh. Ekstensi ini digunakan untuk mengimpor kunci enkripsi utama (MEK), mendaftarkan sertifikat atau pasangan kunci publik dan privat, serta menerbitkan dan mencabut daftar kontrol perilaku (BCL).
Ekstensi EncDB menghasilkan Pernyataan SQL yang dapat dieksekusi dalam basis data berdasarkan parameter yang dikonfigurasi. Setelah Anda mengunduh dan mengekstrak paket ekstensi EncDB, Anda dapat menjalankan perintah
./genEncdbSQLCommand.sh --helpuntuk melihat informasi lebih lanjut.CatatanUntuk informasi lebih lanjut tentang BCL, lihat Berikan izin akses pada data multi-pengguna instance ApsaraDB RDS for PostgreSQL.
Persiapan
Dalam contoh berikut, sistem operasi CentOS digunakan untuk menjalankan perintah.
Konfigurasikan rangkaian sandi.
Konfigurasikan variabel untuk rangkaian sandi.
cipher_suite=RSA_WITH_AES_128_CBC_SHA256Hasilkan template file.
CatatanDalam contoh ini, Anda dapat menjalankan perintah berikut untuk menghasilkan file konfigurasi ke direktori sampel berdasarkan template file. File konfigurasi yang dihasilkan, seperti file kunci dan file otorisasi, diperlukan untuk penggunaan selanjutnya.
./generateSampleKeyAndBCLs.sh -c ${cipher_suite}
Inisialisasi basis data.
Buat basis data.
CREATE DATABASE demo;CatatanDalam contoh ini, basis data bernama
demodibuat. Anda dapat membuat basis data sesuai dengan kebutuhan bisnis Anda. Gunakan nama basis data aktual dalam perintah selanjutnya.Buat ekstensi yang diperlukan oleh fitur basis data Always confidential dalam basis data yang dibuat.
CREATE EXTENSION encdb;Dapatkan sertifikat kunci publik basis data dan tambahkan konten sertifikat ke file lokal.
SELECT encode(db_process_msg_api('{"request_type":0,"version":"1.2.8"}'),'escape')::json->'server_info'->'public_key'CatatanDalam contoh ini, file lokal default_enclave_public_key.pem digunakan. Anda dapat mengubah nama file sesuai dengan kebutuhan bisnis Anda. Gunakan nama file aktual dalam perintah selanjutnya.
Jika konten sertifikat kunci publik dimulai dan diakhiri dengan tanda kutip ganda (
""), Anda tidak perlu menambahkan tanda kutip ganda ke file lokal.
Ubah format sertifikat kunci publik menjadi format standar.
Jalankan perintah berikut untuk mengganti
\\ndengan baris baru\n:sed -i 's/\\\\n/\n/g' default_enclave_public_key.pemJalankan perintah berikut untuk menghapus semua baris kosong:
sed -i '/^[ ]*$/d' default_enclave_public_key.pem
Contoh perlindungan privasi
Departemen data perusahaan asuransi
Persiapkan informasi pemegang polis.
-------- Buat pengguna. -------- -- Buat pengguna untuk departemen data, yang bertanggung jawab atas data pengguna. CREATE USER ins_data; -- Buat pengguna untuk departemen penjualan. CREATE USER ins_sale; -------- Buat tabel. -------- -- Buat tabel informasi pemegang polis untuk departemen data. CREATE TABLE person ( name enc_text, phone enc_text, ID enc_text, debit_card enc_text, address enc_text ); -- Berikan izin kepada departemen data untuk mengakses tabel informasi pemegang polis. GRANT ALL ON person TO ins_data;Buat pengguna untuk departemen data.
CatatanEkstensi EncDB secara otomatis menghasilkan Pernyataan SQL berdasarkan parameter yang dikonfigurasi. Anda harus mengeksekusi Pernyataan SQL yang dihasilkan dalam basis data.
./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_data.bin -e default_enclave_public_key.pem -c ${cipher_suite} # Jalankan pernyataan SELECT encdb_get_current_mek_id(); untuk mendapatkan ID MEK dari pengguna yang dibuat untuk departemen data. # ID MEK 178079820457738240 digunakan sebagai contoh. mekid_data=178079820457738240 ./genEncdbSQLCommand.sh -r BCL_REGISTER --mekid ${mekid_data} --mek sample/default_mek_data.bin --puk sample/usr_puk_data.pem --pri sample/usr_pri_data.pem -c ${cipher_suite}Buat kunci enkripsi untuk tabel informasi pemegang polis.
CatatanPernyataan berikut harus dieksekusi menggunakan pengguna
ins_data.Dalam Pernyataan SQL berikut,
encdb.dek_xxx()danencdb.keyname_xxx()adalah fungsi konversi data. Untuk informasi lebih lanjut, lihat Fungsi Konversi Data.
-- Buat kunci enkripsi data (DEK) dan catat nilai groupid. Contoh nilai: b6785611-0c49-4f13-87a9-13f151de9b4d. SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name')); -- Ini hanya contoh. Semua kolom berbagi DEK yang sama. SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','phone'),encdb.keyname_generate('ins_data','demo','public','person','name')); SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','ID'),encdb.keyname_generate('ins_data','demo','public','person','name')); SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','debit_card'),encdb.keyname_generate('ins_data','demo','public','person','name')); SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','address'),encdb.keyname_generate('ins_data','demo','public','person','name'));Dalam kebanyakan kasus, pengguna basis data tidak dapat langsung mengenkripsi data menggunakan Pernyataan SQL karena alasan keamanan. Pengguna basis data harus diberi otorisasi secara eksplisit untuk mengenkripsi data menggunakan Pernyataan SQL.
Edit BCL untuk memperbarui ruang lingkup otorisasi (termasuk groupid) dari DEK yang diperlukan ke BCL.
./setGroupIdBCL.sh -d b6785611-0c49-4f13-87a9-13f151de9b4dCatatanb6785611-0c49-4f13-87a9-13f151de9b4dhanya untuk referensi. Untuk mendapatkan nilai sebenarnya, Anda dapat mengeksekusi pernyataan berikut:SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));Terbitkan BCL.
./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_data.pem --spuk sample/usr_puk_data.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_for_data_insert.txt -c ${cipher_suite} ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_data.pem --spuk sample/usr_puk_data.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_for_data_insert.txt -c ${cipher_suite}
Tulis data.
CatatanAnda harus mengeksekusi pernyataan berikut sebagai pengguna
ins_data.INSERT INTO person VALUES(encdb.enc_text_encrypt ('Xiaobao TAO',encdb.keyname_generate ('ines_data','demo','public','person','name'))), encdb.enc_text_encrypt('13900001111',encdb.keyname_generate('ins_data','demo','public','person','phone')), encdb.enc_text_encrypt('111222190002309999',encdb.keyname_generate('ins_data','demo','public','person','ID')), encdb.enc_text_encrypt('6225888888888888',encdb.keyname_generate('ins_data','demo','public','person','debit_card')), encdb.enc_text_encrypt('No. 888, Jalan ABC, Hangzhou, Zhejiang',encdb.keyname_generate('ins_data','demo','public','person','address'))); INSERT INTO person VALUES(encdb.enc_text_encrypt ('Sanduo DING ',encdb.keyname_generate('ins_data','demo','public','person','name'))), encdb.enc_text_encrypt('13900002222',encdb.keyname_generate('ins_data','demo','public','person','phone')), encdb.enc_text_encrypt('111222190002308888',encdb.keyname_generate('ins_data','demo','public','person','ID')), encdb.enc_text_encrypt('6225666666666666',encdb.keyname_generate('ins_data','demo','public','person','debit_card')), encdb.enc_text_encrypt ('No. 666, Jalan DEF, Hangzhou, Zhejiang',encdb.keyname_generate ('ines_data','demo','public','person','address')));Tanyakan data.
Tanyakan tabel informasi pemegang polis. Hasil query dalam bentuk teks terenkripsi.
SELECT name,phone FROM person; name | phone --------------------------------------------------------------------------+-------------------------------------------------------------------------- \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890 (2 rows)Eksekusi pernyataan berikut sebagai pengguna
ins_data. Hasil query dalam bentuk teks biasa.SELECT encdb.decrypt(name) FROM person WHERE name LIKE encdb.enc_text_encrypt('TAO%',encdb.keyname_generate('ins_data','demo','public','person','name')); decrypt --------- Xiaobao TAO (1 row)
Departemen penjualan perusahaan asuransi
Buat pengguna untuk departemen penjualan.
CatatanEkstensi EncDB secara otomatis menghasilkan Pernyataan SQL berdasarkan parameter yang dikonfigurasi. Anda harus mengeksekusi Pernyataan SQL yang dihasilkan dalam basis data.
./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_sale.bin -e default_enclave_public_key.pem -c ${cipher_suite} # Jalankan pernyataan SELECT encdb_get_current_mek_id(); untuk mendapatkan ID MEK dari pengguna yang dibuat untuk departemen penjualan. # ID MEK 2715553450389700608 digunakan sebagai contoh. mekid_sale=2715553450389700608 ./genEncdbSQLCommand.sh -r BCL_REGISTER --mekid ${mekid_sale} --mek sample/default_mek_sale.bin --puk sample/usr_puk_sale.pem --pri sample/usr_pri_sale.pem -c ${cipher_suite}Tanyakan data.
Departemen penjualan tidak diberi otorisasi oleh departemen data untuk melihat informasi pemegang polis, sehingga melindungi data privasi.
Tanyakan tabel informasi pemegang polis. Hasil query dalam bentuk teks terenkripsi.
SELECT name,phone FROM person; name | phone --------------------------------------------------------------------------+-------------------------------------------------------------------------- \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890 (2 rows)CatatanJika terjadi kesalahan
ERROR: permission denied for table person, eksekusi pernyataanGRANT SELECT ON person TO ins_sale;untuk memberikan izin kepada departemen penjualan mengakses tabel.Gunakan pengguna
ins_saleuntuk mengeksekusi pernyataan berikut. Setelah dieksekusi, akan dilaporkan kesalahan yang menunjukkan bahwa BCL tidak diperoleh.SELECT encdb.decrypt(name) FROM person; WARNING: -- encdb -- -- Untrusted log -- 4 - src/core/untrusted/src/encdb_untrusted_enclave.cpp,256,encdb_ecall: Select BCL (subject_mekid: 2715553450389700608, issuer_mekid: 178079820457738240) from table fail - returned 0xfa030000 ERROR: encdb_ext_enc_text_decrypt: enc_text decrypt errno:fa030000