Kubernetes v1.33 khắc phục lỗi tái sử dụng hình ảnh riêng tư giữa các pod
Kubernetes v1.33 giới thiệu một cơ chế xác minh mới nhằm ngăn chặn các pod trái phép tái sử dụng hình ảnh container riêng tư đã có sẵn trên node.
Được dịch tự động từ bản gốc tiếng Anh.
Trong một bài đăng trên Kubernetes Blog vào tháng 5 năm 2025, các nhà duy trì Ben Petersen và Stanislav Láznička đã mô tả một điều chỉnh bảo mật quan trọng trong Kubernetes v1.33. Bản cập nhật này giải quyết một vấn đề tồn tại suốt thập kỷ qua, nơi các pod có thể vô tình truy cập vào các hình ảnh container riêng tư được kéo bởi các pod khác trên cùng một node mà không có sự ủy quyền phù hợp.
Điều gì đã xảy ra
Trong hơn mười năm, người dùng Kubernetes đã gặp phải một lỗ hổng bảo mật tinh vi nhưng đáng kể liên quan đến cài đặt imagePullPolicy: IfNotPresent. Chính sách này được thiết kế để tối ưu hóa hiệu suất bằng cách sử dụng hình ảnh được lưu trữ cục bộ nếu nó tồn tại, thay vì kéo từ registry mỗi lần. Tuy nhiên, trước đây, việc tối ưu hóa này đã bỏ qua các ranh giới xác thực giữa các pod khác nhau được lên lịch trên cùng một node.
Vấn đề cốt lõi nảy sinh khi Pod A, được ủy quyền với các thông tin đăng nhập cụ thể thông qua imagePullSecret, kéo một hình ảnh riêng tư lên node. Nếu Pod B, nằm trong một namespace khác và không có bất kỳ thông tin đăng nhập hợp lệ nào cho kho lưu trữ riêng tư đó, sau đó được lên lịch trên cùng node với chính sách IfNotPresent, Kubelet sẽ cho phép nó sử dụng hình ảnh đã được lưu trữ. Pod B chưa bao giờ được ủy quyền để kéo hình ảnh, nhưng nó vẫn có quyền truy cập chỉ vì các lớp nhị phân đã có sẵn trên đĩa. Hành vi này vi phạm nguyên tắc đặc quyền tối thiểu và tạo ra rủi ro bảo mật chuỗi cung ứng tiềm tàng trong các cụm.
Với bản phát hành Kubernetes v1.33, SIG Auth và SIG Node đã đưa ra một bản sửa lỗi để thực thi việc xác minh thông tin đăng nhập ngay cả khi các hình ảnh được lưu trữ. Hành vi mới đảm bảo rằng một pod chỉ có thể sử dụng hình ảnh riêng tư hiện có cục bộ nếu nó cung cấp các thông tin đăng nhập khớp với những thông tin đã được sử dụng trong lần kéo đầu tiên. Thay đổi này đóng lại lỗ hổng trong khi vẫn duy trì lợi ích hiệu suất của việc lưu trữ cục bộ cho các khối lượng công việc được ủy quyền.
Cách thức hoạt động
Giải pháp dựa vào các bộ nhớ đệm cache dạng tệp bền vững do Kubelet duy trì trên mỗi node. Khi một pod yêu cầu một hình ảnh chưa có trên node, Kubelet ghi nhận ý định kéo. Sau đó, nó trích xuất thông tin đăng nhập từ Kubernetes Secret được tham chiếu và thực hiện việc kéo từ registry riêng tư. Khi thành công, Kubelet lưu trữ một bản ghi về sự kiện này, bao gồm một hash của các thông tin đăng nhập được sử dụng và định danh của Secret nguồn.
Khi một pod tiếp theo yêu cầu cùng một hình ảnh, Kubelet kiểm tra bộ nhớ đệm cache cục bộ của nó. Thay vì phục vụ mù quáng hình ảnh đã được lưu trữ, nó so sánh các thông tin đăng nhập do pod mới cung cấp với các bản ghi đã lưu. Nếu hash thông tin đăng nhập hoặc Secret nguồn khớp với một lần kéo thành công trước đó, pod sẽ được cấp quyền truy cập vào hình ảnh đã được lưu trữ mà không cần tải lại dữ liệu. Nếu không có sự khớp nối, Kubelet sẽ cố gắng kéo hình ảnh từ registry từ xa bằng các thông tin đăng nhập mới, kích hoạt quy trình ủy quyền tiêu chuẩn. Cơ chế này đảm bảo rằng chỉ những pod có thông tin đăng nhập hợp lệ và khớp mới có thể tái sử dụng các hình ảnh riêng tư đã được lưu trữ.
Chi tiết chính
- Bản sửa lỗi giải quyết vấn đề 18787, một cảnh báo bảo mật tồn tại trong Kubernetes hơn mười năm.
- Tính năng này khả dụng dưới dạng bản phát hành alpha trong Kubernetes v1.33.
- Người dùng phải bật feature gate
KubeletEnsureSecretPulledImagestrên các Kubelet của họ để kích hoạt hành vi mới. - Các pod sử dụng cùng thông tin đăng nhập hoặc Secret nguồn không cần phải xác thực lại, giúp duy trì hiệu suất.
- Chính sách
imagePullPolicy: Neverhiện cũng yêu cầu xác minh thông tin đăng nhập đối với các hình ảnh riêng tư đã có trên node. - Các kế hoạch trong tương lai bao gồm tích hợp với Projected service account tokens và thêm hỗ trợ cho thời hạn hết hiệu lực của thông tin đăng nhập.
Tại sao điều này quan trọng
Đối với các kỹ sư phần mềm và nhóm nền tảng, thay đổi này tăng cường sự cô lập của cụm mà không đòi hỏi những thay đổi vận hành mạnh mẽ. Trước đây, nhiều tổ chức đã áp dụng imagePullPolicy: Always như một biện pháp tạm thời để đảm bảo rằng mọi pod đều thực hiện kiểm tra xác thực với registry. Mặc dù an toàn, phương pháp này đặt image registry vào đường dẫn quan trọng cho mỗi lần khởi động, mở rộng quy mô hoặc khởi động lại pod, làm tăng độ trễ và sự phụ thuộc vào các dịch vụ bên ngoài. Cơ chế xác minh mới cho phép các nhóm sử dụng an toàn IfNotPresent, giảm tải cho registry và cải thiện thời gian khởi động trong khi vẫn duy trì các biện pháp kiểm soát bảo mật nghiêm ngặt.
Bản cập nhật này cũng đơn giản hóa việc quản lý cụm đa thuê bao (multi-tenant). Trong các môi trường nơi nhiều nhóm chia sẻ các node, rủi ro một nhóm vô tình truy cập vào các hình ảnh riêng tư của nhóm khác hiện đã được giảm thiểu ở cấp độ Kubelet. Các kỹ sư nền tảng có thể dựa vào cơ sở hạ tầng để thực thi các chính sách truy cập thay vì chỉ phụ thuộc vào các chính sách mạng hoặc admission controllers để ngăn chặn việc sử dụng hình ảnh trái phép. Sự thay đổi này đưa hành vi của Kubernetes gần hơn với kỳ vọng của người dùng về bảo mật và sự cô lập.
Những gì bạn có thể làm
- Nâng cấp các cụm thử nghiệm của bạn lên Kubernetes v1.33 để đánh giá tính năng mới.
- Bật feature gate
KubeletEnsureSecretPulledImagestrong cấu hình Kubelet của bạn. - Xem xét lại các pod sử dụng cùng thông tin đăng nhập hoặc Secret nguồn để đảm bảo chúng không cần xác thực lại, giúp duy trì hiệu suất.
- Lưu ý rằng chính sách
imagePullPolicy: Neverhiện cũng yêu cầu xác minh thông tin đăng nhập đối với các hình ảnh riêng tư đã có trên node. - Theo dõi các kế hoạch trong tương lai bao gồm tích hợp với Projected service account tokens và thêm hỗ trợ cho thời hạn hết hiệu lực của thông tin đăng nhập.
