Menerapkan zero trust secara konkret: identity-based design dengan service identity, mutual TLS dan perannya sebelum service mesh, least privilege end-to-end dari IAM sampai database user, serta peta adopsi bertahap zero trust untuk studi kasus modular monolith kita

Setelah di episode 17 kalian menjadikan biaya dimensi desain yang sadar — unit economics, trade-off model komputasi, dan cost model konkret studi kasus — pada episode ini kita kembali ke security dengan kedalaman penuh: zero trust software.
Episode 10 sudah meletakkan fondasinya: never trust, always verify. Kali ini kita turun ke implementasi arsitekturalnya — karena zero trust yang berhenti sebagai slide presentasi tidak mengamankan apa pun. Fokus kita tiga hal: bagaimana sistem memverifikasi identitas (bukan lokasi jaringan), bagaimana service saling membuktikan diri lewat mTLS, dan bagaimana least privilege ditegakkan sampai ke lapisan data.
Model lama membagi dunia menjadi dalam (dipercaya) dan luar (tidak). Masalahnya terbukti berulang: satu phishing, satu laptop karyawan terinfeksi, atau satu container jebol di DMZ — dan penyerang berjalan bebas di "dalam" yang dipercaya penuh.
Zero trust membalik aksioma:
| Asumsi Perimeter | Asumsi Zero Trust |
|---|---|
| Jaringan internal aman | Jaringan itu hostile, termasuk internal |
| IP/VLAN = identitas | Identitas kriptografis per workload |
| Autentikasi sekali di gerbang | Verifikasi tiap request |
| Otorisasi kasar per subnet | Least privilege granular per operasi |
Konsekuensi desainnya besar bagi architect: setiap komponen — manusia maupun mesin — harus punya identitas yang bisa diverifikasi dan kebijakan otorisasi yang menempel pada identitas itu, bukan pada alamat.
Fondasi teknis zero trust antar mesin adalah service identity: setiap workload mendapat identitas kriptografis yang diterbitkan infrastruktur, bukan dikonfigurasi manual.
Standar yang berkembang adalah SPIFFE (Secure Production Identity Framework For Everyone): identitas dinyatakan sebagai URI (spiffe://acme/ns/prod/sa/inventory), disertifikasi dalam dokumen bernama SVID, dan didistribusikan otomatis ke workload lewat agent.
Prinsip praktisnya tanpa harus memakai SPIFFE penuh:
1. Diterbitkan otomatis saat workload lahir
2. Berumur pendek & dirotasi otomatis
3. Terikat lifecycle workload (mati = identitas hangus)
4. Bisa diverifikasi oleh peer tanpa lookup manualImplementasi umum: sertifikat client dari PKI internal (Vault PKI, cert-manager) dengan TTL 24 jam; cloud-native alternatifnya workload identity bawaan provider (IRSA/GKE Workload Identity) yang memetakan service account Kubernetes ke role cloud.
TLS biasa hanya klien memverifikasi server. mTLS menambahkan arah sebaliknya — server juga memverifikasi klien. Hasilnya dua jaminan sekaligus: kerahasiaan kanal dan autentikasi kedua belah pihak.
Perhatikan urutan adopsi yang realistis untuk monolith modular kita:
1. TLS edge + plaintext internal ← titik awal banyak tim
2. TLS internal (server verif saja) → anti sniffing dasar
3. mTLS antar komponen utama → DB, broker, API
4. mTLS universal via mesh ← saat microservices luasLangkah 3 bisa dilakukan hari ini tanpa service mesh: PostgreSQL dan Kafka keduanya mendukung client certificate authentication — DB user ordering_app hanya menerima koneksi dengan sertifikat yang diterbitkan untuk modul ordering. Ini menyatukan dua cerita kita: identitas service menjadi cara login database, sehingga pelanggaran boundary data episode 7 semakin mustahil.
Service mesh (Istio/Linkerd/Cilium mesh) mengotomasi seluruh mTLS — sidecar atau eBPF menerbitkan dan merotasi sertifikat, policy dikelola deklaratif. Harganya kompleksitas operasional; aturan keputusan kita konsisten dengan episode 12: mesh masuk saat jumlah workload membuat manajemen sertifikat manual tak lagi sanggup.
Important
mTLS bukan pengganti otorisasi — ia membuktikan "ini benar-benar service inventory", tetapi belum menjawab "bolehkah inventory operasi ini?". Jawabannya ada di layer policy yang selalu dieksekusi di sisi penerima, bukan diasumsikan dari pemanggil.
Least privilege mudah diucapkan, sulit ditegakkan — karena ia harus konsisten di semua lapisan:
Role per service, scoped minimal: instance role modul payment hanya boleh baca secret prefix payment/* dan tulis bucket audit tertentu — bukan secrets/* semuanya. Kebocoran satu pod membatasi kerusakan pada scope role-nya.
Penerjemahan langsung dari episode 7-8: user DB per modul dengan hak eksplisit.
CREATE USER ordering_app;
GRANT USAGE ON SCHEMA ordering TO ordering_app;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES
IN SCHEMA ordering TO ordering_app;
-- TIDAK ADA grant ke schema inventory/payment:
-- pelanggaran boundary gagal di level SQL,
-- bukan hanya di code reviewOtorisasi per operasi dengan konteks (ReBAC episode 10): bukan "user admin boleh", melainkan "CS on-shift boleh refund order milik region-nya maksimal Rp500 ribu". Policy as code (OPA/OpenFGA) membuat aturan ini testable seperti logika bisnis lain.
Pipeline deploy memakai identity ephemeral (OIDC federation), bukan long-lived key di secrets store. Siapa boleh deploy ke produksi, dari branch mana, dengan approval siapa — semuanya kebijakan, bukan konvensi.
Mari susun roadmap realistis untuk modular monolith kita:
kuartal_1:
- oidc provider terpusat (users + CS + ops)
- secret via vault, rotasi otomatis
- DB user per module + schema grants ketat
- audit trail append-only (STRIDE-R ep10)
kuartal_2:
- TLS internal semua hop (DB, redis, kafka)
- workload identity: SA per modul di K8s
- IAM cloud scoped per service account
kuartal_3:
- client-cert auth: DB & kafka verifikasi
identitas modul (mTLS hop kritis)
- policy-as-code otorisasi (OPA) di jalur uang
- pipeline deploy via OIDC federation
kuartal_4:
- review: cakupan mTLS vs biaya mesh
(ekstraksi shipping/payment ep15 -> evaluasi ulang)
- chaos security drill: revoke credential acak,
ukur MTTR deteksi & pemulihan
prinsip_pengukur:
- "setiap request punya identitas terverifikasi?"
- "setiap credential berumur pendek & dirotasi?"
- "setiap izin scoped minimum & ter-audit?"Perhatikan desain roadmanya: tidak ada langkah "install mesh" di awal — nilai terbesar (identitas, least privilege, rotasi) dicapai dengan komponen yang sudah kita miliki. Mesh hanyalah otomasi yang menyusul saat skala menuntut.
Tip
Ukur kemajuan zero trust dengan satu metrik jujur: blast radius test. Ambil satu credential/service secara terkendali di staging, kompromikan, lalu petakan apa saja yang bisa disentuh penyerang. Semakin sempit jawabannya, semakin matang zero trust kalian — angka ini lebih bermakna daripada checklist compliance.
Inti yang harus dibawa pulang:
Di episode 19 selanjutnya kita keluar dari runtime ke rantai pasok: supply chain & compliance — SBOM, signing artefak, SLSA levels, serta cara merancang sistem yang compliant sejak desain, bukan diretrofit saat audit datang. Sampai jumpa!