Arman Ridho MaulanaArman Ridho
  • Home
  • About
  • Skills
  • Experience
  • Projects
  • Certifications
  • Blog
  • Contact
Download CV
Back to Blog
August 18, 2026terraforminfrastructure-as-codecloud-securitydevsecops

Infrastructure as Code Security: Taming Terraform Before It Bites You

Infrastructure as Code membawa kecepatan sekaligus risiko: satu baris Terraform yang ceroboh bisa langsung membuka seluruh perimeter keamanan lo. Artikel ini menceritakan bagaimana gue belajar mengamankan IaC lewat secret management, least-privilege IAM, policy as code, dan disiplin state file supaya deploy tetap cepat tapi nggak bikin panik di Jumat malam.

Prolog: Jumat malam yang berubah jadi mimpi buruk

Gue masih ingat betul malam itu. Jumat, jam sepuluh lewat, gue duduk di depan laptop dengan secangkir kopi yang udah dingin. Di layar cuma ada satu baris perintah yang kelihatannya nggak berbahaya sama sekali: terraform apply. Gue tekan enter, lihat progress bar jalan, dan dalam hitungan detik infrastruktur production kami nambah tiga server, satu database, dan satu bucket storage baru. Semua hijau. Semua kelihatan beres.

Masalahnya baru kerasa tiga hari kemudian, pas tim security kami nemuin ada satu bucket S3 yang bisa dibaca siapa aja dari internet. Di dalamnya? Backup database yang berisi data pribadi puluhan ribu user. Nggak ada password, nggak ada enkripsi, nggak ada logging. Cuma satu baris di file Terraform kami yang nulis acl = "public-read", warisan dari sebuah tutorial lama yang gue copy-paste pas lagi buru-buru.

Itu momen di mana gue sadar: Infrastructure as Code itu bukan cuma soal bikin server jadi otomatis. Ia juga otomatis ngebikin lubang keamanan kalau lo nggak hati-hati. Dan karena semuanya tertulis dalam kode, kesalahannya pun ikut ke-Replikasi ke seribu resource sekaligus dalam satu apply.

Artikel ini bukan daftar periksa yang bisa lo centang lalu lupa. Ini lebih ke curhat gue tentang bagaimana pandangan gue soal keamanan berubah begitu infrastruktur mulai ditulis sebagai kode, plus pelajaran berdarah yang gue pelajari di jalan.

Kenapa kode infrastruktur itu beda dari kode biasa

Pas lo nulis aplikasi, bug paling parah biasanya bikin fitur nggak jalan atau app crash. Gangguannya lokal, dan biasanya langsung kelihatan pas testing. Tapi pas lo nulis infrastruktur sebagai kode, satu kesalahan bisa langsung bikin seluruh perimeter keamanan lo jebol. Bedanya fundamental: kode aplikasi ngatur logika, kode infrastruktur ngatur realitas fisik di cloud.

Terraform, CloudFormation, Pulumi, dan kawan-kawannya bekerja dengan prinsip deklaratif. Lo bilang ke sistem, "gue mau tiga server dengan spesifikasi begini," dan dia yang urus cara nyatakannya. Kedengarannya rapi. Tapi di situlah bahayanya: lo nggak selalu lihat detail teknis di balik deklarasi lo. Lo cuma nulis resource "aws_security_group" "web" {} dan dalam hati berharap default-nya aman. Spoiler: default-nya sering kali nggak aman.

Gue pernah kerja di tim di mana budaya "yaml/terraform engineer"-nya cuma ngejar cepet deploy. Semua di-hardcode, semua di-commit ke repo publik secara nggak sengaja, dan secret nyimpen di variabel yang kelihatan jelas. Pas gue tanya, "lo tahu ini bisa kebaca orang lain kan?", jawabannya santai aja: "nggak papa, repo-nya private." Dua minggu kemudian repo itu kebuka gara-gara salah setting permission organisasi. Pelajarannya kerasa: keamanan yang dibangun di atas asumsi itu sama aja kayak rumah di atas pasir.

Rahasia kecil yang jadi bencana besar

Mari kita bicara soal secret, karena ini adalah dosa nomor satu di dunia Infrastructure as Code. Gue pernah lihat orang nulis password = "Admin123!" langsung di file .tf. Terus pas gue ingetin, dia bilang, "tenang aja, ini cuma environment development." Masalahnya, file development itu di-copy jadi file production tanpa gue sadari, dan tiba-tiba password beneran ke-push ke GitHub. Bot scraper di internet butuh waktu kurang dari semenit buat nge-scan repo publik baru dan narik kredensial dari dalamnya.

Solusinya bukan "jangan push ke publik", karena manusia itu lelah dan bakal salah suatu saat. Solusinya adalah arsitektur yang bikin secret nggak pernah mendarat di kode lo sama sekali. Di Terraform, gue pakai pendekatan: variabel diisi dari environment variable atau dari secret manager seperti AWS Secrets Manager, Vault, atau parameter store terenkripsi. Kode lo cuma nyebut nama referensinya, bukan nilainya.

Dan jangan lupa soal state file. File terraform.tfstate itu ibarat buku harian yang nyimpen semua rahasia lo: IP address, konfigurasi, bahkan password kalau lo ceroboh. State file ini sering di-sync ke S3 atau backend remote. Kalau bucket-nya kebuka, seluruh topologi jaringan lo ketahuan orang. Gue selalu nyalain enkripsi di sisi server dan versioning yang dibatasi, plus nggak pernah taruh state di lokal laptop yang bisa ilang atau ke-copet.

IAM itu bukan cuma soal kasih akses

Satu kebiasaan buruk yang gue lihat berkali-kali: ngasih akses AdministratorAccess ke semua hal supaya "praktis". Di Terraform, ini muncul sebagai role dengan policy bintang di mana-mana. Action: "*" dan Resource: "*". Gue ngerti godaanannya, bikin cepet, nggak usah pusing mikirin permission per service. Tapi lo tau apa yang terjadi kalau token dengan akses segitu bocor? Penyerang bisa bikin user baru, putar kunci enkripsi, bahkan tutup alarm security lo.

Prinsip least privilege itu nggak usang meski kadang mengganggu. Gue mulai nulis IAM policy per modul, bukan per akun. Jadi modul database cuma punya akses ke resource database-nya, modul network cuma pegang VPC. Kalau satu token bocor, kerusakannya kebatasi di satu sudut, nggak langsung roboh semua.

Ada satu trik praktis yang gue pakai: jalankan Terraform dengan credential yang izinnya sesedikit mungkin, cuma seperlunya buat apply plan yang spesifik. Jangan pakai akun root buat hal rutin. Ini kayak lo nggak bawa parang besar ke dalam lift cuma buat potong kuku.

Security group dan ilusi "ini cuma buat testing"

ingress { from_port = 22, to_port = 22, cidr_blocks = ["0.0.0.0/0"] }. Baris ini gue yakin ada di jutaan repo Terraform di dunia. Buka port SSH ke seluruh internet. Alasannya hampir selalu sama: "lagi tes, nanti gue tutup." Spoiler lagi: nanti-nya jarang datang. Dan penyerang itu nggak tidur. Mereka punya bot yang scan port 22 sepanjang waktu, nyoba kombinasi password lemah, nyari celah.

Gue sekarang punya aturan besi: nggak ada 0.0.0.0/0 di port apa pun kecuali 80 dan 443, dan itu pun cuma buat resource yang emang harus kelihatan publik. Buat SSH, gue lebih milih pakai bastion host atau akses lewat VPN, bukan buka gerbang ke semua orang. Kalau memang butuh akses temporer, gue tulis di modul yang bisa dihapus dengan satu terraform destroy begitu selesai, bukan ditinggal nyala berhari-hari.

Hal yang sering luput: people lupa kalau security group itu stateful, tapi network ACL beda. Di Terraform, gue selalu definisikan keduanya secara eksplisit supaya nggak ada asumsi yang salah. Jaringan itu lapisan, dan tiap lapisan butuh pertahanan sendiri, bukan cuma ngandelin satu firewall di pinggir.

Policy as code: pasang gembok sebelum kunci rusak

Dulu gue mikir keamanan itu urusan orang security, di tahap akhir, pas semua udah jadi. Sekarang gue tahu itu cara berpikir yang salah. Kalau lo nunggu sampai infrastruktur live baru ngecek, lo udah telat. Celahnya udah kebuka di production.

Maka gue kenalin apa yang disebut policy as code. Alat seperti tfsec, Checkov, atau Sentinel bisa gue jalanin pas terraform plan atau pas review pull request. Mereka baca kode lo dan bilang, "eh, bucket lo public nih," atau "lo kasih akses admin ke semua orang lho." Dan yang paling penting: gue bisa bikin aturan itu jadi gerbang otomatis. Kalau scan nemuin masalah level tinggi, pipeline CI gue tolak merge-nya. Jadi kesalahan kecil kayak dulu gue nggak bakal sampai nembus ke production.

Pengalaman gue: pas pertama pasang tfsec di CI, dalam sehari ada sebelas flag yang ketangkap. Sepuluh di antaranya hal kecil yang gue anggap wajar. Tapi satu flagnya? Sebuah modul lama yang ngasih akses baca ke KMS key encryption ke role eksternal. Itu bisa jadi bencana pelan-pelan. Alat otomatis nggak capek, nggak lengah, dan nggak buru-buru kayak manusia. Itu alasan kenapa gue percayain mereka jaga gerbang.

State, modul, dan disiplin yang bikin tenang

Terraform itu kerasa magic pas pertama kali dipakai, tapi dia butuh disiplin biar nggak berubah jadi monster. Gue belajar tiga kebiasaan yang sekarang wajib:

Pertama, pecah infrastruktur jadi modul-modul kecil dengan tanggung jawab jelas. Jangan taruh semua resource di satu file raksasa main.tf yang ribuan baris. Modul bikin lo bisa pakai ulang kode dengan aman dan nge-review perubahan dengan kepala dingin.

Kedua, selalu baca plan sebelum apply. Kedengarannya sepele, tapi gue tahu banyak orang yang langsung enter tanpa beneran lihat apa yang bakal berubah. Plan itu semacam preview yang jujur: dia bilang "resource ini bakal dihapus" kalau lo salah rename. Gue pernah nyaris hapus database production gara-gara salah edit referensi, tapi plan-nya selamatin gue karena gue baca dulu.

Ketiga, jaga state file seperti jaga brankas. Remote backend dengan enkripsi, akses terbatas, dan logging nyala. Jangan pernah commit file state ke git. Gue pernah lihat kasus di mana state file ke-commit, orang lain clone, dapat semua IP dan konfigurasi, dan tim harus muter-muter ganti semua karena udah kebongkar.

Cerita tutup: dari panik ke tenang

Balik ke cerita bucket public di awal. Sesudah insiden itu, gue nggak langsung nambal dan lupa. Gue duduk bareng tim dan bikin aturan main: nggak ada public-read di kode mana pun tanpa review dua orang, tfsec wajib jalan di CI, dan secret cuma boleh lewat secret manager. Tiga bulan kemudian, gue bisa tidur tenang di Jumat malam karena gue tau setiap apply udah melewati gerbang otomatis yang nggak pernah lengah.

Infrastructure as Code itu pedang bermata dua. Dia bikin lo bisa bangun dunia dalam hitungan menit, tapi dia juga bisa ngehancurkan dunia lo dalam hitungan detik kalau keamanan diabaikan. Kabar baiknya: karena semuanya tertulis, semuanya juga bisa diaudit, diuji, dan diamankan sebelum nyata. Keamanan nggak harus jadi beban di akhir. Dia bisa jadi bagian dari kode yang lo tulis tiap hari.

Jadi kalau lo baru mulai main Terraform atau alat sejenis, jangan cuma belajar cara bikin resource. Belajar juga cara nggak bikin lubang. Karena di cloud, kecepatan lo bikin infrastruktur itu sebanding dengan kecepatan lo bikin masalah, kecuali lo pasang pagar sejak baris kode pertama.

Gue sekarang lebih suka lambat tapi aman daripada cepet tapi tiap malam deg-degan. Dan jujur, setelah semua sistemnya rapi, kerjaannya malah jadi lebih cepet, karena gue nggak lagi buang waktu ngeberesin kebakaran yang gue sendiri yang nyalain.

Related Posts

Aug 21, 20269 min read

Serverless Security: Defending Cloud Functions When There's No Server to Patch

Serverless sering disangka otomatis aman karena kita tak lagi urus server, padahal justru kode, IAM, secret, dan input tetap jadi pintu masuk. Artikel ini menceritakan bagaimana gue sadar fungsi cloud punya lubang sendiri, dan cara praktis mengamankannya tanpa perlu jadi ahli kriptografi.

serverless·cloud-security·aws-lambda·devsecops
Read article
Aug 15, 202613 min read

Kubernetes Security: RBAC, Network Policies, and Pod Hardening

Cerita gue mengamankan cluster Kubernetes yang tadinya dibiarkan terbuka — dari RBAC yang berantakan, network policy yang nggak ada, sampai pod yang jalan dengan privilege berlebihan. Semua langkahnya praktis dan bisa langsung lo terapin di cluster sendiri.

kubernetes·cloud-security·devsecops·rbac
Read article
Aug 29, 202611 min read

Self-Hosted Wazuh: Building a Cloud Telemetry Pipeline That Doesn't Cost a Fortune

Gue cerita gimana gue bangun SIEM self-hosted pakai Wazuh buat kumpulin log dari cloud dan server kita sendiri, dari kagetnya lihat tagihan SIEM managed sampai deteksi pertama yang beneran nangkep anomali.

wazuh·siem·blue-team·cloud-security
Read article
A
Arman Ridho

Cybersecurity & IT infrastructure professional building secure, reliable systems in Jakarta.

Navigate
  • Home
  • About
  • Skills
  • Projects
  • Contact
Explore
  • Experience
  • Certifications
  • Blog
  • Download CV
© 2026 Arman Ridho Maulana. All rights reserved.Built with Next.js & Gravity UI