Kenapa Docker Security Itu Penting?
Banyak developer berpikir bahwa kalau sudah pakai Docker, masalah keamanan akan otomatis selesai. Tapi kenyataannya, container yang tidak diamankan dengan baik bisa jadi pintu masuk bagi attacker. Bayangkan lo punya rumah dengan pintu terkunci, tapi semua jendela terbuka. Begitulah Docker tanpa security measures.
Di artikel ini, kita akan bahas cara mengamank Docker untuk production — dari image scanning sampai runtime protection.
1. Gunakan Base Image yang Aman
Ini terdengar sepele, tapi banyak yang masih pakai latest tag untuk base image. Bad idea. Base image yang tidak di-maintain punya vulnerability yang sudah diketahui.
Solusinya:
- Gunakan tag spesifik, contoh:
node:20-alpinebukannode:latest - Lebih baik lagi, gunakan
distrolessimage dari Google yang benar-benar minimal - Scan image secara berkala dengan Trivy atau Clair
# Contoh Dockerfile yang lebih aman
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
2. Jangan Jalanin Container sebagai Root
Ini salah satu mistake yang paling sering terjadi. Defaultnya, Docker container jalan sebagai root. Kalau attacker berhasil masuk, mereka punya akses root di container.
# Bad
FROM node:20
COPY . .
CMD ["node", "server.js"]
# Good
FROM node:20
RUN addgroup -g 1001 appgroup && \
adduser -u 1001 -G appgroup -s /bin/sh -D appuser
COPY --chown=appuser:appgroup . .
USER appuser
CMD ["node", "server.js"]
3. Gunakan Secrets dengan Benar
Jangan pernah hardcode password atau API key di Dockerfile atau environment variable yang visible di container. Gunakan Docker secrets untuk production:
# docker-compose.yml
services:
app:
image: myapp:latest
secrets:
- db_password
- api_key
secrets:
db_password:
file: ./secrets/db_password.txt
api_key:
file: ./secrets/api_key.txt
Atau lebih baik lagi, gunakan external secrets manager seperti HashiCorp Vault atau AWS Secrets Manager.
4. Batasi Resources
Tanpa limit, container bisa consume semua resources dan membuat sistem unresponsive. Ini juga mencegah container runaway yang bisa di-exploit.
docker run -d \
--memory="512m" \
--cpus="1.0" \
--restart=on-failure:3 \
myapp:latest
Di docker-compose:
services:
app:
image: myapp:latest
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
reservations:
cpus: "0.5"
memory: 256M
5. Read-Only Root Filesystem
Dengan read-only root, container tidak bisa menulis ke filesystem kecuali yang di-allow. Ini mencegah banyak attack vectors.
docker run --read-only --tmpfs /tmp myapp:latest
Tapi ingat, aplikasi yang perlu write ke filesystem harus pakai volume untuk temporary files.
6. Network Segmentation
Gunakan Docker network untuk isolation. Jangan expose semua port ke internet.
services:
app:
image: myapp:latest
networks:
- frontend
- backend
db:
image: postgres:15
networks:
- backend
volumes:
- db-data:/var/lib/postgresql/data
networks:
frontend:
backend:
7. Regular Scanning dan Updates
Security bukan one-time setup. Lo perlu:
- Scan images secara mingguan dengan CI/CD integration
- Update base image secara regular
- Monitor CVE databases untuk know vulnerabilities
- Use automated tools seperti Snyk atau Anchore
# Contoh Trivy scan di CI/CD
trivy image --severity HIGH,CRITICAL myapp:latest
8. Logging dan Monitoring
Kamu perlu tau kalau ada yang salah. Setup logging yang proper:
docker run -d \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:latest
Gunakan juga tools seperti:
- Docker Bench for Security — auto-audit host configuration
- Falco — runtime security monitoring
- Prometheus + Grafana — metrics dan visualization
Kesimpulan
Docker security butuh pendekatan berlapis. Satu langkah saja tidak cukup. Kombinasikan base image yang aman, user isolation, secrets management, resource limits, network segmentation, dan monitoring yang proper.
Ingat: container yang tidak diamankan = house with all windows open. Dont make it easy for attackers.
Mulai dari langkah kecil dulu. Cek Dockerfile lo sekarang, apakah masih jalan sebagai root? Kalau iya, fix itu dulu.
