Trong quá trình vận hành các hệ thống container, việc đảm bảo các thành phần bên trong image không chứa lỗ hổng bảo mật là ưu tiên hàng đầu. Một vấn đề phổ biến là image quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 mặc định sử dụng phiên bản Nginx cũ, tiềm ẩn nhiều rủi ro. Giải pháp tối ưu là xây dựng lại image này với phiên bản Nginx ổn định mới nhất từ kho lưu trữ chính thức.
Lý do cần nâng cấp
Các phiên bản Nginx cũ thường chứa các lỗ hổng liên quan đến tràn bộ đệm hoặc xử lý HTTP/2 không an toàn. Việc nâng cấp không chỉ giúp loại bỏ các nguy cơ bị tấn công mà còn giúp hệ thống tận dụng được các cải tiến về hiệu suất xử lý traffic trong môi trường Kubernetes.
Quy trình thực hiện qua Dockerfile
Chúng ta sẽ thực hiện việc tùy chỉnh lại image gốc bằng cách thêm kho lưu trữ (repository) của Nginx Alpine vào hệ thống apk, sau đó cài đặt phiên bản mới nhất. Dưới đây là các bước cụ thể được cấu trúc lại để tối ưu hóa quá trình build.
Cấu trúc Dockerfile tùy chỉnh
Dockerfile sau đây sẽ thực hiện việc chuyển đổi người dùng sang root, thiết lập khóa ký (signing key), cập nhật kho phần mềm và cài đặt Nginx mới:
FROM quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
# Chuyển sang quyền root để thao tác hệ thống
USER root
# Quy trình cài đặt và nâng cấp Nginx
RUN apk add --no-cache ca-certificates curl openssl && \
# Xác định phiên bản Alpine hiện tại để lấy repo tương ứng
export OS_VER=$(cat /etc/alpine-release | cut -d'.' -f1,2) && \
echo "http://nginx.org/packages/alpine/v${OS_VER}/main" >> /etc/apk/repositories && \
# Tải và cấu hình public key của Nginx
curl -fsSL https://nginx.org/keys/nginx_signing.rsa.pub -o /etc/apk/keys/nginx_signing.rsa.pub && \
# Cập nhật danh sách gói và cài đặt phiên bản Nginx mới nhất
apk update && \
apk add --no-cache \
nginx \
nginx-module-image-filter \
nginx-module-njs \
# Dọn dẹp cache để giảm dung lượng image
&& rm -rf /var/cache/apk/*
# Quay lại người dùng mặc định để đảm bảo an toàn khi vận hành
USER www-data
Xây dựng và triển khai image mới
Sau khi chuẩn bị Dockerfile, tiến hành build image bằng lệnh sau:
docker build -t ingress-nginx-patched:v0.30.0-updated .
Sau khi build thành công, bạn có thể khởi chạy container để kiểm tra:
docker run -d --name test-ingress-update ingress-nginx-patched:v0.30.0-updated
Xác nhận kết quả nâng cấp
Để đảm bảo Nginx đã được cập nhật lên phiên bản mong muốn, hãy truy cập vào container và kiểm tra thông tin phiên bản:
docker exec -it test-ingress-update nginx -v
Kết quả trả về sẽ hiển thị phiên bản Nginx mới nhất được cung cấp bởi nginx.org thay vì phiên bản mặc định đi kèm với image 0.30.0 ban đầu. Việc chủ động kiểm soát phiên bản phần mềm trong image giúp tăng cường lớp phòng thủ cho hạ tầng microservices của doanh nghiệp.