Menutup lapisan keamanan terakhir dengan enkripsi menyeluruh: enkripsi in transit dan at rest di semua lapisan (disk, file, kolom), pengelolaan kunci yang benar dengan KMS dan Vault berikut rotasi otomatis, memahami transparent data encryption (TDE), dan menganalisis skenario breach untuk melihat di mana enkripsi benar-benar menyelamatkan data

Enkripsi adalah lapisan keamanan terakhir — dan paling sering disalahpahami. Di episode 9 dan 18 kita sudah mengenal enkripsi in transit (TLS) dan menyentuh at rest; episode ini merangkainya menjadi strategi menyeluruh: apa yang dienkripsi, di lapisan mana, dan — yang paling sering dilupakan — siapa yang memegang kuncinya.
Pelajaran inti yang harus kalian hafal: encryption without key management is just obfuscation. Menyalakan enkripsi tanpa mengelola kunci (siapa pegang, bagaimana rotasi, apa yang terjadi saat kunci hilang) adalah keamanan palsu — dan bisa berubah menjadi bencana saat kunci hilang dan data tidak bisa dibuka sama sekali.
Data berpindah posisi; tiap posisi butuh enkripsi berbeda:
| Saat data | Jenis enkripsi | Tanggung jawab |
|---|---|---|
| Mengalir di jaringan | In transit: TLS/mTLS | Episode 18 |
| Diam di disk (file DB) | At rest: disk/volume, TDE | Episode ini |
| Diam di backup | At rest: object storage + server-side encryption | Episode ini |
| Kolom sensitif tertentu | Field-level: pgcrypto / app-layer | Episode 9 + ini |
| Di memori (opsional) | In-memory encryption | Lanjutan, jarang |
Prinsip: data harus terenkripsi di tiap kondisi. TLS saja tidak cukup — file backup yang dicuri dari object storage harus tidak terbaca tanpa kunci. Enkripsi at rest juga melindungi dari penyalahgunaan fisik (disk bekas, server dicuri) dan persyaratan compliance (episode 16).
Cara tercepat dan paling luas cakupannya: enkripsi di level disk/volume — semua yang ditulis ke disk terenkripsi transparan. Pilihan:
--storage-encrypted — sudah kita aktifkan di episode 12), Google Cloud Storage encryption, Azure SSE.pgcrypto/encryption di layer file).sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup open /dev/sdb1 db_enc
sudo mkfs.ext4 /dev/mapper/db_enc
# mount /dev/mapper/db_enc di mount point data PostgreSQLDi cloud, aktivasinya cukup flag: --storage-encrypted untuk RDS. Keuntungannya nol perubahan aplikasi; kerugiannya cakupan terbatas pada disk — data yang keluar (backup ke object storage, log ke tool lain) butuh enkripsi di lapisan berikutnya.
Ini bagian yang membedakan profesional dari amatir. Kunci enkripsi adalah objek paling sensitif dalam sistem — jangan pernah disimpan dekat data yang dienkripsinya.
KMS (Key Management Service): layanan cloud yang menyimpan kunci master dan melakukan enkripsi/dekripsi atas nama aplikasi:
aws kms create-key --description "Kunci utama DB produksi"
aws rds create-db-instance \
--db-instance-identifier appdb \
--storage-encrypted \
--kms-key-id arn:aws:kms:ap-southeast-1:1234:key/xxxxPoin KMS yang wajib dipahami:
HashiCorp Vault untuk on-prem/self-managed: menyimpan kunci dan mengeluarkan kredensial database secara dinamis (episode 14). Vault juga bisa membuat kunci enkripsi database yang dirotasi berkala:
vault secrets enable transit
vault write -f transit/keys/db-main
# aplikasi meminta enkripsi/dekripsi lewat API VaultSkenario klasik yang harus bisa kalian jelaskan: kunci hilang = data hilang. Enkripsi tanpa kunci yang dikelola berarti data terkunci permanen. KMS/Vault justru ada untuk mencegah ini — kunci terpisah, direplikasi, dan bisa di-restore.
TDE adalah fitur yang dimiliki database komersial (MSSQL, Oracle) dan cloud (RDS Oracle/SQL Server): file database dienkripsi secara transparan di level storage engine — aplikasi dan query tidak berubah sama sekali, tapi file .mdf/datafile tidak terbaca tanpa kunci.
Cara kerjanya berlapis:
Keuntungannya: transparan (tanpa perubahan aplikasi), melindungi backup & file. Kelemahannya: performa CPU (ringan di hardware modern), dan tidak melindungi dari query berbahaya — user yang punya akses SELECT tetap bisa membaca data. TDE melindungi file, bukan akses.
PostgreSQL komunitas tidak punya TDE native (opsi: pg_tde/enterprise, atau enkripsi disk/LUKS). Di praktik, enkripsi disk + field-level untuk kolom kritis adalah kombinasi paling umum di dunia Postgres.
Untuk kolom yang benar-benar kritis (nomor kartu, KTP), enkripsi di lapisan aplikasi atau database:
CREATE EXTENSION IF NOT EXISTS pgcrypto;
INSERT INTO cards (number_enc)
VALUES (pgp_sym_encrypt('4111-1111-1111-1111', 'kunci-aplikasi'));
-- query memakai kunci yang dirotasi via aplikasi/Vault
SELECT pgp_sym_decrypt(number_enc, 'kunci-aplikasi') FROM cards;Trade-off yang wajib dipertimbangkan:
WHERE =. Pertimbangkan hash/keystore terpisah untuk lookup (atau pgcrypto untuk password hash — episode 9).Warning
Field-level encryption adalah keputusan arsitektur, bukan sekadar "tambah kolom". Sebelum mengenkripsi sebuah kolom, tanyakan: kolom ini di-query bagaimana? apakah harus di-index? siapa yang memegang kunci? apakah rotasi kunci tersedia? Enkripsi yang membuat aplikasi tidak bisa berfungsi adalah keputusan yang lebih buruk daripada tidak enkripsi — karena orang akan "memperbaiki" dengan menaruh kunci di tempat yang salah.
Rotasi kunci menjaga kerusakan tetap terbatas: jika satu kunci bocor, dampaknya hanya pada periode pemakaian kunci itu. Frekuensi bergantung kepentingan:
Proses rotasi yang benar untuk DB at rest di cloud: buat kunci baru, RDS memakai versi kunci baru untuk re-encrypt tanpa downtime; file lama tetap terbaca sampai re-encrypt selesai. Di on-prem: rencanakan window, re-encrypt file backup, perbarui semua referensi. Uji rotasi di staging — rotasi yang gagal di production adalah insiden (episode 20).
Cara terbaik menguji strategi enkripsi: bayangkan skenario nyata.
| Skenario | Yang melindungi | Apakah data selamat? |
|---|---|---|
| Backup DB dicuri dari object storage | Enkripsi object storage + KMS | Ya, tanpa kunci tidak terbaca |
| Server fisik dicuri dari DC | LUKS/EBS encryption | Ya |
| Attacker masuk aplikasi & baca tabel | Access control (bukan enkripsi!) | Tidak — enkripsi bukan anti-query |
pg_dump file hasil backup bocor via email | Enkripsi file backup (gpg/age) | Ya |
| Kunci KMS hilang (admin hapus) | Pemulihan kunci / key rotation history | Tidak — ini bencana terburuk |
Perhatikan baris ketiga: enkripsi at rest tidak melindungi dari query berbahaya — untuk itu ada least privilege (episode 9). Strategi enkripsi yang jujur menyatakan apa yang dilindungi dan apa yang tidak.
Inti yang harus dibawa pulang:
Di episode 20 selanjutnya kita menghadapi malam-malam terburuk DBA: incident & troubleshooting — men-debug deadlock, lock contention, dan connection exhaustion, mengikuti alur diagnosa yang sistematis, serta menjalankan post-mortem yang berujung perbaikan, bukan cari siapa yang salah. Sampai jumpa di episode 20!