Enkripsi Data Transparan (TDE) mengenkripsi data secara transparan pada lapisan database, mencegah pengguna yang tidak berwenang melewati database untuk membaca informasi sensitif langsung dari lapisan penyimpanan.
Penerapan
Fitur ini didukung pada kluster PolarDB for PostgreSQL yang memenuhi persyaratan berikut:
Versi mesin:
PostgreSQL 11 (versi mesin minor 2.0.11.2.1.0 atau lebih baru)
PostgreSQL 14 (versi mesin minor 2.0.14.5.1.1 atau lebih baru)
PostgreSQL 16 (versi mesin minor 2.0.16.9.6.0 atau lebih baru)
PostgreSQL 17 (versi mesin minor 2.0.17.6.4.0 atau lebih baru)
PostgreSQL 18 (versi mesin minor 2.0.18.0.1.0 atau lebih baru)
Kluster PolarDB for PostgreSQL Distributed Edition tidak didukung.
Anda dapat melihat versi mesin minor di Konsol atau dengan menjalankan pernyataan SHOW polardb_version;. Jika versi mesin minor tidak memenuhi persyaratan, upgrade versi mesin minor.
Informasi latar belakang
Di Tiongkok, untuk menjamin keamanan informasi di Internet, pengembang layanan harus mematuhi standar keamanan data, seperti:
Undang-Undang Kriptografi Republik Rakyat Tiongkok (berlaku sejak 1 Januari 2020)
Perlindungan Tingkat Keamanan Siber (GB/T 22239-2019)
Secara internasional, beberapa industri juga memiliki standar keamanan data, seperti:
Standar Keamanan Data Industri Kartu Pembayaran (PCI DSS)
Undang-Undang Portabilitas dan Akuntabilitas Asuransi Kesehatan (HIPAA)
Peraturan Perlindungan Data Umum (GDPR)
Undang-Undang Perlindungan Konsumen California (CCPA)
Undang-Undang Sarbanes-Oxley (SOX)
Untuk membantu Anda memenuhi persyaratan keamanan data tersebut, PolarDB menyediakan fitur TDE. Pengguna yang telah terotentikasi dapat mengakses data secara transparan tanpa mengubah kode aplikasi atau konfigurasi. TDE mencegah pengguna sistem operasi membaca data sensitif dalam file ruang tabel dan mencegah pengguna jahat membaca teks biasa dari disk atau backup.
Glosarium
Istilah | Deskripsi |
Key Encryption Key (KEK) | Kunci yang mengenkripsi kunci lainnya. |
Memory Data Encryption Key (MDEK) | Kunci enkripsi data yang disimpan dalam memori. Kunci ini dihasilkan secara acak oleh fungsi |
Table Data Encryption Key (TDEK) | Kunci enkripsi data tabel. Kunci ini dihasilkan dari MDEK menggunakan algoritma HKDF, disimpan dalam memori, dan digunakan untuk mengenkripsi data. |
WAL Data Encryption Key (WDEK) | Kunci enkripsi data WAL. Kunci ini dihasilkan dari MDEK menggunakan algoritma HKDF, disimpan dalam memori, dan digunakan untuk mengenkripsi data. |
Hash-based Message Authentication Code (HMAC) | Kunci yang dihasilkan menggunakan algoritma hash-based message authentication code. KEK dan HMACK dihasilkan setelah passphrase diproses menggunakan algoritma SHA-512. |
Hash-based Message Authentication Code of Key Encryption Key (KEK_HMAC) | Digest dari key encryption key yang dihasilkan menggunakan algoritma hash-based message authentication code. KEK_HMAC dihasilkan dari ENCMDEK dan HMACK menggunakan algoritma HMAC. Digunakan sebagai informasi verifikasi saat kunci dikembalikan. |
Encode Memory Data Encryption Key (ENCMDEK) | Kunci enkripsi data yang telah dienkripsi dan disimpan dalam memori. ENCMDEK dihasilkan dengan mengenkripsi MDEK menggunakan KEK. |
Cara kerja
Key management module
Struktur Kunci
TDE menggunakan struktur kunci dua lapis yang terdiri dari key encryption key (KEK) dan kunci enkripsi data. Kunci enkripsi data mengenkripsi data database, sedangkan KEK mengenkripsi kunci enkripsi data tersebut.
Key encryption key (KEK) dan nilai verifikasinya (HMACK): Sistem menjalankan perintah yang ditentukan oleh parameter
polar_cluster_passphrase_commanddan menghitung hash SHA-512 dari output untuk mendapatkan data sepanjang 64 byte. 32 byte pertama adalah KEK, dan 32 byte terakhir adalah HMACK.Table data encryption key (TDEK) dan WAL data encryption key (WDEK): Kunci-kunci ini dihasilkan oleh penghasil angka acak yang aman dan merupakan kunci aktual yang digunakan untuk enkripsi data dan log WAL. Nilai verifikasi dihasilkan menggunakan algoritma HMAC. Nilai-nilai ini digunakan untuk verifikasi KEK dan disimpan pada penyimpanan bersama.
KEK dan HMACK diperoleh dari sumber eksternal setiap kali. Misalnya, Anda dapat mengambilnya dari KMS. Untuk tujuan pengujian, Anda dapat menjalankan
echo passphraseuntuk mendapatkannya. ENCMDEK dan KEK_HMAC harus disimpan pada penyimpanan bersama. Hal ini memastikan bahwa node primary dan read-only dapat membaca file tersebut dan memperoleh kunci enkripsi data aktual saat startup berikutnya. Struktur data adalah sebagai berikut:typedef struct KmgrFileData { /* version for kmgr file */ uint32 kmgr_version_no; /* Are data pages encrypted? Zero if encryption is disabled */ uint32 data_encryption_cipher; /* * Wrapped Key information for data encryption. */ WrappedEncKeyWithHmac tde_rdek; WrappedEncKeyWithHmac tde_wdek; /* CRC of all above ... MUST BE LAST! */ pg_crc32c crc; } KmgrFileData;File ini dihasilkan selama inisialisasi database (initdb), sehingga node standby dapat memperoleh file tersebut menggunakan
pg_basebackup.Saat kluster sedang berjalan, informasi kontrol terkait TDE disimpan dalam memori proses. Strukturnya adalah sebagai berikut:
static keydata_t keyEncKey[TDE_KEK_SIZE]; static keydata_t relEncKey[TDE_MAX_DEK_SIZE]; static keydata_t walEncKey[TDE_MAX_DEK_SIZE]; char *polar_cluster_passphrase_command = NULL; extern int data_encryption_cipher;Enkripsi Kunci
Kunci dihasilkan selama inisialisasi database. Prosesnya ditunjukkan pada gambar berikut:

Sistem menjalankan perintah yang ditentukan oleh
polar_cluster_passphrase_commanduntuk memperoleh KEK sepanjang 32 byte dan HMACK sepanjang 32 byte.Sistem memanggil algoritma penghasil angka acak di OpenSSL untuk menghasilkan MDEK.
Sistem menggunakan MDEK untuk memanggil algoritma HKDF di OpenSSL guna menghasilkan TDEK.
Sistem menggunakan MDEK untuk memanggil algoritma HKDF di OpenSSL guna menghasilkan WDEK.
Sistem menggunakan KEK untuk mengenkripsi MDEK dan menghasilkan ENCMDEK.
Sistem menghasilkan KEK_HMAC dari ENCMDEK dan HMACK menggunakan algoritma HMAC. KEK_HMAC digunakan sebagai informasi verifikasi saat kunci dikembalikan.
Sistem menulis ENCMDEK, KEK_HMAC, dan informasi lain dari struktur
KmgrFileDatake file global/kmgr.
Dekripsi Kunci
Saat database crash atau restart, kunci enkripsi data harus dipulihkan dari ciphertext yang tersimpan. Prosesnya adalah sebagai berikut:

Sistem membaca file global/kmgr untuk memperoleh ENCMDEK dan KEK_HMAC.
Sistem menjalankan perintah yang ditentukan oleh
polar_cluster_passphrase_commanduntuk memperoleh KEK dan HMACK.Sistem menghasilkan KEK_HMAC baru (KEK_HMAC') dari ENCMDEK dan HMACK menggunakan algoritma HMAC. Kemudian, sistem membandingkan KEK_HMAC' dengan KEK_HMAC yang tersimpan. Jika sesuai, proses dilanjutkan. Jika tidak sesuai, kesalahan dikembalikan.
Sistem menggunakan KEK untuk mendekripsi ENCMDEK dan menghasilkan MDEK.
Sistem menggunakan MDEK untuk memanggil algoritma HKDF di OpenSSL guna menghasilkan TDEK. Karena informasi input bersifat deterministik, TDEK yang sama dihasilkan.
Sistem menggunakan MDEK untuk memanggil algoritma HKDF di OpenSSL guna menghasilkan WDEK. Karena informasi input bersifat deterministik, WDEK yang sama dihasilkan.
Rotasi kunci
Rotasi kunci adalah proses mengenkripsi ulang MDEK dengan KEK baru dan menghasilkan file kmgr baru. Ini melibatkan dekripsi MDEK dengan KEK lama, lalu mengenkripsi ulang dengan KEK baru. Prosesnya ditunjukkan pada gambar berikut:

Sistem membaca file global/kmgr untuk memperoleh ENCMDEK dan KEK_HMAC.
polar_cluster_passphrase_commandmengembalikan KEK + HMAC sepanjang 64 byte.Sistem menghasilkan KEK_HMAC baru (KEK_HMAC') dari ENCMDEK dan HMACK menggunakan algoritma HMAC. Kemudian, sistem membandingkan KEK_HMAC' dengan KEK_HMAC yang tersimpan. Jika sesuai, proses dilanjutkan. Jika tidak sesuai, kesalahan dikembalikan.
Sistem menggunakan KEK untuk mendekripsi ENCMDEK dan menghasilkan MDEK.
Sistem menjalankan kembali perintah yang ditentukan oleh
polar_cluster_passphrase_commanduntuk memperoleh KEK baru (new_KEK) dan HMACK baru (new_HMACK).Sistem menggunakan new_KEK untuk mengenkripsi MDEK dan menghasilkan ENCMDEK baru (new_ENCMDEK).
Sistem menghasilkan KEK_HMAC baru (new_KEK_HMAC) dari new_ENCMDEK dan new_HMACK menggunakan algoritma HMAC. new_KEK_HMAC digunakan sebagai informasi verifikasi untuk pengembalian kunci di masa depan.
Sistem menulis new_ENCMDEK, new_KEK_HMAC, dan informasi lain dari struktur
KmgrFileDatake file global/kmgr.
Encryption module
Semua data pengguna dienkripsi pada tingkat halaman menggunakan algoritma enkripsi AES-128 atau AES-256. Secara default, AES-256 digunakan. Pasangan
(page LSN, page number)digunakan sebagai vektor inisialisasi (IV) untuk enkripsi setiap halaman data. IV memastikan bahwa mengenkripsi teks biasa yang sama berkali-kali menghasilkan ciphertext yang berbeda.Struktur data header setiap halaman adalah sebagai berikut:
typedef struct PageHeaderData { /* XXX LSN is member of *any* block, not only page-organized ones */ PageXLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog * record for last change to this page */ uint16 pd_checksum; /* checksum */ uint16 pd_flags; /* flag bits, see below */ LocationIndex pd_lower; /* offset to start of free space */ LocationIndex pd_upper; /* offset to end of free space */ LocationIndex pd_special; /* offset to start of special space */ uint16 pd_pagesize_version; TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */ ItemIdData pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */ } PageHeaderData;CatatanDi mana:
Enkripsi tidak didukung untuk
pd_lsnkarena dekripsi memerlukan vektor inisialisasi (IV).Bidang
pd_flagsmencakup flag0x8000untuk menunjukkan apakah halaman dienkripsi. Flag ini tidak dienkripsi, sehingga memberikan kompatibilitas mundur untuk membaca halaman teks biasa dan memungkinkan Anda mengaktifkan TDE pada kluster yang sudah ada.pd_checksumtidak dienkripsi, sehingga checksum halaman dapat diverifikasi terhadap ciphertext.
File Terenkripsi
File yang berisi data pengguna dienkripsi. Misalnya, file dalam subdirektori berikut dari direktori data dienkripsi:
base/global/pg_tblspc/pg_replslot/pg_stat/pg_stat_tmp/
Kapan Mengenkripsi
Data diorganisir menjadi halaman dan dienkripsi pada tingkat halaman. Sebelum halaman ditulis ke disk, checksum-nya dihitung. Bahkan jika checksum dinonaktifkan, fungsi terkait checksum seperti
PageSetChecksumCopyatauPageSetChecksumInplacetetap dipanggil. Oleh karena itu, proses enkripsi terjadi tepat sebelum checksum dihitung untuk memastikan bahwa semua data pengguna pada media penyimpanan dienkripsi.
Decryption module
Saat halaman dibaca dari penyimpanan ke memori, checksum-nya diverifikasi. Bahkan jika checksum dinonaktifkan, fungsi
PageIsVerifiedtetap dipanggil. Oleh karena itu, proses dekripsi terjadi segera setelah checksum diverifikasi untuk memastikan bahwa data di memori berada dalam bentuk teks biasa.