Docker Scout: ‘Kính lúp’ soi lỗi bảo mật và cách vá Image từ CLI đến CI/CD

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

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: buildpush 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.04 khô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-get thường là “cửa ngõ” cho hacker.
  • Thừa thãi công cụ: Cài sẵn curl, git hay vim và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:

  1. 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.
  2. Ưu tiên Base Image tối giản: Luôn chọn các bản -slim hoặc -alpine. Image càng nhẹ, càng ít file, lỗ hổng càng ít.
  3. 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.
  4. 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ờ.

Share: