Jika Anda mengaktifkan fitur database selalu rahasia untuk instance ApsaraDB RDS for PostgreSQL, data teks terenkripsi dari pengguna yang berbeda pada instance RDS akan diisolasi secara otomatis. Topik ini menjelaskan cara mengelola izin untuk menerapkan komputasi terintegrasi data multi-pengguna dan memberi otorisasi kepada administrator basis data (DBA) untuk melakukan operasi data berisiko tinggi.
Deskripsi fitur
Dalam database selalu rahasia, data pengguna dienkripsi menggunakan kunci enkripsi data (DEK) milik pengguna. Data teks terenkripsi dari pengguna yang berbeda diisolasi secara otomatis. Jika query gabungan melibatkan data dari beberapa pengguna, pemilik data harus memberikan izin kepada subjek yang ingin menanyakan data untuk mengakses data teks terenkripsi milik pemilik data. Proses ini disebut manajemen otorisasi multi-pengguna.
Dalam database selalu rahasia, Anda dapat menggunakan daftar kontrol perilaku (BCL) untuk memberikan izin akses pada data multi-pengguna. Setelah BCL diterbitkan, subjek dapat melakukan query gabungan tanpa perlu memahami konten data dari penerbit yang memiliki data. Penerbit tidak perlu khawatir tentang kebocoran data dan dapat menerbitkan atau mencabut BCL untuk membatasi perilaku subjek. Ini dengan cepat dan efektif mencegah data digunakan secara tidak terduga.
Untuk memberi otorisasi kepada DBA melakukan operasi berisiko tinggi pada database selalu rahasia, seperti membuat kunci kustom atau mengonversi data antara teks biasa dan teks terenkripsi, Anda dapat menerbitkan BCL. Dengan cara ini, DBA dapat melakukan operasi terkait menggunakan akun. Dalam hal ini, subjek dan penerbit menggunakan akun yang sama.
Prasyarat
Fitur database selalu rahasia telah diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan fitur database selalu rahasia.
CatatanVersi mesin minor dari instance RDS adalah 20230830 atau lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui versi mesin minor dari instance RDS, lihat Perbarui versi mesin minor.
Akun dibuat secara terpisah untuk subjek dan penerbit. Untuk informasi lebih lanjut, lihat Buat akun.
Data sensitif telah didefinisikan. Untuk informasi lebih lanjut, lihat Tentukan data sensitif.
SDK EncDB digunakan oleh subjek dan penerbit untuk masuk secara terpisah ke database yang diperlukan dan membuat data uji dalam database. Untuk informasi lebih lanjut, lihat Gunakan fitur database selalu rahasia dari klien.
Langkah 1: Inisialisasi kunci publik dan privat
Instal OpenSSL.
Dalam topik ini, OpenSSL, toolkit kriptografi sumber terbuka, digunakan untuk mendapatkan kunci publik dan privat. Sistem operasi Linux dilengkapi dengan OpenSSL. Jika Anda menggunakan sistem operasi Linux, Anda tidak perlu menginstal OpenSSL. Jika Anda menggunakan sistem operasi Windows, Anda harus mengunduh paket perangkat lunak OpenSSL dan menginstal OpenSSL. Untuk informasi lebih lanjut, lihat Win32/Win64 OpenSSL.
CatatanJika Anda menggunakan instance RDS yang fitur database selalu rahasia (edisi dasar)-nya diaktifkan, Anda harus menggunakan algoritma SM2 untuk menghasilkan kunci publik dan privat. Anda dapat menjalankan perintah
openssl ecparam -list_curvesuntuk memeriksa apakah algoritma SM2 didukung oleh versi OpenSSL saat ini. Instance RDS yang fitur database selalu rahasia (edisi dasar)-nya diaktifkan adalah instance RDS yang menggunakan tipe instans berbasis non-Intel SGX. Jika SM2 termasuk dalam output perintah, algoritma SM2 didukung. Jika SM2 tidak termasuk dalam output perintah, Anda harus meningkatkan OpenSSL ke versi yang mendukung algoritma SM2. Anda dapat meningkatkan OpenSSL ke V1.1.1 atau lebih baru.Dapatkan kunci publik dan privat subjek dan penerbit berdasarkan tipe instans dari instance RDS yang fitur database selalu rahasia-nya diaktifkan.
Dua file kunci dihasilkan. File
pub_key.pemadalah file kunci publik. Filepri_key_pkcs8.pemadalah file kunci privat.Edisi diperkuat perangkat keras dari fitur database selalu rahasia (berbasis Intel SGX)
Instance RDS yang fitur database selalu rahasia (edisi diperkuat perangkat keras)-nya diaktifkan adalah instance RDS yang menggunakan tipe instans berbasis Intel SGX. Untuk informasi lebih lanjut, lihat Tipe Instans untuk Instance Utama ApsaraDB RDS for PostgreSQL.
Anda dapat melakukan operasi berikut untuk mendapatkan kunci publik dan privat:
Gunakan OpenSSL untuk menghasilkan kunci privat Rivest-Shamir-Adleman (RSA).
openssl genpkey -algorithm RSA -out pri_key_pkcs8.pem -pkeyopt rsa_keygen_bits:3072Catatan3072: panjang kunci. Anda dapat mengubah panjang kunci ke nilai lain yang sesuai dengan standar keamanan berdasarkan persyaratan bisnis Anda.
Gunakan OpenSSL untuk menghasilkan kunci publik RSA.
openssl rsa -in pri_key_pkcs8.pem -pubout -out pub_key.pem
Edisi dasar dari fitur database selalu rahasia
Instance RDS yang fitur database selalu rahasia (edisi dasar)-nya diaktifkan adalah instance RDS yang menggunakan tipe instans berbasis non-Intel SGX. Untuk informasi lebih lanjut, lihat Tipe Instans untuk Instance Utama ApsaraDB RDS for PostgreSQL.
Anda dapat melakukan operasi berikut untuk mendapatkan kunci publik dan privat:
Gunakan OpenSSL untuk menghasilkan kunci privat SM2.
# Hasilkan kunci privat dalam format Public-Key Cryptography Standards (PKCS)#1. openssl ecparam -out ec_param.pem -name SM2 -param_enc explicit -genkey # Konversikan kunci privat ke format PKCS#8. openssl pkcs8 -topk8 -inform PEM -in ec_param.pem -outform pem -nocrypt -out pri_key_pkcs8.pemGunakan OpenSSL untuk menghasilkan kunci publik SM2.
openssl ec -in ec_param.pem -pubout -out pub_key.pem
Inisialisasi kunci publik dan privat subjek dan penerbit secara terpisah.
Inisialisasi kunci publik dan privat subjek dan penerbit dalam kode bisnis mereka.
CatatanBaris baru secara otomatis ditambahkan dalam file PEM yang dihasilkan menggunakan OpenSSL. Di editor tertentu, tampilan baris baru mungkin dioptimalkan. Akibatnya, ketika Anda menyalin isi file PEM secara manual, baris baru dihilangkan. Kami sarankan Anda menggunakan kode program untuk membaca isi file PEM untuk memastikan akurasi data.
// Kunci privat subjek dan penerbit. String userPrkPemString = readPemFile("path/to/pri_key_pkcs8.pem"); // Kunci publik subjek dan penerbit. String userPukPemString = readPemFile("path/to/pub_key.pem"); // Inisialisasi kunci. Kunci hanya perlu diinisialisasi sekali. KeyManager km = sdk.getKeyManager(); km.registerCertificate(userPrkPemString, userPukPemString);
Langkah 2: Berikan izin akses pada data multi-pengguna
Tentukan konten otorisasi.
String bclBodyJsonString = """{ "version": 1, "serial_num": "a121bac0-5cb3-4463-a2b2-1155ff29f4c8", "issuer_pukid": "p81x+WqYb7BR0yP0LK0qiEaxgLDqwuIjfJhgC0mMJcE=", "subject_pukid": "qIPPfgTJEEG/9WkjP0E5LLAijZ14h/Qgb2EfmBZCWSo=", "validity": { "not_after": "20250820111111+0800", "not_before": "20240820111111+0800" }, "policies": { "issuer_dek_group": [ { "min": 1, "max": 100000, "groupid": "5bc60759-5b05-45ec-afc1-ffca1229e554" } ], "result_dek": "SUBJECT", "subject_dek_group": [ { "min": 1, "max": 100000, "groupid": "53413af9-f90a-48a9-93b6-49847861b823" } ], "operation": [ "*" ], "postproc": "NULL", "preproc": "NULL" } } """;Deskripsi Parameter
Parameter
Nilai contoh
Deskripsi
version
1
Nomor versi. Atur nilainya menjadi 1.
serial_num
"a121bac0-5cb3-4463-a2b2-1155ff29f4c8"
Nomor seri unik, acak dalam format UUID.
CatatanAnda dapat menggunakan alat pembuatan UUID untuk menghasilkan nomor seri.
issuer_pukid
"p81x+WqYb7BR0yP0LK0qiEaxgLDqwuIjfJhgC0mMJcE="
Ringkasan kunci publik penerbit. Anda dapat menjalankan kode berikut untuk mendapatkan ringkasan kunci publik berdasarkan edisi fitur database selalu rahasia dan file kunci publik pub_key.pem yang dihasilkan:
Edisi diperkuat perangkat keras (berbasis Intel SGX)
openssl sha256 -binary pub_key.pem | openssl base64Edisi dasar
openssl sm3 -binary pub_key.pem | openssl base64
subject_pukid
"qIPPfgTJEEG/9WkjP0E5LLAijZ14h/Qgb2EfmBZCWSo="
Ringkasan kunci publik subjek. Anda dapat mengonfigurasi parameter ini dengan cara yang sama seperti Anda mengonfigurasi parameter issuer_pukid.
validity
{ "not_before": "20240820111111+0800", "not_after": "20250820111111+0800"}
Periode validitas otorisasi. Nilainya harus dalam format waktu GeneralizedTime.
"not_before": awal periode validitas.
"not_after": akhir periode validitas.
policies
issuer_dek_group
[ { "min": 1, "max": 100000, "groupid": "5bc60759-5b05-45ec-afc1-ffca1229e554" }]
Grup DEK yang diizinkan oleh penerbit.
"groupid": ID grup DEK
"min": ID DEK terkecil dalam grup DEK
"max": ID DEK terbesar dalam grup DEK
CatatanDalam grup DEK, nilai ID DEK harus meningkat secara monoton.
Anda dapat menjalankan kode berikut untuk mendapatkan nilai parameter groupid:
SELECT encdb_get_cc_entry_by_name(encdb.keyname_generate('<user_name>', '<database_name>', '<schema_name>', '<table_name>', '<column_name>'));Catatan<user_name>: nama pengguna penerbit<table_name>: nama tabel yang diizinkan penerbit untuk diakses subjek<column_name>: nama kolom yang diizinkan penerbit untuk diakses subjek
subject_dek_group
[ { "min": 1, "max": 100000, "groupid": "53413af9-f90a-48a9-93b6-49847861b823" }]
Grup DEK yang diizinkan untuk diakses subjek.
"groupid": ID grup DEK
"min": ID DEK terkecil dalam grup DEK
"max": ID DEK terbesar dalam grup DEK
CatatanDalam grup DEK, nilai ID DEK harus meningkat secara monoton.
Anda dapat menjalankan kode berikut untuk mendapatkan nilai parameter groupid:
SELECT encdb_get_cc_entry_by_name(encdb.keyname_generate('<user_name>', '<database_name>', '<schema_name>', '<table_name>', '<column_name>'));Catatan<user_name>: nama pengguna subjek<table_name>: nama tabel yang diizinkan untuk diakses subjek.<column_name>: nama kolom yang diizinkan untuk diakses subjek.
result_dek
"SUBJECT"
DEK yang digunakan untuk mengenkripsi hasil komputasi.
"SUBJECT": menggunakan DEK subjek dalam komputasi saat ini.
"ISSUER": menggunakan DEK penerbit dalam komputasi saat ini.
ID DEK: menggunakan DEK dengan ID DEK tertentu.
PentingJika Anda ingin menggunakan DEK tertentu, atur parameter ini ke
ID DEK. Anda dapat langsung menentukan ID DEK tanpa perlu mengapit ID DEK dalam tanda kutip ganda ("").
operation
[ "*"]
Operasi komputasi yang diizinkan.
"encrypt": enkripsi
"decrypt": dekripsi
"cmp": perbandingan
"*": semua operasi
postproc
"NULL"
Operasi pra-pemrosesan sebelum komputasi. Atur nilainya menjadi NULL, yang menentukan bahwa tidak ada operasi pra-pemrosesan yang diperlukan.
preproc
"NULL"
Operasi pasca-pemrosesan setelah komputasi. Atur nilainya menjadi NULL, yang menentukan bahwa tidak ada operasi pasca-pemrosesan yang diperlukan.
Berikan izin akses pada data multi-pengguna
Penerbit menggunakan kunci publik dan privatnya untuk menerbitkan BCL guna memberi otorisasi kepada subjek untuk mengakses data di kolom yang diizinkan.
boolean isIssuer = true; bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPrkPemString, isIssuer);Subjek menggunakan kunci publik dan privatnya untuk menerbitkan BCL dan mengakses data yang diizinkan.
boolean isIssuer = false; bclBodyJsonString = km.issueBCL(bclBodyJsonString, userPukPemString, userPrkPemString, isIssuer);
(Opsional) Langkah 3: Cabut otorisasi
Jika penerbit ingin mencabut otorisasi, lakukan operasi berikut:
Tentukan otorisasi yang akan dicabut.
String brlBodyJsonString = """{ "version": 1, "pukid": "dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo=", "this_update": "20220819111128+0800", "next_update": "20220919111128+0800", "revoked": [ { "revocation_date": "20220819111128+0800", "serial_num": "a121bac0-5cb3-4463-a2b2-1155ff29f4c8" } ] } """;Deskripsi Parameter
Parameter
Nilai contoh
Deskripsi
version
1
Nomor versi. Atur nilainya menjadi 1.
pukid
"dYJ3Wfj/n0eZbuqgQjv8bnBdPXGyWGOlxE/uMy16NXo="
Ringkasan kunci publik penerbit. Atur nilainya menjadi ringkasan kunci publik penerbit dalam aplikasi otorisasi BCL. Anda dapat mengonfigurasi parameter ini dengan cara yang sama seperti Anda mengonfigurasi parameter yang dijelaskan dalam Tentukan konten otorisasi.
this_update
"20220819111128+0800"
Saat pembaruan daftar pencabutan. Nilainya harus dalam format waktu GeneralizedTime.
next_update
"20220919111128+0800"
Waktu pembaruan berikutnya dari daftar pencabutan. Nilainya harus dalam format waktu GeneralizedTime.
revoked
revocation_date
"20220819111128+0800"
Saat otorisasi dicabut. Nilainya harus dalam format waktu GeneralizedTime.
serial_num
"a121bac0-5cb3-4463-a2b2-1155ff29f4c8"
Nomor seri dalam format UUID. Anda harus mengatur parameter ini ke nomor seri yang ditentukan dalam aplikasi otorisasi BCL.
Penerbit menyetujui dan menerbitkan pencabutan.
brlBodyJsonString = km.revokeBCL(brlBodyJsonString, userPukPemString, userPrkPemString);
Skenario
Skenario 1: Operasi berisiko tinggi: konversi data antara teks biasa dan teks terenkripsi
Jika Anda ingin mengaktifkan fitur database selalu rahasia untuk basis data teks biasa yang sudah ada tanpa perlu memigrasi data, Anda dapat langsung mengonversi data teks biasa di basis data menjadi data teks terenkripsi. Untuk informasi lebih lanjut, lihat Konversi Data antara Teks Biasa dan Teks Terenkripsi. Secara default, pengguna termasuk DBA tidak dapat melakukan konversi data antara teks biasa dan teks terenkripsi pada database selalu rahasia karena operasi ini dianggap sebagai operasi berisiko tinggi.
Jika Anda memahami dan mengakui risiko keamanan data, Anda dapat menerbitkan BCL untuk memberi otorisasi kepada pengguna yang diperlukan untuk secara langsung mengonversi data antara teks biasa dan teks terenkripsi pada database selalu rahasia. Dalam hal ini, subjek dan penerbit menggunakan akun yang sama.
Ketika Anda mendefinisikan konten BCL, Anda harus mengatur parameter
issuer_pukidke nilai yang sama dengan parametersubject_pukiddan parameterissuer_dek_groupke nilai yang sama dengan parametersubject_dek_group. Untuk informasi lebih lanjut, lihat Tentukan Konten Otorisasi.Ketika Anda menginisialisasi kunci publik dan privat, subjek dan penerbit menggunakan kunci publik dan privat yang sama. Kunci publik ditentukan oleh parameter
userPukPemString, dan kunci privat ditentukan oleh parameteruserPrkPemString. Nilai parameter userPukPemString dan userPrkPemString untuk penerbit sama dengan nilai parameter tersebut untuk subjek. Untuk informasi lebih lanjut, lihat Inisialisasi Kunci Publik dan Privat.
Setelah Anda menerbitkan BCL, Anda dapat melakukan operasi yang diperlukan menggunakan akun yang telah diberi otorisasi. Contoh kode:
Skenario 2: Query gabungan data multi-pengguna
Sebagai contoh, perusahaan platform data mendapatkan izin yang diperlukan untuk menggunakan platform data untuk mengumpulkan data pengguna dan menghasilkan profil pengguna. Kemudian, perusahaan platform data memberi otorisasi kepada pihak ketiga, seperti perusahaan asuransi, untuk menggunakan data tersebut untuk integrasi dan komputasi data multipihak. Ini membantu menerapkan pemasaran bersama. Untuk informasi lebih lanjut, lihat Integrasi dan Komputasi Data Multipihak.
Kode berikut memberikan contoh cara melakukan query gabungan.