Menyuntikkan security ke dalam solusi sejak fase desain: threat modeling ringkas dengan STRIDE, enkripsi in transit dan at rest, manajemen secret, prinsip least privilege untuk manusia maupun service, serta kontrol lapisan aplikasi yang membuat solusi lolos review keamanan

Setelah di episode 7 kalian bisa merancang lapisan data yang sehat — storage dipilih dari pola akses, analitik terpisah dari OLTP, cache terencana — kini kita bahas dimensi yang tidak boleh jadi renungan belakangan: security. Bukan karena idealisme, tetapi karena ekonominya: kontrol keamanan yang ditambahkan saat desain harganya menit; yang ditambahkan setelah insiden harganya reputasi, denda, dan minggu-minggu remediasi.
Mengapa security sering gagal di solusi nyata? Karena diperlakukan sebagai checklist di akhir ("sudah pakai HTTPS kan?") alih-alih properti desain. Pada episode ini kita membangun kerangka berpikir security-in-design; pendalaman arsitektur berlapisnya menyusul di episode 18, dan compliance formalnya di episode 19.
Sebelum menambahkan kontrol apa pun, jawab tiga pertanyaan: apa aset yang dilindungi, siapa penyerang potensial, dan dari mana mereka masuk? Kerangka paling praktis adalah STRIDE — enam kategori ancaman yang dipetakan ke kontrol:
| Ancaman (STRIDE) | Contoh pada Studi Kasus Tiket | Kontrol Desain |
|---|---|---|
| Spoofing | Penipuan login akun panitia | MFA wajib, session aman |
| Tampering | Ubah harga tiket di request checkout | Tanda tangan payload, validasi sisi server |
| Repudiation | Panitia menyangkal pernah memvalidasi tiket palsu | Audit log append-only |
| Information disclosure | Data pembeli bocor dari dump database | Enkripsi at rest, minimalkan PII |
| Denial of service | Banjir request di window sale | Rate limiting, WAF, autoscaling |
| Elevation of privilege | Service biasa membaca tabel pembayaran | IAM granular least privilege |
Latihan yang saya sarankan: ambil diagram solusi kalian, telusuri tiap panah dan kotak, tanyakan keenam kata itu satu per satu, tulis temuannya. Satu jam threat modeling di awal menghasilkan daftar kontrol konkret — jauh lebih produktif daripada "pasang firewall semua".
Dua fondasi yang tidak bisa dinegosiasikan di solusi modern:
Detail desain yang sering terlewat:
In transit : TLS 1.3 di edge (CDN/LB), mTLS antar-service internal
At rest : RDS + S3 + Redis terenkripsi CMK KMS, rotasi tahunan
Field : nomor kartu TIDAK disimpan (token gateway pembayaran)
QR tiket = JWT bertanda tangan, tanpa data PII di payloadSecret (password DB, API key partner, kredensial SMTP) butuh perlakuan khusus:
.env yang ter-commit.aws secretsmanager get-secret-value \
--secret-id prod/ticket/db-password \
--query SecretString --output textPerintah semacam ini dieksekusi oleh platform/service account saat deploy atau via sidecar — bukan oleh developer yang menyalin hasilnya ke file konfigurasi.
Dua populasi identitas dalam solusi kalian, dua perlakuan:
Ini yang paling sering bocor. Setiap service punya identitas sendiri (IAM role, workload identity) dengan izin minimum yang dibutuhkan — bukan satu role besar dipakai semua. Bandingkan:
// BURUK: satu policy luas untuk semua service
{ "Effect": "Allow", "Action": "s3:*", "Resource": "*" }
// BAIK: service tiket hanya boleh baca bucket poster
{
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": "arn:aws:s3:::ticket-assets/posters/*"
}Policy kedua membatasi dampak saat service tersebut dikompromikan: penyerang mendapat akses baca poster, bukan seluruh bucket. Prinsip yang sama berlaku di database (user aplikasi vs user migrasi), message broker, dan API internal.
Tip
Uji cepat least privilege: untuk setiap service, tanyakan "kalau kredensialnya bocor sekarang, apa maksimal kerusakan yang mungkin?" Kalau jawabannya "semua", perkecil lingkupnya sebelum production.
Di atas fondasi tadi, beberapa kontrol yang wajib ada di level desain aplikasi:
npm audit/ Dependabot), image base minimal, SBOM sederhana untuk traceability.Untuk referensi teknis web application, OWASP Top 10 dan OWASP ASVS adalah checklist gratis terbaik — gunakan ASVS level sesuai sensitivitas solusi saat review.
Tutup episode ini dengan mengisi bagian baru di template SDD kalian:
Aset kritis : data pembayaran, PII pembeli, kredensial panitia
Ancaman utama : DoS saat sale, credential stuffing, insider tampering
Kontrol : (ringkas per STRIDE - lihat tabel threat model)
Residu & rencana: pen-test eksternal pra-launch, bug bounty pasca-launchBagian inilah yang akan dibaca reviewer security — dan yang menyelamatkan kalian saat pertanyaan "kenapa tidak pakai X?" datang: jawabannya sudah tertulis sebagai keputusan dengan alasannya.
Inti yang harus dibawa pulang:
Di episode 9 selanjutnya kita akan membahas cost & budget solution — cara menghitung TCO secara jujur, memahami pricing model cloud (on-demand, reserved, spot), dan teknik desain yang ramah budget tanpa mengorbankan reliability target kalian. Sampai jumpa di episode 9!