All Products
Search
Document Center

ApsaraDB RDS:Perlindungan Privasi

Last Updated:Jul 06, 2025

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

Catatan

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

Persiapan

Catatan

Dalam contoh berikut, sistem operasi CentOS digunakan untuk menjalankan perintah.

  1. Konfigurasikan rangkaian sandi.

    1. Konfigurasikan variabel untuk rangkaian sandi.

      cipher_suite=RSA_WITH_AES_128_CBC_SHA256
    2. Hasilkan template file.

      Catatan

      Dalam 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}
  2. Inisialisasi basis data.

    1. Buat basis data.

      CREATE DATABASE demo;
      Catatan

      Dalam contoh ini, basis data bernama demo dibuat. Anda dapat membuat basis data sesuai dengan kebutuhan bisnis Anda. Gunakan nama basis data aktual dalam perintah selanjutnya.

    2. Buat ekstensi yang diperlukan oleh fitur basis data Always confidential dalam basis data yang dibuat.

      CREATE EXTENSION encdb;
    3. 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'
      Catatan
      • Dalam 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.

    4. Ubah format sertifikat kunci publik menjadi format standar.

      1. Jalankan perintah berikut untuk mengganti \\n dengan baris baru \n:

        sed -i 's/\\\\n/\n/g' default_enclave_public_key.pem
      2. Jalankan perintah berikut untuk menghapus semua baris kosong:

        sed -i '/^[ ]*$/d' default_enclave_public_key.pem

Contoh perlindungan privasi

Departemen data perusahaan asuransi

  1. 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;
  2. Buat pengguna untuk departemen data.

    Catatan

    Ekstensi 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}
  3. Buat kunci enkripsi untuk tabel informasi pemegang polis.

    Catatan
    • Pernyataan berikut harus dieksekusi menggunakan pengguna ins_data.

    • Dalam Pernyataan SQL berikut, encdb.dek_xxx() dan encdb.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.

    1. Edit BCL untuk memperbarui ruang lingkup otorisasi (termasuk groupid) dari DEK yang diperlukan ke BCL.

      ./setGroupIdBCL.sh -d b6785611-0c49-4f13-87a9-13f151de9b4d
      Catatan

      b6785611-0c49-4f13-87a9-13f151de9b4d hanya untuk referensi. Untuk mendapatkan nilai sebenarnya, Anda dapat mengeksekusi pernyataan berikut:

      SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));
    2. 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}
  4. Tulis data.

    Catatan

    Anda 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'))); 
  5. 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

  1. Buat pengguna untuk departemen penjualan.

    Catatan

    Ekstensi 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}
  2. 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)
      Catatan

      Jika terjadi kesalahan ERROR: permission denied for table person, eksekusi pernyataan GRANT SELECT ON person TO ins_sale; untuk memberikan izin kepada departemen penjualan mengakses tabel.

    • Gunakan pengguna ins_sale untuk 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