Apa Saja yang Sebenarnya Bisa Diperiksa Pipeline Anda (Selain Sekadar Pemindaian Keamanan)
Ketika sebagian besar tim mulai menambahkan pemeriksaan ke pipeline deployment mereka, hal pertama yang terlintas adalah pemindaian keamanan kode aplikasi. Jalankan alat SAST, temukan beberapa kerentanan, selesai. Namun, jika Anda melihat apa yang sebenarnya mengalir melalui pipeline, ada lebih banyak hal yang layak diperiksa — dan beberapa di antaranya akan menyelamatkan Anda dari masalah yang tidak bisa ditangkap oleh pemindaian kode saja.
Pengiriman perangkat lunak modern tidak hanya memindahkan kode sumber. Ia memindahkan daftar dependensi, image container, definisi infrastruktur, file konfigurasi, dan kredensial. Setiap artefak ini membawa risikonya sendiri. Pipeline yang hanya memindai kode aplikasi berarti membiarkan sebagian besar permukaan serangan tidak terperiksa.
Berikut adalah jenis pemeriksaan yang bisa Anda jalankan di pipeline, apa yang mereka tangkap, dan kapan pemeriksaan tersebut masuk akal.
Pemindaian Dependensi
Hampir tidak ada aplikasi yang ditulis dari nol lagi. Proyek Anda menarik library dari npm, PyPI, Go modules, NuGet, atau Maven. Setiap dependensi tersebut adalah kode yang ditulis oleh orang lain, dan kode itu bisa memiliki kerentanan yang diketahui publik.
Pemindaian dependensi memeriksa daftar dependensi Anda terhadap basis data kerentanan. Ini memberi tahu Anda apakah ada library yang memiliki masalah keamanan yang diketahui pada versi yang Anda gunakan. Ini bukan tentang menemukan zero-day. Ini tentang menangkap kerentanan yang sudah terdokumentasi dan seringkali sudah ada tambalannya.
Jalankan pemindaian ini setiap kali file dependensi Anda berubah — package.json, go.mod, requirements.txt, atau apa pun yang digunakan ekosistem Anda. Setidaknya, jalankan sekali selama fase build. Jika Anda hanya menjalankannya pada pull request, Anda mungkin melewatkan kerentanan yang diperkenalkan dengan menggabungkan pembaruan dependensi langsung ke branch utama.
Berikut adalah cuplikan YAML minimal untuk job GitHub Actions yang menjalankan npm audit dan menggagalkan pipeline jika ditemukan kerentanan dengan tingkat keparahan tinggi:
name: dependency-scan
on:
pull_request:
paths:
- 'package.json'
- 'package-lock.json'
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm audit --audit-level=high
Pemindaian Image Container
Jika Anda mengemas aplikasi sebagai image container, image tersebut berisi lebih dari sekadar kode Anda. Ia berisi image dasar, lapisan sistem operasi, library sistem, dan biner yang tidak Anda tulis. Kerentanan di image dasar memengaruhi aplikasi Anda sama seperti kerentanan di kode Anda sendiri.
Pemindaian image container memeriksa seluruh konten image, termasuk paket OS dan library yang terinstal. Ini menangkap hal-hal seperti versi OpenSSL yang rentan di image dasar atau eksploitasi yang diketahui di utilitas sistem yang tidak pernah dipanggil langsung oleh aplikasi Anda tetapi masih ada di runtime.
Waktu yang tepat untuk menjalankan pemindaian ini adalah tepat setelah image dibangun, sebelum image tersebut didorong ke registry atau di-deploy ke mana pun. Setelah image berada di produksi, memindainya masih berguna untuk visibilitas, tetapi kerusakan sudah mungkin terjadi.
Pemindaian Infrastruktur sebagai Kode
Ketika Anda menulis infrastruktur sebagai kode dengan Terraform, CloudFormation, atau Pulumi, Anda mendefinisikan sumber daya cloud dalam file teks. File-file tersebut dapat berisi konfigurasi yang salah yang membuka celah keamanan: bucket penyimpanan yang dapat diakses publik, database yang terpapar ke internet, enkripsi yang dinonaktifkan, atau peran IAM yang terlalu permisif.
Pemindaian IaC memeriksa definisi infrastruktur Anda terhadap praktik terbaik keamanan sebelum Anda menerapkannya. Ini bukan pengganti alat manajemen postur keamanan cloud yang memindai lingkungan yang sedang berjalan. Ini adalah pemeriksaan preventif yang menangkap masalah sebelum menjadi sumber daya yang di-deploy.
Jalankan pemindaian ini ketika seseorang membuka pull request yang mengubah kode infrastruktur. Itulah titik di mana Anda masih bisa memperbaiki konfigurasi tanpa harus membersihkan sumber daya yang salah konfigurasi yang sudah berjalan.
Pemindaian Rahasia
Pengembang secara tidak sengaja melakukan commit rahasia ke repositori lebih sering daripada yang diakui tim. Kunci API, kata sandi basis data, kunci privat SSH, dan token akun layanan berakhir di kode, file konfigurasi, atau pesan commit. Begitu rahasia berada di riwayat repositori, menghapusnya sulit karena ia hidup di riwayat git.
Pemindaian rahasia mendeteksi pola yang terlihat seperti kredensial: string yang cocok dengan format kunci akses AWS, token GitHub, webhook Slack, atau kata sandi generik. Ini menandainya sebelum commit mencapai branch utama.
Pemindaian ini paling efektif jika dijalankan pada setiap commit atau setidaknya pada setiap pull request. Semakin awal Anda menangkap rahasia yang bocor, semakin sedikit eksposur yang Anda miliki. Jika Anda hanya memindai setelah kode digabungkan, rahasia tersebut sudah ada di repositori dan siapa pun dengan akses bisa menariknya.
Pemindaian Lisensi
Setiap dependensi yang Anda gunakan datang dengan lisensi. Beberapa lisensi mengharuskan Anda menyertakan atribusi. Yang lain membatasi penggunaan komersial atau mengharuskan Anda untuk open source kode Anda sendiri jika Anda menggunakannya. Pemindaian lisensi memeriksa lisensi semua dependensi Anda terhadap kebijakan yang telah ditentukan oleh tim atau organisasi Anda.
Ini bukan pemeriksaan keamanan, tetapi ini adalah pemeriksaan hukum dan kepatuhan yang dapat memblokir rilis jika diabaikan. Banyak tim menjalankan pemindaian lisensi bersamaan dengan pemindaian dependensi karena keduanya menggunakan sumber data yang sama — daftar dependensi Anda.
Kebijakan sebagai Kode
Kebijakan sebagai kode bukanlah satu jenis pemindaian. Ini adalah cara untuk mengkodekan aturan dan menegakkannya secara terprogram di pipeline Anda. Alih-alih mengandalkan pemindai yang sudah jadi, Anda mendefinisikan pemeriksaan Anda sendiri: "setiap perubahan basis data harus ditinjau oleh DBA," "setiap image container harus berasal dari registry yang disetujui," "setiap deployment ke produksi harus memiliki load test yang lulus."
Aturan-aturan ini ditulis sebagai kode dan dieksekusi secara otomatis di pipeline. Kebijakan sebagai kode memberi Anda fleksibilitas untuk menegakkan apa pun yang relevan dengan konteks Anda tanpa harus menunggu vendor menambahkan fitur.
Memilih Apa yang Akan Dijalankan dan Kapan
Tidak semua pemeriksaan perlu dijalankan di setiap tahap. Beberapa cukup murah untuk dijalankan pada setiap commit. Yang lain lebih lambat dan lebih masuk akal pada pull request atau sebelum deployment. Kuncinya bukan menjalankan semuanya di mana-mana, tetapi menempatkan setiap pemeriksaan pada titik di mana ia memberikan nilai paling banyak dengan gesekan paling sedikit.
Berikut adalah titik awal yang praktis:
- Setiap commit: pemindaian rahasia, pemindaian dependensi (jika file dependensi berubah)
- Pull request: pemindaian IaC, pemindaian lisensi, pemindaian image container (jika image dibangun ulang)
- Sebelum deployment: pemindaian image container (jika belum dilakukan), pemeriksaan kebijakan sebagai kode
Daftar Periksa Cepat untuk Pipeline Anda
- Pemindaian dependensi berjalan ketika file dependensi berubah
- Image container dipindai sebelum mencapai registry
- Kode infrastruktur dipindai sebelum diterapkan
- Rahasia terdeteksi sebelum mencapai branch utama
- Kepatuhan lisensi diperiksa untuk setiap dependensi
- Kebijakan kustom ditegakkan sebagai kode, bukan sebagai gerbang manual
Intisari Konkret
Pipeline yang hanya memindai kode aplikasi hanya memeriksa satu lapisan dari proses pengiriman multi-lapis. Dependensi, container, definisi infrastruktur, dan kredensial Anda semuanya membawa risiko. Tambahkan pemeriksaan untuk setiap jenis artefak pada titik yang tepat di pipeline. Tujuannya bukan untuk memblokir setiap perubahan, tetapi untuk menangkap masalah cukup awal sehingga memperbaikinya masih murah.