Cara Scan Image Docker dari Celah dengan Trivy
Panduan memakai Trivy untuk memindai image Docker dari celah keamanan, menyaring hasil berdasarkan tingkat bahaya, dan memasangnya di pipeline secara aman.
Jawaban singkat
Pasang Trivy dari repositori resmi, lalu jalankan trivy image nama-image untuk melihat daftar CVE di paket sistem dan pustaka aplikasi. Saring dengan --severity HIGH,CRITICAL dan --ignore-unfixed, lalu pakai --exit-code 1 agar pipeline gagal bila ada celah serius.
Daftar isi
- Apa saja yang diperiksa Trivy?
- Bagaimana cara memindai image Docker dengan Trivy?
- 1. Pasang Trivy dari repositori resmi
- 2. Jalankan pemindaian pertama
- 3. Saring hasil agar fokus
- 4. Tindak lanjuti temuan
- 5. Catat pengecualian dengan sengaja
- 6. Pasang di pipeline CI
- 7. Pindai juga file konfigurasi dan secret
- Opsi Trivy apa saja yang sering dipakai?
- Pertanyaan yang sering diajukan
Yakin image Docker yang kamu jalankan di server bebas celah? Image yang kamu bangun sendiri pun berisi ratusan paket dari sistem operasi dasar dan pustaka aplikasi, dan sebagian bisa punya CVE yang sudah diketahui publik. Trivy adalah pemindai open source dari Aqua Security yang mencocokkan isi image dengan database celah, lalu menampilkan paket mana yang rentan dan versi perbaikannya.
Trivy cukup dijalankan dengan satu perintah, tanpa server tambahan. Panduan ini memakai Ubuntu atau Debian dan mengikuti dokumentasi resmi per 11 November 2026.
Apa saja yang diperiksa Trivy?
Untuk image Docker, Trivy membaca daftar paket sistem operasi di dalam image dan file dependensi aplikasi seperti lockfile npm, file requirements Python, atau modul Go. Setiap versi paket lalu dicocokkan dengan database celah yang dikumpulkan dari berbagai sumber resmi, termasuk catatan keamanan distribusi Linux. Selain celah, Trivy juga bisa mencari secret yang tertinggal dan salah konfigurasi, yang dibahas di langkah terakhir.
Bagaimana cara memindai image Docker dengan Trivy?
1. Pasang Trivy dari repositori resmi
Perintah dari dokumentasi resmi untuk Debian dan Ubuntu:
sudo apt-get install wget gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
Cek hasilnya dengan trivy --version. Pastikan versinya bukan salah satu yang disebut di peringatan di atas.
Kalau tidak ingin memasang apa pun di server, Trivy juga tersedia sebagai image Docker. Pakai tag versi yang jelas, jangan latest. Dokumentasi resmi saat ini mencontohkan tag 0.76.2:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
-v $HOME/.cache/trivy:/root/.cache/ aquasec/trivy:0.76.2 image nginx:1.27
Ingat bahwa memberi container akses ke /var/run/docker.sock hampir setara memberi akses root ke host. Lakukan ini hanya dengan image Trivy resmi yang versinya sudah kamu periksa.
2. Jalankan pemindaian pertama
trivy image nginx:1.27
Pada pemindaian pertama, Trivy mengunduh database celah terlebih dulu, jadi butuh waktu lebih lama. Pemindaian berikutnya memakai cache dan jauh lebih cepat.
Hasilnya berupa tabel per target: paket sistem operasi (misalnya dari Debian atau Alpine) dan pustaka bahasa pemrograman (npm, pip, Go module, dan lain-lain). Setiap baris berisi nama pustaka, ID CVE, tingkat bahaya, versi terpasang, dan versi yang sudah diperbaiki.
3. Saring hasil agar fokus
Daftar lengkap bisa sangat panjang. Dua opsi berikut paling berguna:
trivy image --severity HIGH,CRITICAL --ignore-unfixed nginx:1.27
--severity HIGH,CRITICALhanya menampilkan celah tingkat tinggi dan kritis.--ignore-unfixedmenyembunyikan celah yang belum punya versi perbaikan, sehingga yang tampil adalah yang bisa langsung kamu tindak lanjuti.
Celah yang belum ada perbaikannya tetap perlu dipantau, tetapi untuk prioritas harian, fokus dulu pada yang bisa ditambal.
4. Tindak lanjuti temuan
Dari hasil pemindaian, biasanya ada tiga jalan:
- Perbarui image dasar. Banyak celah hilang hanya dengan menarik versi terbaru image dasar, misalnya tag patch terbaru dari distribusi yang sama, lalu membangun ulang image.
- Perbarui pustaka aplikasi di file seperti
package.jsonataurequirements.txt, lalu bangun ulang. - Kecilkan image. Image dasar yang lebih ramping (slim, Alpine, atau distroless) membawa lebih sedikit paket, sehingga lebih sedikit pula yang bisa rentan.
Setelah membangun ulang, jalankan pemindaian lagi untuk memastikan jumlah celah turun. Cara mengganti container dengan image baru tanpa kehilangan data ada di cara update container Docker tanpa kehilangan data.
5. Catat pengecualian dengan sengaja
Kadang sebuah CVE tidak relevan, misalnya ada di fitur yang tidak pernah dipakai aplikasimu. Catat ID-nya di file .trivyignore di folder proyek, satu ID per baris, dan tambahkan komentar alasan:
# Fitur ini tidak dipakai, ditinjau ulang bulan depan
CVE-2024-XXXXX
Ganti CVE-2024-XXXXX dengan ID sebenarnya dari hasil pemindaian. Tinjau file ini secara berkala supaya pengecualian tidak menumpuk tanpa alasan.
6. Pasang di pipeline CI
Supaya image rentan tidak sampai ke server, jalankan Trivy setiap kali image dibangun:
trivy image --exit-code 1 --severity CRITICAL --ignore-unfixed registry.example.com/aplikasi:1.4.2
Dengan --exit-code 1, Trivy mengembalikan kode gagal bila menemukan celah yang sesuai filter, sehingga pipeline berhenti. Mulai dari CRITICAL saja agar tim tidak kewalahan, lalu perketat ke HIGH setelah temuan lama dibereskan.
Kalau memakai GitHub Actions, sematkan action pihak ketiga ke commit SHA lengkap, bukan ke tag versi. Insiden Trivy menunjukkan bahwa tag bisa dipindahkan ke commit berbahaya, sedangkan SHA tidak. Pelajaran ini berlaku untuk semua dependensi, seperti dibahas di apa itu supply chain attack.
7. Pindai juga file konfigurasi dan secret
Trivy tidak hanya memindai image. Perintah berikut memindai folder proyek untuk dependensi rentan, secret yang tertinggal (misalnya API key), dan salah konfigurasi di Dockerfile:
trivy fs --scanners vuln,secret,misconfig .
Temuan salah konfigurasi sering menyentuh hal yang juga dibahas di kesalahan umum menjalankan Docker di produksi, seperti container yang berjalan sebagai root.
Opsi Trivy apa saja yang sering dipakai?
| Opsi | Fungsi |
|---|---|
trivy image <image> | Memindai image dari celah |
--severity HIGH,CRITICAL | Menampilkan tingkat bahaya tertentu saja |
--ignore-unfixed | Menyembunyikan celah tanpa versi perbaikan |
--exit-code 1 | Mengembalikan kode gagal bila ada temuan, untuk CI |
--format json -o hasil.json | Menyimpan hasil dalam format JSON |
trivy fs --scanners vuln,secret,misconfig . | Memindai folder proyek |
.trivyignore | Daftar CVE yang sengaja dikecualikan |
Pertanyaan yang sering diajukan
Apakah Trivy gratis?
Ya. Trivy adalah proyek open source dari Aqua Security dan bisa dipakai tanpa biaya lisensi.
Apakah hasil Trivy berarti servernya sudah dibobol?
Tidak. Trivy hanya menunjukkan paket yang punya celah diketahui. Apakah celah itu bisa dieksploitasi bergantung pada cara aplikasi dan container dijalankan.
Seberapa sering image perlu dipindai?
Setiap kali image dibangun, dan secara berkala untuk image yang sudah berjalan, karena CVE baru terus diterbitkan untuk paket yang sama.
Apakah Trivy bisa memindai image di registry privat?
Bisa, selama mesin yang menjalankan Trivy sudah login ke registry tersebut atau diberi kredensial lewat variabel lingkungan yang didukung.
Bagaimana memastikan Trivy yang terpasang bukan versi berbahaya?
Pasang dari repositori atau image resmi, pakai versi spesifik, dan bandingkan dengan daftar versi aman di advisory resmi. Image juga bisa diverifikasi lewat digest atau tanda tangan cosign.
Checklist sebelum memakai Trivy di produksi:
- Versi Trivy sudah dicek dan bukan versi yang terdampak insiden Maret 2026.
- Pemindaian dengan filter HIGH dan CRITICAL sudah dijalankan untuk semua image aktif.
- Pipeline memakai
--exit-code 1dan action disematkan ke commit SHA. - File
.trivyignoreberisi alasan untuk setiap pengecualian. - Jadwal pemindaian ulang image yang sudah berjalan sudah ditetapkan.


