All Products
Search
Document Center

PolarDB:Enkripsi Data Transparan (TDE)

Last Updated:Jan 28, 2026

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.

Catatan

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:

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 pg_strong_random dan digunakan untuk mengenkripsi data.

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_command dan 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 passphrase untuk 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:密钥加密

      1. Sistem menjalankan perintah yang ditentukan oleh polar_cluster_passphrase_command untuk memperoleh KEK sepanjang 32 byte dan HMACK sepanjang 32 byte.

      2. Sistem memanggil algoritma penghasil angka acak di OpenSSL untuk menghasilkan MDEK.

      3. Sistem menggunakan MDEK untuk memanggil algoritma HKDF di OpenSSL guna menghasilkan TDEK.

      4. Sistem menggunakan MDEK untuk memanggil algoritma HKDF di OpenSSL guna menghasilkan WDEK.

      5. Sistem menggunakan KEK untuk mengenkripsi MDEK dan menghasilkan ENCMDEK.

      6. Sistem menghasilkan KEK_HMAC dari ENCMDEK dan HMACK menggunakan algoritma HMAC. KEK_HMAC digunakan sebagai informasi verifikasi saat kunci dikembalikan.

      7. Sistem menulis ENCMDEK, KEK_HMAC, dan informasi lain dari struktur KmgrFileData ke file global/kmgr.

    • Dekripsi Kunci

      Saat database crash atau restart, kunci enkripsi data harus dipulihkan dari ciphertext yang tersimpan. Prosesnya adalah sebagai berikut:密钥解密

      1. Sistem membaca file global/kmgr untuk memperoleh ENCMDEK dan KEK_HMAC.

      2. Sistem menjalankan perintah yang ditentukan oleh polar_cluster_passphrase_command untuk memperoleh KEK dan HMACK.

      3. 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.

      4. Sistem menggunakan KEK untuk mendekripsi ENCMDEK dan menghasilkan MDEK.

      5. Sistem menggunakan MDEK untuk memanggil algoritma HKDF di OpenSSL guna menghasilkan TDEK. Karena informasi input bersifat deterministik, TDEK yang sama dihasilkan.

      6. 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:密钥更换

      1. Sistem membaca file global/kmgr untuk memperoleh ENCMDEK dan KEK_HMAC.

      2. polar_cluster_passphrase_command mengembalikan KEK + HMAC sepanjang 64 byte.

      3. 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.

      4. Sistem menggunakan KEK untuk mendekripsi ENCMDEK dan menghasilkan MDEK.

      5. Sistem menjalankan kembali perintah yang ditentukan oleh polar_cluster_passphrase_command untuk memperoleh KEK baru (new_KEK) dan HMACK baru (new_HMACK).

      6. Sistem menggunakan new_KEK untuk mengenkripsi MDEK dan menghasilkan ENCMDEK baru (new_ENCMDEK).

      7. 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.

      8. Sistem menulis new_ENCMDEK, new_KEK_HMAC, dan informasi lain dari struktur KmgrFileData ke 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;
    Catatan

    Di mana:

    • Enkripsi tidak didukung untuk pd_lsn karena dekripsi memerlukan vektor inisialisasi (IV).

    • Bidang pd_flags mencakup flag 0x8000 untuk 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_checksum tidak 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 PageSetChecksumCopy atau PageSetChecksumInplace tetap 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 PageIsVerified tetap dipanggil. Oleh karena itu, proses dekripsi terjadi segera setelah checksum diverifikasi untuk memastikan bahwa data di memori berada dalam bentuk teks biasa.