Hardening Next.js + Docker agar Aman dari Paket NPM Berbahaya
Belakangan ini dunia pengembangan perangkat lunak digemparkan oleh temuan paket NPM dan Go berbahaya yang bisa menghapus data developer atau bahkan menjalankan kode jahat dari jarak jauh. Informasi lengkapnya bisa dibaca di 👉 Prosperita News.
Bagi developer yang membangun aplikasi dengan Next.js dan menjalankannya di Docker, kabar ini jadi peringatan penting. Kita harus menerapkan langkah-langkah hardening agar paket berbahaya tidak merusak data ataupun host server kita.
⚠️ Ancaman Paket NPM & Go Berbahaya
Pada Ekosistem NPM
- Dua paket berbahaya (
naya-floredannvlore-hsc) menyamar sebagai library WhatsApp Business API. - Sudah diunduh >1.100 kali.
- Kode berbahaya di dalamnya bisa mengeksekusi:
- Kill switch (skip target tertentu).
- Perintah
rm -rf *yang menghapus semua file di direktori project.
Pada Ekosistem Go
- 11 paket berbahaya ditemukan dengan teknik typosquatting (nama mirip dengan paket asli).
- Berisi kode untuk:
- Membuka shell tersembunyi.
- Mengunduh payload dari domain mencurigakan.
- Menjalankan payload langsung di memori (in-memory execution).
🛡️ Solusi: Hardening Next.js dengan Docker
Berikut adalah konfigurasi Dockerfile dan docker-compose.yml final yang saya pakai untuk melindungi project Next.js agar aman dari serangan ini.
1. Dockerfile Multi-Stage Build
# ===========================
# Stage 1: Builder
# ===========================
FROM node:20-alpine AS builder
WORKDIR /app
# Pakai pnpm di builder
RUN npm install -g pnpm
# Copy manifest & lockfile lebih dulu biar cache kepake
COPY package.json pnpm-lock.yaml ./
# Install deps di dalam container (aman dari host)
# Pakai --no-frozen-lockfile biar tetep jalan saat lockfile out-of-sync
RUN pnpm install --no-frozen-lockfile
# Copy source
COPY . .
# Build Next.js
RUN pnpm build
# ===========================
# Stage 2: Runtime
# ===========================
FROM node:20-alpine AS runtime
WORKDIR /app
# Buat user non-root (security)
RUN addgroup -S app && adduser -S app -G app
# Copy hanya yang diperlukan untuk runtime
COPY --from=builder /app/package.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
# Environment prod
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
PORT=3000
# Pakai user non-root
USER app
EXPOSE 3000
# Jalankan via npm (tidak perlu pnpm di runtime)
CMD ["npm", "run", "start"]
✅ Keuntungannya: hanya hasil build yang ikut ke runtime, dependency dev tidak terbawa.
2. docker-compose.yml dengan Hardening
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: infradev-app
restart: always
expose:
- "3000"
environment:
- NODE_ENV=production
- NEXT_TELEMETRY_DISABLED=1
- PORT=3000
# Security hardening
read_only: true
tmpfs:
- /app/.next/cache
- /tmp
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
user: "1000:1000"
# Batas resource
deploy:
resources:
limits:
cpus: "2.0"
memory: 4024M
caddy:
image: caddy:alpine
container_name: infradev-caddy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config
depends_on:
- app
audit:
build:
context: .
dockerfile: Dockerfile
target: builder # pakai stage builder (ada pnpm & dev deps)
command: ["pnpm", "audit"]
volumes:
caddy_data:
caddy_config:
🔑 Kenapa Konfigurasi Ini Aman
- Multi-stage build → runtime lebih kecil & aman.
- Non-root user → proses Node.js tidak jalan sebagai root.
- Filesystem read-only +
tmpfs→ malwarerm -rfhanya bisa hapus cache, bukan data penting. - Drop capabilities & no-new-privileges → mencegah privilege escalation.
- Audit service → jalankan
docker compose run --rm audituntuk cek dependency secara rutin. - Caddy reverse proxy → lapisan ekstra dengan auto HTTPS.
📊 Hasil audit terakhir:
root@server:/project# docker compose run --rm audit
No known vulnerabilities found

✅ Artinya semua dependency saat ini aman.
🎯 Best Practice
- Selalu commit
pnpm-lock.yaml. - Cek nama paket sebelum install (hindari typosquatting).
- Jalankan audit secara berkala.
- Update image base (
node:20-alpine&caddy:alpine).
🚀 Kesimpulan
👉 Hasilnya, hacker tidak bisa melihat atau mengambil data penting dari host lewat container ini. Kalaupun ada paket jahat, dampaknya hanya terbatas di dalam container.
Ancaman paket berbahaya di ekosistem NPM & Go nyata dan sudah menargetkan developer. Dengan konfigurasi Docker + Next.js yang di-hardening, risiko bisa diminimalkan:
- Dependency terisolasi di container 🧱
- Non-root + read-only filesystem 🛡️
- Audit otomatis untuk keamanan 📊
Hasilnya, projek lebih aman dari kehilangan data maupun eksploitasi.
👉 Sumber berita: Prosperita News
Dalam dunia Cloud Computing dan DevOps, tiga istilah yang paling sering kita dengar adalah Virtual Machine (VM), Container, dan Pod….
Artikel ini akan membahas langkah end-to-end untuk membangun aplikasi Go REST API, membuat image Docker, lalu melakukan deployment di Kubernetes…