Bảo mật Chuỗi cung ứng Phần mềm: Hướng dẫn Thực tế về Syft và Grype

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Bối cảnh & Lý do: Chuyển dịch sang Bảo mật Ưu tiên SBOM

Quản lý các môi trường production trong suốt một thập kỷ đã dạy tôi một sự thật khắc nghiệt: bảo mật container không chỉ đơn thuần là về các bản vá hệ điều hành. Hầu hết các ứng dụng hiện đại được cấu thành từ khoảng 80% mã nguồn bên thứ ba. Những module Node, package Python và binary Go này thường ẩn sâu năm hoặc sáu lớp trong Docker image của bạn. Nếu bạn không thể xác định chính xác phiên bản của từng thư viện trong hệ thống (stack) của mình, bạn đang thực sự làm việc một cách mù quáng.

Ngành công nghiệp đang chuyển hướng sang Danh mục Thành phần Phần mềm (Software Bill of Materials – SBOM) như một tiêu chuẩn bắt buộc. Về cơ bản, nó giống như một danh sách thành phần chi tiết cho mã nguồn của bạn. Trong sáu tháng qua, tôi đã tích hợp Syft và Grype vào các pipeline triển khai của mình, và kết quả mang lại là tức thì. Chúng tôi đã ngừng đoán mò và bắt đầu xác minh. Thay vì hy vọng một base image là an toàn, giờ đây chúng tôi có một bản đồ có thể tìm kiếm được cho mọi thành phần phụ thuộc và các rủi ro liên quan của chúng.

Một mẹo bảo mật nhanh trước khi chúng ta bắt đầu: đừng bao giờ sử dụng mật khẩu yếu hoặc dùng lại mật khẩu cho các registry hoặc máy chủ của bạn. Tôi thường tạo các bí mật (secrets) của mình bằng công cụ tại toolcraft.app/vi/tools/security/password-generator. Nó chạy hoàn toàn trong trình duyệt của bạn, nghĩa là dữ liệu của bạn không bao giờ chạm tới mạng internet. Đó là một thói quen đơn giản giúp loại bỏ một trong những điểm yếu phổ biến nhất.

Cài đặt: Chuẩn bị Công cụ

Syft và Grype, cả hai đều được phát triển bởi Anchore, tuân theo triết lý Unix kinh điển: làm một việc và làm thật tốt. Syft đảm nhận việc kiểm kê (tạo SBOM), trong khi Grype đảm nhận việc quét lỗ hổng. Vì chúng được viết bằng Go, bạn có thể đưa chúng vào hầu hết mọi môi trường mà không cần lo lắng về các thành phần phụ thuộc phức tạp.

Cài đặt Syft

Đối với môi trường Linux, một đoạn script curl đơn giản là cách nhanh nhất để đưa Syft vào các CI/CD runner của bạn.

curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin

Trên macOS, hãy sử dụng Homebrew:

brew install syft

Cài đặt Grype

Grype sử dụng mô hình cài đặt tương tự. Lưu ý rằng Grype sẽ tải xuống một cơ sở dữ liệu lỗ hổng cục bộ trong lần chạy đầu tiên, cho phép nó thực hiện các lần quét sâu mà không làm rò rỉ dữ liệu SBOM của bạn tới máy chủ bên ngoài.

curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin

Xác nhận việc cài đặt bằng cách kiểm tra các phiên bản:

syft --version
grype --version

Cấu hình: Tạo và Định dạng SBOM

Hầu hết quy trình làm việc của bạn sẽ tập trung vào việc chọn định dạng đầu ra phù hợp. Syft không chỉ giới hạn ở các image; nó còn có thể phân tích cả các thư mục cục bộ và tệp lưu trữ. Tuy nhiên, việc quét một Docker image trước khi nó tới môi trường production vẫn là trường hợp sử dụng phổ biến nhất.

Tạo một SBOM Cơ bản

Trỏ Syft vào một image để xem nội dung bên trong. Đầu ra mặc định là một bảng sạch sẽ, dễ đọc cho con người.

syft python:3.9-slim

Tiêu chuẩn hóa với CycloneDX & SPDX

Tự động hóa đòi hỏi dữ liệu mà máy có thể đọc được. Tôi khuyên bạn nên sử dụng các tiêu chuẩn ngành như CycloneDX hoặc SPDX, chúng cho phép dữ liệu bảo mật của bạn có thể giao tiếp với các công cụ khác trong hệ sinh thái. Tôi thường chuyển hướng đầu ra (pipe) sang một tệp JSON trong giai đoạn build.

syft python:3.9-slim -o cyclonedx-json > sbom.json

Các ứng dụng cũ (legacy) cũng không phải là vấn đề. Nếu bạn chưa container hóa một dự án, hãy trỏ Syft vào mã nguồn. Nó sẽ tự động tìm và phân tích các tệp requirements.txt, package-lock.json, hoặc Cargo.lock:

syft dir:/path/to/your/project -o json > local-repo-sbom.json

Xác minh & Giám sát: Biến Dữ liệu thành Hành động

Một SBOM là một bản ghi tuyệt vời, nhưng tự nó không ngăn chặn được các hành vi khai thác. Đó là lúc Grype tỏa sáng. Nó lấy danh sách thành phần của bạn và đối chiếu với các cơ sở dữ liệu lỗ hổng lớn như NVD và GitHub Advisories.

Quét trực tiếp một Image

Nếu bạn đang vội, Grype có thể quét trực tiếp một image bằng cách tạo một SBOM tạm thời trong bộ nhớ.

grype python:3.9-slim

Quét tệp SBOM

Trong một pipeline trưởng thành, tôi thích quét tệp SBOM tĩnh mà chúng ta đã tạo trước đó. Điều này đảm bảo rằng báo cáo lỗ hổng khớp chính xác với danh mục đã được lưu trữ để tuân thủ quy trình.

grype sbom.json

Loại bỏ các Thông tin Nhiễu

Các image tiêu chuẩn có thể chứa nhiều thông tin nhiễu, đôi khi đưa ra hơn 100 cảnh báo mức độ thấp (low-severity). Để giúp đội ngũ tập trung vào những gì quan trọng, hãy lọc kết quả. Chúng tôi thiết lập các CI/CD pipeline để chỉ kích hoạt lỗi nếu xuất hiện các vấn đề ‘High’ (Nghiêm trọng) hoặc ‘Critical’ (Chí mạng).

grype python:3.9-slim --fail-on high

Giám sát Liên tục trong Production

CVE (Các lỗ hổng phổ biến) không chờ đợi bất kỳ ai. Một image đã vượt qua tất cả các kiểm tra vào thứ Hai có thể trở nên dễ bị tấn công vào thứ Tư. Trong sáu tháng qua, chúng tôi đã lưu trữ SBOM cho mọi container đang chạy trong một kho lưu trữ tập trung. Sau đó, một công việc cron hàng đêm sẽ chạy Grype đối với các tệp JSON nhỏ này.

Đây là logic cho một vòng lặp giám sát đơn giản:

# Kiểm tra tất cả SBOM đã lưu để tìm các mối đe dọa chí mạng mới
for sbom in /var/lib/sboms/*.json; do
  echo "Đang phân tích $sbom..."
  grype "$sbom" --severity critical --output table
done

Hiệu suất là ưu điểm lớn nhất ở đây. Quét một tệp JSON dung lượng 200KB mất chưa đầy 500ms. Hãy so sánh điều đó với việc pull và quét lại một Docker image 2GB, việc này có thể mất vài phút và tiêu tốn đáng kể băng thông.

Lời kết

Bảo mật chuỗi cung ứng là một quá trình liên tục, không phải là một đầu việc chỉ cần đánh dấu xong là thôi. Bằng cách kết hợp Syft và Grype, bạn xây dựng một danh mục minh bạch cho phép bạn phản ứng với các mối đe dọa mới trong vài phút thay vì vài tuần. Hãy bắt đầu bằng việc tạo SBOM cho dịch vụ quan trọng nhất của bạn ngay hôm nay. Bạn có thể sẽ ngạc nhiên—và có lẽ hơi lo lắng—về những gì thực sự đang ẩn giấu bên trong các container của mình.

Share: