Keamanan Docker: Best Practice untuk Menjalankan Container Secara Aman

Docker memudahkan deployment aplikasi, tetapi jika tidak diatur dengan benar, container dapat menjadi celah keamanan serius. Artikel ini akan membahas best practice keamanan Docker, agar aplikasi kamu tetap aman saat berjalan di lingkungan container.
1. Jalankan Container dengan User Non-Root
Secara default, container berjalan dengan user root, yang berisiko jika ada celah pada aplikasi.
Cara aman:
- Tambahkan user non-root pada Dockerfile:
RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser
- Gunakan image base yang mendukung user non-root.
2. Gunakan Base Image Resmi dan Minimal
Gunakan base image resmi dari Docker Hub atau registry tepercaya untuk menghindari image yang sudah disusupi malware. Pilih image minimal seperti:
alpine
distroless
Semakin kecil image, semakin kecil juga attack surface yang dapat dieksploitasi.
3. Update Image Secara Berkala
Image yang lama bisa mengandung kerentanan. Lakukan:
docker pull <image>
untuk memperbarui image ke versi terbaru.- Gunakan tag versi tertentu (
python:3.12.3
) agar terkontrol.
4. Gunakan Kontrol Resource
Batasi penggunaan resource container untuk mencegah container mengambil semua resource host:
docker run -m 512m --cpus="1.0" myapp
-m 512m
membatasi memory.--cpus="1.0"
membatasi CPU.
5. Gunakan Docker Content Trust (DCT)
Docker Content Trust memastikan image yang kamu tarik atau jalankan adalah image yang sudah diverifikasi.
export DOCKER_CONTENT_TRUST=1
6. Scan Image Sebelum Digunakan
Gunakan tool untuk memindai kerentanan pada image:
docker scan <image>
- Tools seperti Trivy, Clair, atau Anchore untuk pipeline CI/CD.
7. Gunakan Read-Only Filesystem
Jalankan container dengan sistem file read-only untuk mencegah modifikasi file jika container diretas:
docker run --read-only myapp
Jika aplikasi memerlukan folder writable, gunakan volume:
docker run --read-only -v /data myapp
8. Minimalkan Port yang Diekspos
Hanya expose port yang diperlukan:
EXPOSE 80
Dan saat run:
docker run -p 80:80 myapp
Hindari --network=host
kecuali benar-benar diperlukan.
9. Gunakan Namespace dan Capabilities
Kurangi hak istimewa container:
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myapp
Ini akan menghapus semua capabilities kecuali yang diperlukan (NET_BIND_SERVICE
untuk binding port <1024).
10. Jangan Simpan Credential di Dockerfile
Hindari hardcode credential (API key, database password) di Dockerfile atau image. Gunakan:
- Environment variable saat
docker run
. - Docker secrets saat menggunakan Swarm/Kubernetes.
11. Update Docker Engine Secara Berkala
Versi Docker Engine yang lama bisa mengandung kerentanan kernel atau container runtime. Selalu update:
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io