Danh sách bài viết trong series Sử dụng Docker từ cơ bản đến nâng cao
- Bài 1. Cơ Bản Docker: Hiểu Container và Vai Trò trong DevOps
- Bài 2. Docker Image: cách xây Dựng và tối Ưu
- Bài 3. Docker Networking: Kết Nối Container Hiệu Quả
- Bài 4. Docker Volume: Quản Lý Dữ Liệu Hiệu Quả cho Container
- Bài 5. Docker Compose: Điều Phối Multi-Container Hiệu Quả
- Bài 6. Docker Swarm: Orchestration Cơ Bản để Scale Container
- Bài 7. Docker Security: Bảo Mật Container Hiệu Quả
- Bài 8. Docker CI/CD: Tích Hợp Container vào Pipeline DevOps
- Bài 9. Docker Monitoring: Theo Dõi và Logging Container Hiệu Quả
- Bài 10. Docker resources: Tối Ưu và Debug Container Hiệu Quả
- Bài 11. Docker và Microservices: Thiết Kế Ứng Dụng Phân Tán
- Bài 12. Docker Registry: Tự Host và Quản Lý Image Hiệu Quả
- Bài 13. Docker với Cloud: Tích Hợp Container trên AWS ECS và GCP Cloud Run
Container nhanh và tiện, nhưng nếu không bảo mật đúng cách, chúng có thể trở thành lỗ hổng lớn trong hệ thống DevOps của bạn. Một image nhiễm mã độc hay container chạy quyền root có thể phá hủy cả pipeline CI/CD. Trong bài thứ bảy của series, tôi sẽ dẫn bạn qua Docker Security trong DevOps, từ bảo mật container với user namespace, image scanning, đến thực hành cụ thể để giữ hệ thống an toàn. Đây là những điều tôi học được từ thực tế, không chỉ là lý thuyết suông!
Tại Sao Docker Security Quan Trọng?
Rủi Ro trong DevOps
Container nhẹ và linh hoạt, nhưng cũng dễ bị tấn công:
- Image không an toàn: Pull từ nguồn lạ chứa malware.
- Quyền root: Container chạy root có thể phá host.
- Pipeline lộ lọt: Secret trong Dockerfile bị leak.
Ví dụ thực tế: Một team DevOps từng để image public chứa API key, bị hacker khai thác trong 24 giờ, gây downtime nghiêm trọng.
Mục Tiêu Bảo Mật
- Cô lập container khỏi host.
- Đảm bảo image sạch.
- Bảo vệ dữ liệu nhạy cảm trong CI/CD.
DevOps: Bảo mật không chỉ là optional – nó là bắt buộc để giữ pipeline và production ổn định.
Cơ Chế Bảo Mật Docker
User Namespace: Cô Lập Quyền
- User namespace: Ánh xạ user trong container thành user không đặc quyền trên host.
- Mặc định: Root trong container là root trên host (nguy hiểm).
- Bật user namespace:
- Chỉnh
/etc/docker/daemon.json
:{ "userns-remap": "default" }
- Restart Docker:
sudo systemctl restart docker
- Chỉnh
Kết quả: Root trong container thành UID 100000+ trên host, không phá được hệ thống.
DevOps: Dùng user namespace để chạy container test mà không lo ảnh hưởng server.
Seccomp và AppArmor
- Seccomp: Giới hạn system call container có thể gọi.
- Ví dụ: Chặn
fork
để ngăn spawn process lạ.
- Ví dụ: Chặn
- AppArmor: Profile giới hạn quyền truy cập file.
- Mặc định Docker có profile
docker-default
.
- Mặc định Docker có profile
Thực tế: Tôi từng thấy container bị khai thác qua system call lạ – Seccomp đã cứu ngày hôm đó.
Image Scanning: Kiểm Tra Lỗ Hổng
- Tool: Trivy, Docker Scan (tích hợp Docker Desktop).
- Ví dụ với Trivy:
trivy image nginx:latest
- Báo cáo CVE (lỗ hổng) trong image.
DevOps: Scan image trước khi push lên registry để tránh rủi ro.
Thực Hành: Bảo Mật Container
Chạy Container Không Root
- Dockerfile:
FROM nginx:latest RUN useradd -m myuser USER myuser
- Build và chạy:
docker build -t secure-nginx . docker run -d -p 8080:80 secure-nginx
- Kiểm tra:
docker exec -it <container-id> whoami
- Kết quả:
myuser
, không phải root.
- Kết quả:
Scan Image với Trivy
- Cài Trivy:
sudo apt install trivy
- Scan:
trivy image python:3.9
- Xem lỗ hổng, cập nhật image nếu cần.
Bảo Mật Secret
- Không để secret trong Dockerfile:
# Sai ENV API_KEY=abc123
- Dùng biến môi trường hoặc secret:
docker run -e API_KEY=abc123 my-app
DevOps: Secret trong CI/CD nên dùng biến môi trường từ GitLab/Jenkins, không hardcode.
Ứng Dụng trong DevOps
Pipeline CI/CD An Toàn
- Scan trong CI:
scan: image: aquasec/trivy script: - trivy image --exit-code 1 my-app:$CI_COMMIT_SHA
- Kết quả: Job fail nếu image có lỗ hổng nghiêm trọng.
Microservices Bảo Mật
- Chạy mỗi service với user riêng, network cô lập (overlay từ bài 6).
- Ví dụ: Một team dùng user namespace cho API container, ngăn attacker thoát ra host khi bị xâm nhập.
Case study: Một hệ thống DevOps phát hiện image cũ chứa CVE qua Trivy, cập nhật kịp thời trước khi attacker khai thác – tránh được downtime 12 giờ.
Best Practice
- Dùng image chính thức (VD:
nginx:alpine
thay vì nguồn lạ). - Giới hạn resource:
docker run --memory="512m" --cpus="0.5" my-app
- Backup volume định kỳ (bài 4).
Kết Luận
Docker Security trong DevOps không phải là thứ bạn có thể bỏ qua. Từ user namespace để cô lập quyền, image scanning để phát hiện lỗ hổng, đến cách bảo vệ secret, bạn đã có công cụ để giữ container an toàn. Thực hành với Nginx và Trivy cho thấy bảo mật không khó – chỉ cần làm đúng. Bài tiếp theo, chúng ta sẽ khám phá Docker trong CI/CD – cách tích hợp container vào pipeline thực tế.