Semua artikel
// Artikel

Review Keamanan Terraform untuk Infrastructure as Code

Dipublikasikan 22 Juli 2026

Review Terraform menilai apakah perubahan infrastruktur dapat diprediksi, ditelusuri, dan terlindungi dari paparan secret. HashiCorp menjelaskan state serta plan dapat memuat atribut resource yang sensitif. sensitive = true menyamarkan tampilan CLI dan UI normal, tetapi tidak mencegah nilai tersimpan pada state atau plan. Perlakukan state, saved plan, log, dan akses backend sebagai material sensitif produksi.

Paket review

Kumpulkan source root dan module, terraform.lock.hcl, konfigurasi backend, peta workspace atau environment, konfigurasi identitas CI, output terraform validate, artefak plan yang direview, record apply, dan register pengecualian. Kaitkan setiap record dengan commit, versi Terraform, pilihan provider pada lockfile, workspace, timestamp, owner, serta keputusan pass/fail.

PermukaanKriteria buktiKondisi passOwner
Backend stateenkripsi, daftar akses, audit log, jalur pemulihanleast privilege dan state remote terlindungiowner platform
Nilai sensitifdeklarasi variabel/output dan review paparan statetidak ada default secret; penanganan sesuai kebutuhan storageowner module
Providersource/versi wajib dan diff lockfileseleksi dipin dan direviewowner kode
Planbinary plan serta hasil review atau record CI tepercayareviewer memeriksa perubahan sebelum applyowner perubahan
Eksekusiidentitas CI dan log applyidentitas dapat ditelusuri; jalur disetujui sajaowner rilis

Lindungi state sebelum membuat resource

terraform.tfstate lokal adalah plaintext. Kecualikan state dan file plan dari version control, tetapi jangan berhenti di sana: gunakan state remote dengan enkripsi saat tersimpan, TLS saat transit, role baca/tulis sempit, audit logging, backup, dan uji pemulihan. Pisahkan environment dan batasi pembaca state; izin baca dapat membuka credential, password database, endpoint, dan metadata resource.

HashiCorp mendokumentasikan bahwa sensitive menyamarkan tampilan, tetapi nilainya tetap tersimpan dalam state dan plan. Untuk nilai sementara, versi Terraform yang didukung dapat memakai ephemeral = true pada konteks yang didukung atau write-only argument provider; verifikasi perilaku provider sebelum mengandalkannya. Jangan tampilkan output terraform output -raw atau -json di log bersama. Rotasi secret yang pernah masuk state, artefak plan, log CI, atau source; menghapus satu baris source tidak menghapus salinan historis.

terraform {
  required_providers {
    aws = { source = "hashicorp/aws", version = "~> 5.0" }
  }
}

variable "database_password" {
  type      = string
  sensitive = true
  ephemeral = true # gunakan hanya bila Terraform/provider mendukung
}

Contoh ini tidak mengamankan backend dan bukan konfigurasi produksi lengkap. Bukti harus memperlihatkan policy backend, pengaturan enkripsi, principal berwenang, dan ekspor access log.

Pin input, review plan

Pin source serta version constraint provider, commit terraform.lock.hcl yang direview, dan inspeksi perubahan lockfile dalam pull request. Pin versi membatasi perubahan resolusi tak terduga; ini tidak membuktikan kode provider aman. Review source module, revision, validasi input, paparan output, dan default resource. Referensi module mengambang, aksi IAM * luas, ingress publik, enkripsi nonaktif, dan perubahan lifecycle destruktif memerlukan temuan eksplisit atau pengecualian beralasan.

Jalankan terraform fmt -check dan terraform validate. Buat plan di environment terkontrol dengan workspace serta input yang dimaksud. Simpan digest atau artefak CI terlindungi, lalu reviewer bernama membandingkan create, update, destroy, perubahan akses, paparan publik, perubahan enkripsi, dan risiko kehilangan data dengan permintaan yang disetujui. Apply saved plan yang sama hanya bila environment serta credential sesuai asumsi review; buat ulang dan review ulang setelah source, lockfile, variabel, atau target berubah.

Bukti, pengecualian, perbaikan

Pass memerlukan artefak selesai, bukan pernyataan niat. Contoh record perbaikan: pull request lockfile provider di-merge; plan tidak menunjukkan destroy tak diinginkan; policy role state diuji menolak pembacaan tanpa otorisasi; owner keamanan mencatat hasil. Fail bila plan direview setelah apply, role state dipakai bersama, atau secret berada dalam default variabel tanpa rencana migrasi.

Pengecualian memerlukan module/resource terdampak, ancaman, alasan, kontrol kompensasi, owner bisnis, approver, expiry, tiket perbaikan, dan tanggal retest. Expiry tanpa perpanjangan kembali menjadi fail. Deliver scope, revisi source, review akses state, register provider/module, record review plan, temuan, pengecualian, owner perbaikan, dan batas residual. Review Terraform tidak membuktikan cloud yang sudah dideploy bebas drift; bandingkan konfigurasi runtime secara terpisah. Audit kode dapat menilai module dalam scope yang disepakati.

Kasus kerja: gate plan destruktif

Jalankan plan terhadap state uji terisolasi setelah mengubah satu properti resource yang membutuhkan replacement. Output yang diharapkan mengidentifikasi replacement sebelum apply, mencantumkan dependensi terdampak, dan tidak memuat alamat resource di luar cakupan tanpa review. Simpan artefak plan hanya di tempat yang terlindung dari pengungkapan rahasia, lalu jalankan validasi policy dan format terhadap revisi sama. Reviewer membandingkan perubahan plan dengan change request dan menolak drift tak dikenal, bukan menerapkannya agar plan terlihat bersih.

Uji variable hilang, objek remote dihapus, upgrade provider, state lock contention, dan import resource yang sudah ada. Bukti penutupan memuat revisi commit, ringkasan plan tersanitasi, hasil policy, keputusan reviewer, output apply untuk environment uji, dan refresh pasca-apply yang menunjukkan state dimaksud. Bypass darurat memerlukan approver bernama, target sempit, masa berlaku, serta review plan retrospektif. Review IaC ditutup setelah state teramati dan konfigurasi dideklarasikan selaras, bukan saat sintaks lolos.

Serah-terima operasional: owner state membatasi akses state, mendokumentasikan recovery backend, dan mereview update lock provider dengan output plan. Owner deployment mencatat workspace target serta sumber variable tiap apply. Ulangi plan dari runner bersih bila identitas runner memengaruhi akses provider.

Sources

Punya sistem yang perlu diuji?