Review Keamanan Terraform untuk Infrastructure as Code
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.
| Permukaan | Kriteria bukti | Kondisi pass | Owner |
|---|---|---|---|
| Backend state | enkripsi, daftar akses, audit log, jalur pemulihan | least privilege dan state remote terlindungi | owner platform |
| Nilai sensitif | deklarasi variabel/output dan review paparan state | tidak ada default secret; penanganan sesuai kebutuhan storage | owner module |
| Provider | source/versi wajib dan diff lockfile | seleksi dipin dan direview | owner kode |
| Plan | binary plan serta hasil review atau record CI tepercaya | reviewer memeriksa perubahan sebelum apply | owner perubahan |
| Eksekusi | identitas CI dan log apply | identitas dapat ditelusuri; jalur disetujui saja | owner 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.