Mengapa Anda Harus Memindai Image Container Sebelum Deployment (dan Cara Melakukannya)
Anda baru saja membangun image container baru. Proses build berhasil, pengujian lulus, dan image sudah ada di registry. Rasanya sudah siap untuk dipromosikan ke produksi. Namun ada masalah yang tidak terlihat: image tersebut mungkin mengandung kerentanan keamanan yang diketahui dan dapat memungkinkan penyerang mengambil alih server Anda.
Image container bukanlah kotak yang tersegel. Setiap image dibangun dari lapisan-lapisan: base image yang diunduh dari internet, library sistem, runtime bahasa pemrograman, dan kode aplikasi Anda sendiri. Setiap lapisan dapat membawa kerentanan. Base image yang aman minggu lalu mungkin memiliki CVE kritis yang ditemukan kemarin. Library yang Anda tambahkan tiga bulan lalu mungkin memiliki celah yang baru dilaporkan. Masalah-masalah ini tidak mengumumkan diri mereka sendiri. Anda harus memeriksanya.
Apa Itu Pemindaian Kerentanan?
Pemindaian kerentanan adalah proses otomatis yang membuka image container Anda, memeriksa setiap paket dan library di dalamnya, lalu membandingkannya dengan database kerentanan yang diketahui. Kerentanan ini dilacak sebagai CVE (Common Vulnerabilities and Exposures). Setiap CVE memiliki tingkat keparahan: rendah, sedang, tinggi, atau kritis.
Kerentanan kritis dapat memungkinkan eksekusi kode jarak jauh. Penyerang bisa mengambil alih server Anda tanpa autentikasi. Masalah dengan tingkat keparahan tinggi mungkin memungkinkan seseorang membaca file yang seharusnya tidak dapat diakses. Masalah sedang dan rendah lebih sulit dieksploitasi, tetapi tetap menambah risiko, terutama jika dikombinasikan dengan kelemahan lainnya.
Pemindaian menghasilkan laporan: paket mana yang terpengaruh, seberapa parah masalahnya, dan versi perbaikan mana yang harus Anda gunakan.
Mengapa Anda Tidak Bisa Memindai Sekali dan Melupakannya
Database kerentanan diperbarui setiap hari. CVE baru diterbitkan secara konstan. Base image yang lulus pemindaian bulan lalu mungkin sekarang memiliki celah kritis. Library yang Anda tetapkan ke versi tertentu mungkin memiliki kerentanan yang baru ditemukan yang tidak ada saat pertama kali Anda memilihnya.
Inilah mengapa pemindaian harus dilakukan setiap kali Anda membangun image. Bukan hanya pada build pertama. Bukan hanya ketika Anda ingat. Setiap build. Pemindaian harus menjadi bagian dari pipeline Anda, otomatis dan ditegakkan.
Di Mana Menempatkan Pemindaian dalam Pipeline Anda
Pemindaian ditempatkan di antara langkah build dan langkah promosi. Alur tipikalnya terlihat seperti ini:
Diagram alur berikut memvisualisasikan proses pengambilan keputusan ini:
Berikut adalah contoh praktis menggunakan Trivy dalam workflow GitHub Actions yang memindai image dan menggagalkan pipeline jika ditemukan kerentanan kritis:
scan-image:
runs-on: ubuntu-latest
steps:
- name: Pull image from registry
run: docker pull my-registry/my-app:${{ github.sha }}
- name: Run Trivy vulnerability scan
uses: aquasecurity/trivy-action@master
with:
image-ref: my-registry/my-app:${{ github.sha }}
format: table
exit-code: 1
severity: CRITICAL
exit-code: 1 memberitahu Trivy untuk mengembalikan kode keluar non-zero ketika kerentanan ditemukan, yang akan menghentikan pipeline. severity: CRITICAL menetapkan ambang kebijakan: hanya temuan kritis yang menyebabkan kegagalan. Ubah tingkat keparahan menjadi CRITICAL,HIGH jika Anda ingin memblokir keduanya.
- Bangun image
- Push image ke registry
- Jalankan pemindaian kerentanan
- Evaluasi hasil terhadap kebijakan Anda
- Jika pemindaian lulus, promosikan image ke lingkungan berikutnya
- Jika pemindaian gagal, hentikan pipeline dan perbaiki image
Pemindaian harus dijalankan setelah image dibangun tetapi sebelum mencapai staging atau produksi. Dengan cara ini, image yang rentan tidak akan pernah meninggalkan registry.
Menetapkan Kebijakan Pemindaian
Kebijakan pemindaian mendefinisikan apa yang terjadi ketika kerentanan ditemukan. Anda menentukan ambang batasnya. Untuk aplikasi yang menghadap publik, Anda mungkin memblokir pipeline pada setiap temuan kritis atau tingkat keparahan tinggi. Untuk alat internal, Anda mungkin hanya memblokir masalah kritis dan mencatat masalah tingkat tinggi untuk sprint berikutnya.
Kuncinya adalah konsistensi. Jangan memutuskan per deployment. Tentukan kebijakan sekali, tuliskan ke dalam konfigurasi pipeline Anda, dan biarkan berjalan secara otomatis. Jika kebijakan memblokir deployment, itu adalah sinyal untuk memperbaiki image, bukan untuk mengesampingkan kebijakan.
Alat yang Dapat Anda Gunakan
Beberapa alat dapat memindai image container. Semuanya bekerja dengan cara yang sama: mereka memeriksa lapisan image, mengidentifikasi paket, dan mencocokkannya dengan database CVE.
- Trivy - Open source, cepat, banyak digunakan. Bekerja dengan baik di pipeline CI.
- Snyk - Komersial dengan tingkat gratis. Terintegrasi dengan banyak registry dan sistem CI.
- Grype - Open source dari Anchore. Sering dipasangkan dengan Syft untuk pembuatan SBOM.
- Clair - Open source, awalnya dari CoreOS. Digunakan oleh banyak layanan registry.
- Pemindai bawaan registry - Docker Hub, Amazon ECR, dan Google Artifact Registry menawarkan pemindaian otomatis untuk image yang disimpan di registry mereka.
Pilih salah satu yang sesuai dengan alur kerja Anda. Sebagian besar dapat dijalankan sebagai satu perintah di pipeline Anda.
Apa yang Harus Dilakukan Ketika Pemindaian Gagal
Ketika pipeline berhenti karena kerentanan, jangan abaikan. Perbaikannya biasanya termasuk dalam salah satu kategori berikut:
Perbarui base image. Ini adalah perbaikan yang paling umum. Base image seperti Alpine, Ubuntu, atau image distroless merilis versi yang diperbarui secara teratur. Beralihlah ke versi terbaru yang telah diperbaiki dan bangun ulang.
Perbarui dependensi aplikasi. Jika kerentanan ada di library yang digunakan kode Anda, perbarui dependensi di kode sumber Anda dan bangun ulang image.
Hapus alat yang tidak digunakan. Terkadang kerentanan berasal dari alat yang tertinggal di dalam image secara tidak sengaja: debugger, compiler, package manager. Ini tidak diperlukan saat runtime. Multi-stage build memecahkan masalah ini dengan hanya menyimpan artefak runtime akhir di image produksi.
Setelah memperbaiki, bangun ulang image dan jalankan pemindaian lagi. Ulangi sampai image lulus.
Apa yang Bukan Pemindaian Kerentanan
Pemindaian bukanlah pengganti praktik keamanan lainnya. Ini tidak mencakup penetration testing, kontrol akses, keamanan jaringan, atau pemantauan runtime. Tapi ini adalah lapisan pertahanan yang murah dan efektif yang berjalan secara otomatis. Tanpa itu, kerentanan kritis dapat mencapai produksi tanpa ada yang menyadarinya.
Daftar Periksa Praktis
- Tambahkan langkah pemindaian kerentanan setelah build image di pipeline CI Anda
- Tentukan kebijakan pemindaian dengan ambang batas yang jelas (misalnya, blokir pada kritis dan tinggi)
- Konfigurasikan pipeline untuk berhenti pada pelanggaran kebijakan
- Gunakan multi-stage build untuk mengurangi permukaan serangan image Anda
- Jadwalkan pembaruan rutin untuk base image dan dependensi Anda
- Tinjau laporan pemindaian secara berkala, bahkan untuk build yang lulus
Intisari
Image container yang belum dipindai adalah risiko yang tidak diketahui. Tambahkan pemindaian kerentanan ke pipeline Anda hari ini. Pilih alat, tetapkan kebijakan, dan biarkan otomatisasi menangkap masalah sebelum mencapai produksi. Hanya perlu beberapa menit untuk menyiapkannya dan menyelamatkan Anda dari menemukan CVE kritis setelah penyerang menemukannya.