Docker Security: 8 Quy tắc vàng bảo vệ Container trong Production
Trong quá trình phát triển ứng dụng, Docker giúp đơn giản hóa việc đóng gói và triển khai. Tuy nhiên, nếu đưa Docker Container lên môi trường Production mà thiếu đi các cấu hình bảo mật, hệ thống của bạn có thể trở thành mục tiêu tấn công dễ dàng.
Trong bài viết này, chúng ta sẽ tìm hiểu 8 quy tắc quan trọng giúp tăng cường bảo mật cho Docker Container và bảo vệ dữ liệu trên môi trường Production.
1. Không chạy Container bằng quyền Root
Mặc định, Docker sẽ chạy container dưới quyền root nếu bạn không khai báo user cụ thể. Nếu hacker chiếm được quyền kiểm soát ứng dụng bên trong container, họ có thể khai thác lỗ hổng để chiếm quyền root của máy chủ (Host).
Cách khắc phục trong Dockerfile:
FROM node:24-alpine WORKDIR /app COPY . . RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser CMD ["node", "server.js"]
Việc giới hạn quyền hạn giúp giảm thiểu rủi ro khi container bị tấn công.
2. Quét lỗ hổng bảo mật Image
Các Base Image trên Docker Hub có thể chứa các package cũ mang lỗ hổng bảo mật (CVE) đã được công bố.
Để khắc phục, bạn nên quét Image trước khi push lên Registry:
trivy image my-app:latest
Ngoài Trivy, bạn cũng có thể sử dụng các công cụ khác như Grype hoặc Docker Scout để chủ động phát hiện lỗ hổng.
3. Chỉ sử dụng Trusted Base Image
Việc tải và sử dụng các Base Image không rõ nguồn gốc trên Docker Hub tiềm ẩn nguy cơ chứa mã độc hoặc bị chèn sẵn backdoor.
Giải pháp:
- Chỉ chọn các Official Image hoặc nhà cung cấp đã được xác thực (Verified Publisher).
- Ưu tiên các Image tối giản như alpine, distroless hoặc các phiên bản slim để giảm bề mặt ứng dụng bị tấn công (attack surface).
4. Quản lý Secret an toàn
Tuyệt đối không hardcode thông tin nhạy cảm như Database Password, API Key vào Dockerfile hoặc file .env rồi push lên Git repository.
Thay vì sử dụng lệnh ENV để lưu thông tin nhạy cảm trong Image, bạn nên áp dụng các giải pháp quản lý Secret chuyên dụng:
- Sử dụng Docker Secrets hoặc Kubernetes Secrets.
- Sử dụng công cụ quản lý tập trung như HashiCorp Vault hoặc AWS Secrets Manager.
5. Giới hạn tài nguyên hệ thống (Resource Limits)
Một container bị lỗi vô hạn lặp hoặc bị tấn công DDoS có thể chiếm dụng toàn bộ CPU và RAM của máy chủ, làm sập các dịch vụ khác xung quanh.
Bạn có thể giới hạn tài nguyên khi chạy lệnh docker run:
docker run -d --memory="512m" --cpus="1.5" my-app:latest
Hoặc cấu hình trực tiếp trong file docker-compose.yml:
services: web: image: my-app:latest deploy: resources: limits: cpus: '1.5' memory: 512M
6. Đặt hệ thống file ở chế độ Read-Only
Hầu hết các container ứng dụng không cần ghi dữ liệu trực tiếp vào hệ thống file nội bộ ngoại trừ các thư mục lưu file tạm hoặc log.
Khởi chạy container ở chế độ chỉ đọc giúp chặn kẻ tấn công ghi đè mã độc vào hệ thống file:
docker run -d --read-only --tmpfs /tmp my-app:latest
Lệnh trên giúp container chạy ở chế độ Read-Only nhưng vẫn cho phép ghi dữ liệu tạm vào thư mục /tmp trong bộ nhớ RAM.
7. Cấu hình Docker Daemon an toàn
Docker Daemon giao tiếp qua Unix socket /var/run/docker.sock. Nếu socket này bị gắn (mount) vào bên trong một container không an toàn, hacker có thể chiếm quyền kiểm soát toàn bộ máy chủ.
Lưu ý quan trọng:
- Không mount file /var/run/docker.sock vào trong các container không thực sự cần thiết.
- Nếu quản lý Docker từ xa qua mạng, luôn bật xác thực chứng chỉ TLS (Docker HTTPS socket).
8. Thường xuyên cập nhật Docker và Base Image
Các lỗ hổng mới liên tục được phát hiện mỗi ngày. Giữ cho Docker Engine và các Base Image luôn ở phiên bản mới nhất là phương pháp phòng thủ hiệu quả nhất.
Bạn nên thiết lập pipeline CI/CD tự động rebuild Image định kỳ để liên tục cập nhật các bản vá bảo mật mới nhất từ nhà cung cấp.
9. Checklist bảo mật Docker Container
- Đã chuyển sang dùng Non-root user (USER appuser).
- Đã quét lỗ hổng bằng Trivy hoặc Docker Scout.
- Đã loại bỏ hoàn toàn Secret và API Key khỏi Dockerfile.
- Đã cấu hình giới hạn CPU và Memory.
- Đã bật chế độ Read-Only File System cho container.
- Không chia sẻ Docker Socket (/var/run/docker.sock).
- Cập nhật Base Image định kỳ.
Kết luận
Bảo mật Docker là một quy trình liên tục đòi hỏi sự chú ý từ khâu viết Dockerfile cho đến khi vận hành trên môi trường Production.
Việc áp dụng tốt các quy tắc như chạy bằng user thường, giới hạn tài nguyên, quản lý secret an toàn và quét lỗ hổng định kỳ sẽ giúp hệ thống của bạn vận hành ổn định, an toàn và hạn chế tối đa nguy cơ bị rò rỉ dữ liệu.