Docker: Vá Các Lỗ Hổng Ảnh với Trivy và Copa
Các hình ảnh container Docker thường chứa các lỗ hổng bảo mật kế thừa từ các gói hệ điều hành cơ sở của chúng. Thay vì xây dựng lại hình ảnh từ đầu, bạn có thể sử dụng Trivy để quét lỗ hổng và Copa để vá chúng trực tiếp. Hướng dẫn này trình bày cách xác định và khắc phục các lỗ hổng của container trên các hệ thống Ubuntu, Debian, RHEL, CentOS và Fedora bằng cách sử dụng hai công cụ mã nguồn mở mạnh mẽ này.
Trong hướng dẫn này bạn sẽ học:
- Cách cài đặt trình quét lỗ hổng Trivy trên Ubuntu/Debian
- Cách cài đặt công cụ vá container Copa
- Cách quét các hình ảnh Docker để tìm lỗ hổng hệ điều hành
- Cách tự động vá các lỗ hổng trong container
- Cách xác minh các hình ảnh đã vá không còn lỗ hổng
Tóm tắt bài viết: Quét các hình ảnh Docker để tìm lỗ hổng với Trivy và tự động vá chúng bằng Copa.
| Bước | Lệnh/Hành động |
|---|---|
| 1. Quét hình ảnh | |
| 2. Xuất báo cáo JSON | |
| 3. Bắt đầu BuildKit | |
| 4. Hình ảnh bản vá | |
Bước 1: Cài đặt Trình quét lỗ hổng Trivy
Trivy là một công cụ quét lỗ hổng mã nguồn mở được phát triển bởi Aqua Security. Nó phát hiện các lỗ hổng trong gói hệ điều hành, các phụ thuộc ứng dụng và hình ảnh container.
Ubuntu/Debian
-
Cài đặt các phụ thuộc: Đầu tiên, cài đặt các gói wget và gnupg cần thiết để thêm kho lưu trữ:
$ sudo apt-get install wget gnupg -y Thêm khóa GPG của Trivy: Tải xuống và thêm khóa ký của kho lưu trữ Trivy:
$ wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/nullThêm kho lưu trữ Trivy: Thêm kho lưu trữ chính thức của Trivy vào danh sách nguồn của bạn:
$ echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.listCài đặt Trivy: Cập nhật danh sách gói và cài đặt Trivy:
$ sudo apt-get update $ sudo apt-get install trivy -y
RHEL/CentOS/Fedora
Thêm kho Trivy: Tạo tệp kho Trivy:
# sudo tee /etc/yum.repos.d/trivy.repo << 'EOF' [trivy] name=Trivy repository baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://aquasecurity.github.io/trivy-repo/rpm/public.key EOFCài đặt Trivy: Sử dụng dnf hoặc yum để cài đặt:
# sudo dnf install trivy -y
Kiểm tra cài đặt bằng cách xem phiên bản:
$ trivy --versionBước 2: Cài đặt Công cụ Vá Lỗi Copa
Copa (Copacetic) là một dự án sandbox của CNCF cho phép vá các hình ảnh container trực tiếp mà không cần phải xây dựng lại toàn bộ. Nó sử dụng các báo cáo lỗ hổng từ các công cụ quét như Trivy để áp dụng các bản cập nhật bảo mật. Copa được phân phối dưới dạng một tệp nhị phân duy nhất hoạt động trên tất cả các bản phân phối Linux.
Tải xuống tệp nhị phân Copa: Lấy tệp nhị phân đã được xây dựng sẵn từ trang phát hành chính thức trên GitHub của Copa:
$ wget https://github.com/project-copacetic/copacetic/releases/download/v0.9.0/copa_0.9.0_linux_amd64.tar.gzGiải nén tệp lưu trữ: Giải nén tệp tar đã tải về:
$ tar -xzf copa_0.9.0_linux_amd64.tar.gz-
Cài đặt Copa: Di chuyển tệp nhị phân vào đường dẫn hệ thống của bạn:
$ sudo mv copa /usr/local/bin/ Xác minh cài đặt: Xác nhận rằng Copa đã được cài đặt đúng cách:
$ copa --version
Bước 3: Quét hình ảnh container để tìm lỗ hổng
Trước khi vá, bạn cần xác định các lỗ hổng trong ảnh container của mình. Các bước sau đây sử dụng linuxconfig/instantprivacy làm ví dụ – hãy thay thế nó bằng tên ảnh của bạn.
Kéo hình ảnh container: Tải hình ảnh bạn muốn quét:
$ sudo docker pull linuxconfig/instantprivacyQuét lỗ hổng bảo mật: Chạy Trivy để quét các lỗ hổng ở cấp hệ điều hành. Tham số
--ignore-unfixedloại trừ các lỗ hổng chưa có bản vá:$ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacyXuất báo cáo JSON: Copa yêu cầu kết quả quét ở định dạng JSON:
$ trivy image --vuln-type os --ignore-unfixed -f json -o instantprivacy.json linuxconfig/instantprivacy
Bước 4: Vá hình ảnh container bằng Copa
Copa sử dụng BuildKit để áp dụng các bản vá cho hình ảnh container.
Bắt đầu container BuildKit: Khởi chạy BuildKit dưới dạng container có quyền đặc biệt:
$ sudo docker run --detach --rm --privileged \ -p 127.0.0.1:8888:8888/tcp \ --name buildkitd \ --entrypoint buildkitd \ moby/buildkit:v0.11.4 \ --addr tcp://0.0.0.0:8888-
Xác minh BuildKit đang chạy: Xác nhận container đã khởi động thành công:
$ sudo docker ps vá hình ảnh container: Sử dụng Copa để áp dụng các bản vá bảo mật. Cờ
-tchỉ định thẻ cho hình ảnh đã vá:$ sudo copa patch \ -i docker.io/linuxconfig/instantprivacy \ -r instantprivacy.json \ -t patched \ -a tcp://0.0.0.0:8888Copa tải về các bản cập nhật bảo mật và tạo một lớp hình ảnh mới với các bản vá đã được áp dụng. Hình ảnh đã được vá sẽ được gán nhãn là
linuxconfig/instantprivacy:patched.
Bước 5: Xác minh hình ảnh đã vá
Quét hình ảnh đã vá: Xác nhận tất cả các lỗ hổng đã được khắc phục:
$ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy:patchedKiểm tra hình ảnh đã vá: Xác minh hình ảnh đã vá chạy đúng cách:
$ sudo docker run --name=instantprivacy -d -p 8118:8118 linuxconfig/instantprivacy:patched $ export http_proxy="http://localhost:8118" $ curl api.ipify.org 45.84.107.174Dọn dẹp: Dừng container BuildKit khi hoàn tất:
$ sudo docker stop buildkitd
Kết luận
Bạn đã quét thành công hình ảnh container Docker để tìm các lỗ hổng bảo mật bằng Trivy và tự động vá chúng bằng Copa. Cách tiếp cận này nhanh hơn so với việc xây dựng lại hình ảnh từ đầu và chỉ thêm một lớp vá duy nhất, giữ nguyên cấu trúc hình ảnh gốc. Đối với môi trường sản xuất, hãy tích hợp các công cụ này vào pipeline CI/CD của bạn để tự động quét và vá các hình ảnh container trước khi triển khai. Để biết thêm thông tin, hãy tham khảo tài liệu chính thức của Trivy và trang web dự án Copa.
Câu hỏi thường gặp
- Copa có thể vá những loại lỗ hổng nào? Copa chỉ vá các lỗ hổng ở cấp hệ điều hành (như các gói Debian, Ubuntu, Alpine hoặc RHEL). Nó không thể vá các phụ thuộc ở cấp ứng dụng như các gói npm, module Python pip hoặc module Go. Đối với những trường hợp đó, bạn cần xây dựng lại ứng dụng với các phụ thuộc đã được cập nhật.
- Tại sao tôi cần BuildKit để chạy Copa? Copa sử dụng khả năng phân tích và gộp của BuildKit để tạo ra một lớp hình ảnh mới chỉ chứa các tệp đã được vá. BuildKit chạy dưới dạng một container có quyền đặc biệt, xử lý việc thao tác hình ảnh ở mức thấp. Nếu không có BuildKit, Copa không thể áp dụng các bản vá lên hệ thống tệp của container.
- Tôi có thể vá các hình ảnh từ kho lưu trữ riêng không? Có, Copa hỗ trợ các kho lưu trữ riêng. Bạn cần xác thực bằng
docker logintrước khi chạy lệnh vá. Copa sử dụng thông tin đăng nhập Docker của bạn để lấy hình ảnh gốc và đẩy kết quả đã vá nếu cần. - Điều gì sẽ xảy ra nếu Copa không thể vá tất cả các lỗ hổng? Một số lỗ hổng có thể chưa có bản vá. Cờ
--ignore-unfixedtrong Trivy sẽ loại trừ những lỗ hổng này khỏi báo cáo. Copa sẽ vá tất cả những gì đã có bản vá. Chạy lại Trivy mà không có--ignore-unfixedđể xem tất cả các lỗ hổng, bao gồm cả những lỗ hổng đang chờ bản vá. - Làm thế nào để cập nhật Copa lên phiên bản mới nhất? Tải phiên bản mới nhất từ trang phát hành GitHub của Copa và thay thế tệp nhị phân trong
/usr/local/bin/. Kiểm tra phiên bản hiện tại bằngcopa --version.





