Mặc định process trong container chạy bằng root (uid 0), và uid đó trùng với root của host — namespace chỉ tách tiến trình/mạng, không tách user (trừ khi bật user namespace remapping).
Nếu kẻ tấn công thoát được container hoặc bind mount trúng thư mục host, họ thao tác với quyền root trên host.
RUN groupadd -r app && useradd -r -g app app
WORKDIR /app
COPY --chown=app:app --from=build /app/dist ./dist
USER app
CMD ["node", "dist/server.js"]Lỗi permission sau khi đổi thường do:
- File copy vào image vẫn thuộc root → dùng COPY --chown.
- Volume mount vào thư mục uid khác → chown trong entrypoint trước khi hạ quyền, hoặc chỉ định uid khớp giữa host và container.
- App ghi vào /app hoặc /tmp không có quyền → tạo sẵn thư mục và chown ở stage build.
- Bind port < 1024 (vd 80) cần root → cho app nghe cổng 3000/8080 rồi map ra ngoài.
Bổ sung thêm --read-only, --cap-drop=ALL, --security-opt=no-new-privileges để siết bề mặt tấn công.