Pelajari cara menulis profil compliance dengan Chef InSpec menggunakan kontrol dan describe blocks, resource package, service, file, dan command, lalu jalankan inspec exec untuk memindai node, termasuk workflow menulis profil ala CIS dan STIG serta integrasi dengan Chef Automate.

Di episode 10 kalian sudah mengenal Policyfile dan bagaimana Policyfile.lock.json menjamin reproduksibilitas penuh untuk setiap rilis. Kalian tahu cara mendefinisikan run list dan cookbook secara deklaratif, lalu merilisnya ke policy group seperti staging dan production tanpa memutasi cookbook di server. Infrastruktur kini bisa dibangun ulang dengan identik, tetapi belum ada yang menjawab satu pertanyaan penting: apakah konfigurasi yang sudah dirilis benar-benar aman dan patuh pada standar?
Menjalankan chef-client bisa memastikan state yang diinginkan tercapai, tetapi tidak menjamin tidak ada penyimpangan setelahnya. Sebuah file konfigurasi bisa diubah, service bisa dihentikan, atau port bisa terbuka. Untuk mendeteksi penyimpangan ini, kalian butuh Chef InSpec, mesin pengujian compliance berbasis kode.
Episode 11 ini akan membahas cara menulis profil dan kontrol InSpec dengan describe blocks, resource package, service, file, dan command, menjalankan inspec exec untuk memindai node, serta workflow compliance dengan profil ala CIS dan STIG dan integrasi hasilnya dengan Chef Automate.
Profil InSpec adalah kumpulan kontrol yang mendeskripsikan kondisi keamanan yang harus dipenuhi oleh sebuah sistem. Kontrol adalah satu pengujian dengan identitas unik dan deskripsi. Struktur profil dihasilkan dengan perintah:
inspec init profile baselinePerintah ini membuat struktur berikut:
baseline/
├── README.md
├── attributes/ # atribut profil (opsional)
├── controls/
│ └── example.rb # file kontrol utama
└── inspec.yml # metadata profilFile inspec.yml adalah metadata profil: nama, versi, maintainer, dan platform yang didukung.
Kontrol ditulis dalam Ruby di dalam controls/. Setiap kontrol memiliki deskripsi singkat, tag untuk pelacakan, dan satu atau lebih blok describe do. InSpec mengeksekusi describe do lalu melaporkan hasilnya sebagai kontrol yang lulus atau gagal.
control 'cis-1-1' do
impact 0.7
title 'Set sudoers file permissions'
desc 'sudoers file harus dimiliki oleh root dan mode 0440'
tag cci: 'CCI-000225'
tag cis: '1.1'
describe file('/etc/sudoers') do
it { should exist }
it { should be_owned_by 'root' }
it { should be_grouped_into 'root' }
it { should be_mode 0440 }
end
endKontrol di atas menguji keberadaan file /etc/sudoers, kepemilikan root, dan permission 0440. impact menunjukkan tingkat keparahan antara 0 dan 1, sementara tag menghubungkan kontrol dengan referensi eksternal seperti CIS Control Version.
Note
Setiap blok describe boleh memuat banyak pernyataan it. InSpec mengevaluasi semuanya dan melaporkan per pernyataan. Jika satu pernyataan gagal, kontrol tetap berjalan sampai selesai sehingga kalian mendapat gambaran lengkap, bukan berhenti di kegagalan pertama.
InSpec menyediakan resource bawaan untuk menguji berbagai aspek sistem. Empat yang paling sering dipakai:
describe file('/etc/ssh/sshd_config') do
it { should be_file }
it { should be_owned_by 'root' }
it { should be_mode 0644 }
its('content') { should match 'PermitRootLogin no' }
endResource command menjalankan perintah di sistem target dan menguji output, exit status, serta stderr-nya. Ini paling berguna saat tidak ada resource spesifik untuk hal yang ingin diuji.
Tip
Resource InSpec mengikuti aturan penamaan yang konsisten. Jika kalian butuh yang lain, inspec resource list menampilkan seluruh resource yang tersedia, dan inspec help resource <nama> menjelaskan sintaksnya. Misalnya resource port, user, dan group sangat berguna untuk audit keamanan jaringan.
Untuk memindai sistem, gunakan inspec exec dengan profil dan target:
inspec exec baseline
inspec exec baseline -t ssh://deploy@203.0.113.30 -i ~/.ssh/id_ed25519Perintah pertama memindai mesin lokal, sedangkan yang kedua menghubungi mesin remote lewat SSH memakai kunci privat. Hasil scan menampilkan jumlah kontrol yang lulus, gagal, dan tidak berlaku, beserta detail tiap kontrol yang gagal. Untuk menegaskan bahwa scan harus berhenti dengan exit code gagal saat ada kontrol yang tidak lulus, gunakan inspec exec baseline --fail-if 'failed > 0':
inspec exec baseline --fail-if 'failed > 0' --reporter cli json:/tmp/scan.jsonOpsi --reporter cli json:/tmp/scan.json menulis hasil scan dalam dua format sekaligus: ringkasan di terminal dan detail lengkap dalam JSON. File JSON inilah yang nanti dikirim ke Chef Automate.
Important
Output dalam format JSON adalah jembatan antara InSpec dan sistem lain. Pipeline CI, dashboard compliance, dan Chef Automate semuanya membaca format ini. Biasakan selalu menyertakan reporter JSON dalam setiap scan yang akan diintegrasikan ke alur kerja.
Profil compliance produksi biasanya mengikuti standar publik seperti CIS Benchmarks atau STIG (Security Technical Implementation Guide), dan Chef menyediakan profil resmi yang bisa dipakai sebagai titik awal:
inspec supermarket profile cis-ubuntu-22.04
inspec exec cis-ubuntu-22.04 -t ssh://deploy@203.0.113.30Untuk kebutuhan internal, warisi profil standar lalu perkuat dengan kontrol tambahan:
name: corporate-baseline
version: 0.1.0
depends:
- name: cis-ubuntu-22.04
url: https://supermarket.chef.io/profiles/cis-ubuntu-22.04Profil warisan dipakai lewat tag include_controls di kontrol utama, memungkinkan kalian menambahkan kontrol kustom di atas standar nasional. Alur kerja yang disarankan: cek compliance di staging setelah setiap rilis policy, lalu hanya promosi ke production jika scan staging lulus semua kontrol wajib.
Warning
Profil CIS dan STIG sering memuat kontrol yang saling bertentangan dengan kebutuhan bisnis. Kelola pengecualian secara eksplisit lewat tag dan atribut profil, bukan dengan menghapus kontrol, agar jejak audit tetap lengkap dan dapat dijelaskan.
Chef Automate adalah platform yang menampilkan hasil scan InSpec dalam dashboard compliance. Alur integrasinya: node memakai resource chef_automate atau agent scan-jobs menjalankan inspec exec secara berkala, lalu mengirim hasilnya sebagai JSON ke Automate via endpoint data collection. Automate kemudian menampilkan skor compliance per node, per profil, dan per kontrol dalam bentuk grafik, sehingga kesehatan node, status run chef-client, dan hasil compliance tampil di satu layar.
Untuk mengirim hasil scan secara langsung dari profil InSpec ke Automate, jalankan scan dengan reporter automate:
inspec exec baseline \
--reporter automate \
--inspec-opt automate-url https://automate.example.com \
--inspec-opt token $AUTOMATE_TOKENPastikan token yang dipakai adalah token API dengan izin compliance scanning. Setelah terkirim, dashboard Automate menampilkan tren skor seiring waktu, sehingga penyimpangan yang terjadi setelah rilis bisa terlihat dan ditindaklanjuti.
Pada episode 11 ini kalian sudah belajar menulis profil dan kontrol InSpec dengan describe blocks, memakai resource package, service, file, dan command untuk menguji berbagai aspek sistem, serta menjalankan scan dengan inspec exec baik secara lokal maupun remote. Kalian juga sudah memahami workflow compliance dengan profil CIS dan STIG beserta integrasi hasil scan ke Chef Automate.
Inti yang harus dibawa pulang:
it yang menilai resource seperti file, package, service, dan command.Di episode 12 berikutnya kita akan membahas Chef Automate secara utuh: dashboard compliance dan visibilitas node, kesehatan node, status run cookbook, pipeline compliance untuk CI/CD, serta peran data collection service dalam platform Automate. Sampai jumpa.