Phần 3: Tích Hợp Bảo Mật Vào Vòng Đời DevOps
Bài 12: Quét Bảo Mật Container
Code an toàn, thư viện an toàn, app đang chạy an toàn... Nhưng lớp "áo giáp" Docker chứa chúng có an toàn không?
Ôn lại Bộ Ba (Bài 9, 10, 11)
Chúng ta đã có một hệ thống phòng thủ 3 lớp: SAST (code của ta), SCA (code thư viện), và DAST (app đang chạy). Nhưng tất cả chúng đều được đóng gói vào một "thứ" gọi là Docker Image để triển khai. Nếu chính cái "hộp" này có lỗ hổng thì sao?
Quét Bảo Mật Container là gì?
Container Security Scanning là quá trình phân tích một image (như Docker image) để tìm kiếm các lỗ hổng bảo mật (CVEs) và các cấu hình sai (misconfigurations).
Nó "nhìn" vào từng layer của image, kiểm tra hệ điều hành (OS) cơ bản, các gói phần mềm (packages) được cài đặt, và cả các file ứng dụng được sao chép vào, để so sánh với các cơ sở dữ liệu lỗ hổng đã biết.
Một Công Cụ Quét Container Tìm Kiếm Gì?
Lỗ hổng OS (CVEs)
Đây là mục tiêu chính. Nó quét các trình quản lý gói (apt, apk, yum) để tìm các thư viện hệ thống như `openssl`, `curl`, `glibc`... phiên bản cũ và có CVE.
Thành Phần Ứng Dụng (SCA)
Nhiều công cụ hiện đại (như Trivy) cũng làm luôn nhiệm vụ của SCA, quét các file `package.json`, `requirements.txt`... đã được `COPY` vào image.
Cấu Hình Sai & Bí Mật
Quét `Dockerfile` và image layers để tìm các cấu hình nguy hiểm như `USER root` (rất tệ!) hoặc các bí mật bị lộ như `ENV API_KEY=...`.
Tích Hợp Quét Container Vào CI/CD
1. Dockerfile
Developer định nghĩa môi trường ứng dụng trong một `Dockerfile`.
2. Build Image
Pipeline CI (Jenkins, GitLab) chạy `docker build` để tạo ra một image `my-app:latest`.
3. Quét (Scan)
Công cụ (ví dụ: `trivy image ...`) quét image vừa build, so sánh với CSDL lỗ hổng.
4. Chặn/Báo Cáo
Nếu phát hiện lỗ hổng CRITICAL, pipeline sẽ bị chặn (fail). Báo cáo được gửi cho dev.
Ví dụ: Tại Sao Phải Quét?
Hãy xem 2 Dockerfile, một "tệ" và một "tốt".
Dockerfile Tệ 👎
# Dùng image base cũ và đầy đủ không cần thiết
FROM ubuntu:18.04
# Cài đặt với quyền root (mặc định)
RUN apt-get update && apt-get install -y python3
COPY . /app
WORKDIR /app
CMD ["python3", "app.py"]
Hậu quả: Một công cụ quét sẽ phát hiện hàng trăm CVEs (Critical, High) trong các gói OS cũ của `ubuntu:18.04` mà bạn không hề dùng đến. Nó cũng sẽ cảnh báo bạn đang chạy với quyền `root`.
Dockerfile Tốt 👍
# Dùng image base tối giản (minimal) và mới nhất
FROM python:3.10-slim-bookworm
# Tạo một user không phải root
RUN useradd -m nonroot
COPY . /app
WORKDIR /app
# Đổi sang user không phải root
USER nonroot
CMD ["python3", "app.py"]
Kết quả: Số lượng CVEs giảm đáng kể (có thể về 0), và bạn đã tuân thủ Nguyên Tắc Đặc Quyền Tối Thiểu (Bài 7) bằng cách không chạy với quyền `root`.
Các Công Cụ Quét Container Phổ Biến
Trivy (của Aqua Security)
Là "ngôi sao" trong mảng này. Mã nguồn mở, cực kỳ nhanh, dễ sử dụng và rất toàn diện. Trivy có thể quét OS packages, application dependencies (SCA), và misconfigurations.
Điểm mạnh: Đa năng, nhanh, dễ tích hợp CI/CD, miễn phí.
Grype (của Anchore)
Một đối thủ cạnh tranh trực tiếp với Trivy. Cũng là mã nguồn mở, nhanh và chính xác. Grype tập trung mạnh vào việc quét lỗ hổng OS và app bên trong image.
Điểm mạnh: Rất chính xác, CSDL lỗ hổng tốt, miễn phí.
Chúng ta đã quét "bên trong" Image
Giờ đây, pipeline của chúng ta đã quét code (SAST), thư viện (SCA), ứng dụng (DAST), và image (Container Scan). Chúng ta đã rất an toàn!
Nhưng... còn một thứ nữa. Bạn có thấy `ENV API_KEY=...` ở trên không? Làm thế nào để quản lý các API key, password, certificate một cách an toàn?