Cơn ác mộng lúc 2 giờ sáng: Khi Security Audit gõ cửa
2 giờ sáng, email từ đội Security báo gấp: “Image production dính hơn 50 lỗ hổng bảo mật nghiêm trọng (CVE), yêu cầu vá ngay.” Cơn buồn ngủ tan biến, thay vào đó là cảm giác hoang mang vì hệ thống đang chạy ổn định bỗng thành mục tiêu tấn công.
Lúc đó mình mới ngộ ra: build và push là chưa đủ. Mải mê code tính năng khiến chúng ta quên rằng các base image như node:latest thường kéo theo hàng tá thư viện lỗi thời. Bạn sẽ thấy cực kỳ bất lực khi không biết lỗ hổng nằm ở layer nào: do code mình viết, hay do cái base image từ 2 năm trước?
Khi nhận báo cáo quét dạng JSON hàng ngàn dòng, mình thường dùng JSON Formatter của Toolcraft để định dạng lại. Nhìn vào cấu trúc phân tầng (layers) rõ ràng, bạn sẽ tìm ra nguồn gốc lỗi thay vì ngồi đoán mò giữa đống text hỗn độn.
Tại sao Image của bạn lại “lắm bệnh” đến thế?
Lỗ hổng (CVE – Common Vulnerabilities and Exposures) thường không đến từ logic code của bạn. Thực tế, chúng ẩn náu ở ba nơi:
- Base Image lỗi thời: Một bản
ubuntu:20.04không cập nhật có thể chứa hàng trăm lỗi bảo mật đã được công bố. - Dependencies (Thư viện phụ thuộc): Các gói npm, pip hay thư viện hệ thống cài qua
apt-getthường là “cửa ngõ” cho hacker. - Thừa thãi công cụ: Cài sẵn
curl,githayvimvào image production giúp bạn debug sướng tay, nhưng cũng vô tình tặng hacker bộ công cụ để phá hoại hệ thống.
Docker Scout – Giải pháp cứu cánh tích hợp sẵn
Trước đây mình hay dùng Snyk hoặc Trivy, nhưng Docker Scout mang lại trải nghiệm mượt mà hơn vì nằm ngay trong Docker Desktop và CLI. Nó không chỉ liệt kê lỗi thô cứng. Scout đóng vai trò như một chuyên gia tư vấn: “Này, hãy đổi sang tag 20-alpine đi, bạn sẽ sạch bóng 90% lỗi đấy”.
Bước 1: Kiểm tra nhanh “sức khỏe” Image
Giả sử bạn có image my-app:v1. Thay vì đẩy lên cloud rồi chờ đợi, hãy gõ lệnh này ngay tại local:
docker scout quickview my-app:v1
Kết quả trả về một bảng tóm tắt: Critical, High, Medium. Nếu cột Critical (Nghiêm trọng) nhảy số, đó là tín hiệu báo động đỏ cho hệ thống của bạn.
Bước 2: Soi chi tiết từng mã CVE
Để biết chính xác lỗi đó là gì (ví dụ: lỗ hổng thực thi mã từ xa trong thư viện OpenSSL), hãy dùng lệnh:
docker scout cves my-app:v1
Lệnh này liệt kê chi tiết từng package bị ảnh hưởng và phiên bản đã vá lỗi. Nếu danh sách quá dài, hãy xuất ra file JSON rồi ném lên Toolcraft để lọc theo mức độ ưu tiên cho nhanh.
Bước 3: Vá lỗi theo gợi ý (Tính năng đáng tiền nhất)
Đừng tốn thời gian lùng sục Docker Hub để tìm bản tag an toàn. Docker Scout có lệnh recommendations cực kỳ thông minh:
docker scout recommendations my-app:v1
Nó sẽ chỉ đích danh: cập nhật base image lên bản vá nhỏ (Minor update) hoặc chuyển hẳn sang bản phân phối tối giản như Alpine để giảm thiểu rủi ro.
Chặn đứng Image “bẩn” bằng GitHub Actions
Sửa lỗi ở local là tốt, nhưng để đảm bảo không ai “lén” đẩy image đầy lỗ hổng lên server, bạn phải chặn nó từ cửa ngõ CI/CD. Dưới đây là cách mình cấu hình để tự động quét mỗi khi có Pull Request.
name: Docker Scout Scan
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build-and-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Build Docker image
run: docker build -t my-app:${{ github.sha }} .
- name: Docker Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker Scout Scan
uses: docker/scout-action@v1
with:
command: cves
image: my-app:${{ github.sha }}
ignore-unchanged: true
only-fixed: true
write-comment: true
github-token: ${{ secrets.GITHUB_TOKEN }}
Với workflow này, Docker Scout sẽ tự động comment báo cáo vào Pull Request. Nếu chỉ số bảo mật không đạt yêu cầu, pipeline sẽ fail ngay lập tức, ngăn chặn triệt để việc deploy image lỗi lên production.
Quy trình chuẩn để giữ Image luôn sạch
Sau nhiều đêm thức trắng fix lỗi, mình rút ra 4 nguyên tắc vàng khi làm việc với Docker Scout:
- Dùng Multi-stage build: Chỉ giữ lại file thực thi ở stage cuối. Loại bỏ hoàn toàn compiler và source code để thu hẹp diện tấn công.
- Ưu tiên Base Image tối giản: Luôn chọn các bản
-slimhoặc-alpine. Image càng nhẹ, càng ít file, lỗ hổng càng ít. - Quét định kỳ: Lỗ hổng mới xuất hiện mỗi ngày. Image hôm nay sạch không có nghĩa là tuần sau vẫn an toàn. Hãy đặt lịch quét hàng tuần cho các image đang chạy.
- So sánh trước khi nâng cấp: Dùng lệnh
docker scout compaređể đối chiếu version mới và cũ, đảm bảo việc update không rước thêm lỗi mới.
Bảo mật không phải là việc làm một lần rồi thôi. Hãy biến docker scout quickview thành thói quen hằng ngày. Đừng đợi đến khi bị tấn công mới cuống cuồng đi vá, hãy chủ động bảo vệ thành quả của mình ngay từ bây giờ.

