Khoảng trống distroless: Container OCI xây từ gốc

Distroless có thể làm mất siêu dữ liệu mà trình quét lỗ hổng cần. Container OCI xây từ gốc giữ ảnh nhỏ, có thể kiểm toán và ổn định khi chạy.

Quy trình xây container từ gốc qua ba chặng cắt, dựng và chạy
Ba chặng của quy trình xây container từ gốc

Khoảng trống bảo mật của distroless xuất hiện khi quá trình thu nhỏ ảnh loại bỏ cả siêu dữ liệu gói mà trình quét lỗ hổng cần. Container OCI xây từ gốc giải quyết vấn đề bằng cách chỉ thêm các thành phần cần thiết, giữ lại dữ liệu kiểm toán và quản lý tiến trình số 1 mà không cần một hệ điều hành đầy đủ.

Theo bài phân tích của The New Stack, ngành điện toán đám mây đang phải cân bằng hai mục tiêu: giảm thành phần thừa trong container và duy trì khả năng quan sát bảo mật sau khi triển khai. Một ảnh nhỏ hơn không đồng nghĩa với một ảnh an toàn hơn nếu công cụ quét không còn đủ thông tin để nhận diện rủi ro.

Ảnh container đầy đủ phình to như thế nào

Ảnh container đầy đủ thường lớn vì chứa hệ điều hành, trình bao lệnh, trình quản lý gói và nhiều tiện ích không được ứng dụng sử dụng khi chạy. Mỗi thành phần dư thừa có thể bổ sung lỗ hổng hoặc cung cấp thêm công cụ cho kẻ xấu sau khi ứng dụng bị xâm nhập.

Trong cách xây dựng truyền thống, lập trình viên lấy một ảnh nền chứa hệ điều hành hoàn chỉnh, thêm mã ứng dụng rồi đưa toàn bộ ảnh vào môi trường vận hành. Quy trình này thuận tiện vì môi trường đã có sẵn các công cụ quen thuộc.

Phần lớn những công cụ đó không phục vụ ứng dụng trong thời gian chạy. Tuy nhiên, chúng vẫn có thể chứa lỗ hổng. Nếu kẻ xấu xâm nhập được ứng dụng, các tiện ích có sẵn trong ảnh còn có thể hỗ trợ việc tải công cụ hoặc mở rộng cuộc tấn công.

Yêu cầu về khả năng quan sát vẫn áp dụng khi ảnh container được dùng trong các hệ thống tự động trên Kubernetes. Trình quét cần siêu dữ liệu gói để nhận diện những thành phần có mặt trong ảnh.

Khoảng trống bảo mật của distroless

Distroless giảm bề mặt tấn công bằng cách chỉ giữ các phụ thuộc cần cho thời gian chạy. Khoảng trống xuất hiện khi quá trình tinh giản xóa cả siêu dữ liệu gói: trình quét có thể báo ít lỗ hổng hơn vì thiếu dữ liệu nhận diện, không phải vì ảnh thực sự không còn lỗ hổng.

Chi phí vận hành của ảnh distroless

Một ảnh distroless thường không có trình bao lệnh, trình quản lý gói hoặc các tiện ích không phục vụ ứng dụng. Cách tiếp cận này giảm số thành phần có thể bị khai thác, nhưng quá trình tạo ảnh có thể phức tạp, mong manh và dễ sai.

Siêu dữ liệu quyết định nội dung trình quét nhìn thấy

Rủi ro tăng khi nhóm phát triển cắt bỏ thành phần quá mạnh tay. Siêu dữ liệu gói, tức bản kê cho biết những gì đã được cài đặt, có thể biến mất cùng các tệp bị loại. Trình quét khi đó nhìn thấy ít thành phần hơn vì thiếu ngữ cảnh để nhận diện chúng.

Cảnh báo từ công cụ quét

Trivy cảnh báo khi không tìm thấy siêu dữ liệu gói của hệ điều hành. Theo báo cáo về trình quét lỗ hổng do Yotam Perkal thực hiện cho Rezilion năm 2022, các công cụ này có thể cho kết quả âm tính giả khi thiếu dữ liệu cần thiết để phát hiện lỗ hổng đang tồn tại.

Chainguard nêu cùng một giới hạn. Nếu trình quét không thu thập được siêu dữ liệu gói đầy đủ, kết quả sẽ không phản ánh chính xác nội dung của ảnh. Một container có thể rất nhỏ, nhưng nó vẫn tạo ra trách nhiệm tuân thủ nếu đội bảo mật không thể quét và chứng minh mức độ an toàn.

Hai lựa chọn đều để lại rủi ro

Vì vậy, cả ảnh đầy đủ và ảnh distroless đều có điểm yếu. Ảnh đầy đủ có bề mặt tấn công lớn hơn, còn ảnh tối giản có thể khiến đội bảo mật thiếu ngữ cảnh để quét và chứng minh mức độ an toàn của ảnh.

Thay cắt từ trên xuống bằng lắp từ dưới lên

Container xây từ gốc bắt đầu bằng một ảnh trống rồi chỉ thêm các thành phần ứng dụng cần. Cách lắp từ dưới lên giữ ảnh nhỏ mà vẫn bảo toàn siêu dữ liệu, nhờ đó công cụ bảo mật có thể xác định thành phần nào hiện diện và tiếp tục kiểm toán ảnh.

Trong hệ sinh thái nguồn mở, thế hệ ảnh OCI tối giản và có thể kiểm toán này thường được gọi là “rock”. Quy trình xây dựng gồm ba chặng: cắt gói, dựng ảnh theo khai báo và quản lý container khi chạy.

Chặng một: Cắt chính xác các gói cần thiết

Sơ đồ chia gói Linux thành các phần nhỏ cần thiết cho container
Chisel chỉ lấy những phần ứng dụng thực sự cần

Container xây từ gốc bắt đầu bằng một ảnh rỗng. Công cụ nguồn mở Chisel cắt các gói Linux tiêu chuẩn, chẳng hạn gói trong kho lưu trữ Ubuntu, thành những phần nhỏ hơn.

Thay vì đưa toàn bộ một gói vào ảnh, nhóm phát triển chọn chính xác phần ứng dụng sử dụng. Cách này không thay chuỗi cung ứng phần mềm bằng những tệp không rõ nguồn gốc. Siêu dữ liệu của từng phần cũng được giữ lại để trình quét tiếp tục hoạt động.

Chặng hai: Dựng ảnh theo khai báo

Từ lệnh tuần tự sang trạng thái khai báo

Dockerfile truyền thống mang tính mệnh lệnh: thứ tự của từng lệnh ảnh hưởng trực tiếp đến kết quả, còn bộ nhớ đệm theo lớp có thể làm ảnh phình to hoặc khó ổn định. Mô hình từ gốc chuyển công việc này sang khai báo trạng thái mong muốn.

Với Rockcraft, lập trình viên viết một tệp YAML mô tả ứng dụng và các thành phần cần thiết. Công cụ đọc khai báo, lấy mã nguồn, tải các phần gói được yêu cầu, biên dịch rồi xuất ra ảnh container tuân thủ chuẩn OCI.

Ví dụ trong tài liệu nguồn mô tả một ảnh Python được cắt gọn với nền dựng Ubuntu 26.04 LTS, Python 3.14 và kiến trúc amd64. Các gói trong giai đoạn dựng gồm thông tin phát hành của hệ thống nền và lõi Python 3. Việc khai báo trạng thái giúp nội dung ảnh rõ ràng hơn mà không làm mất dữ liệu kiểm toán.

Chặng ba: Kiểm soát tiến trình số 1

Vì sao container cần tiến trình số 1

Trong hệ điều hành thông thường, hệ thống đảm nhiệm việc quản lý tiến trình. Bên trong container, nếu ứng dụng tạo tiến trình con rồi tiến trình đó kết thúc, nó có thể để lại tiến trình xác sống vẫn chiếm tài nguyên.

Nếu không có hệ thống khởi tạo phù hợp, các tiến trình xác sống có thể tích tụ cho đến khi container gặp sự cố và gây lỗi dây chuyền ở quy mô lớn. Ảnh nền truyền thống thường có trình quản lý tiến trình, nhưng ảnh distroless có thể loại bỏ thành phần này để tiết kiệm dung lượng.

Pebble là một trình quản lý dịch vụ nhỏ và nhẹ. Pebble chạy với vai trò tiến trình số 1, làm điểm vào của container và thu hồi an toàn các tiến trình xác sống. Cách này giữ môi trường vận hành ổn định mà không cần một hệ điều hành đầy đủ.

Bước tiếp theo của ảnh OCI tối giản

Distroless chỉ ra đúng vấn đề của ảnh container cồng kềnh, nhưng việc giảm kích thước không nên làm mất khả năng quan sát bảo mật. Với môi trường doanh nghiệp, một ảnh không thể kiểm toán vẫn tạo ra rủi ro dù chứa ít tệp hơn.

Xác định nội dung ảnh ngay từ đầu

Thay đổi chính nằm ở cách nhóm kỹ thuật xác định nội dung ảnh ngay từ đầu. Quy trình này giữ lại bằng chứng cho công cụ quét và tránh đưa công cụ dư thừa vào môi trường chạy.

Khi rà soát chuỗi cung ứng phần mềm, nhóm kỹ thuật có thể đối chiếu quy trình dựng ảnh hiện tại với ba chặng này trước khi chọn container tối giản cho môi trường sản xuất.