Kho container công cộng: Tiện lợi nhưng rủi ro chực chờ
Đóng gói ứng dụng vào container giống như xếp hàng vào thùng container vận tải. Mỗi image chứa mã nguồn, thư viện phụ thuộc và cả một hệ điều hành thu nhỏ bên trong.
Rất nhiều team tiện tay đẩy thẳng image lên các registry công cộng như Docker Hub. Rủi ro bắt đầu từ đây. Một sơ suất nhỏ khi để repo ở chế độ Public có thể phơi bày toàn bộ file .env chứa API key nội bộ. Nguy hiểm hơn, dev có thể kéo nhầm base image trôi nổi chứa sẵn mã độc đào XMRig hoặc backdoor kết nối về máy chủ C2.
Khoảng năm 2022, server staging của mình từng dính cryptominer do dev pull nhầm một image Redis không rõ nguồn gốc trên mạng. CPU luôn chạm đỉnh 100%, quạt hú suốt đêm. Kể từ sự cố đó, mình áp dụng nguyên tắc: không chạy bất kỳ image nào ra production nếu chưa qua kiểm định nội bộ. Đó là lúc bạn cần Harbor — một Private Container Registry do chính bạn làm chủ.
Harbor bảo vệ hệ thống như thế nào?
Harbor là dự án nguồn mở thuộc Cloud Native Computing Foundation (CNCF). Không chỉ dừng lại ở việc lưu và trả image như Docker Registry mặc định, Harbor đóng vai trò như chốt kiểm soát an ninh với ba lớp bảo vệ:
- Quét lỗ hổng tự động với Trivy: Harbor tích hợp sẵn Trivy scanner. Ngay khi có lệnh
docker push, hệ thống tự động giải nén image và đối soát với cơ sở dữ liệu CVE. Nếu phát hiện lỗ hổng mức Critical, Harbor lập tức khóa image, không cho bất kỳ ai kéo về máy chủ. - Ký số và niêm phong bằng Cosign: Cơ chế này đảm bảo image tải về chưa từng bị chỉnh sửa dọc đường. Sử dụng Cosign của dự án Sigstore, mỗi container được gắn chữ ký số mật mã học. Kubernetes cluster hoặc máy chủ Docker chỉ cấp phép chạy những image mang chữ ký hợp lệ từ pipeline của công ty.
- Phân quyền RBAC và Robot Account: Từng dự án được phân tách triệt để. Đội ngũ backend không thể can thiệp vào image của frontend. Pipeline CI/CD được cấp token riêng với quyền hạn tối thiểu thay vì dùng chung tài khoản admin.
Triển khai Harbor chuẩn bảo mật trên Ubuntu
Bước 1: Chuẩn bị máy chủ
Hệ thống cần tối thiểu 2 vCPU, 4GB RAM và 40GB ổ cứng (khuyến nghị SSD). Hãy cài đặt Docker Engine và Docker Compose v2:
# Cập nhật repository và cài công cụ phụ trợ
sudo apt update && sudo apt install -y curl wget ca-certificates gnupg
# Cài đặt Docker bản mới nhất
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl enable --now docker
# Kiểm tra phiên bản
docker compose version
Bước 2: Tạo chứng chỉ SSL/TLS
Harbor mặc định từ chối giao tiếp qua HTTP không mã hóa. Nếu chưa có chứng chỉ từ Let’s Encrypt hoặc CA nội bộ, bạn có thể tự tạo chứng chỉ tự ký (Self-signed Certificate) để kiểm thử:
sudo mkdir -p /data/cert
cd /data/cert
# Tạo Private Key 4096-bit
sudo openssl genrsa -out registry.example.com.key 4096
# Tạo chứng chỉ SSL thời hạn 365 ngày
sudo openssl req -x509 -new -nodes -sha512 -days 365 \
-subj "/C=VN/ST=Hanoi/L=Hanoi/O=DevOps/CN=registry.example.com" \
-key registry.example.com.key \
-out registry.example.com.crt
# Cấu hình để Docker daemon tin tưởng chứng chỉ tự ký này
sudo mkdir -p /etc/docker/certs.d/registry.example.com
sudo cp /data/cert/registry.example.com.crt /etc/docker/certs.d/registry.example.com/ca.crt
sudo systemctl restart docker
Bước 3: Cấu hình và khởi chạy Harbor
Tải gói cài đặt offline chính thức từ GitHub Releases:
cd /tmp
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
tar -xzvf harbor-offline-installer-v2.10.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
Mở file harbor.yml và chỉnh sửa các tham số quan trọng:
hostname: registry.example.com
http:
port: 80
https:
port: 443
certificate: /data/cert/registry.example.com.crt
private_key: /data/cert/registry.example.com.key
harbor_admin_password: StrongPassword2026!#
data_volume: /data/harbor
Chạy script cài đặt kèm cờ tích hợp máy quét Trivy:
sudo ./install.sh --with-trivy
Sau khoảng 2-3 phút, kiểm tra trạng thái bằng lệnh docker ps. Bạn sẽ thấy 9 container cốt lõi của Harbor (registry, core, trivy-adapter, postgresql, redis…) đang chạy ổn định.
Bước 4: Bật chính sách chặn image chứa lỗ hổng
Mở trình duyệt, truy cập https://registry.example.com và đăng nhập bằng tài khoản admin.
- Vào Projects > nhấn New Project. Đặt tên
fintech-corevà giữ chế độ Private. - Nhấp vào dự án
fintech-core, chọn tab Configuration. - Bật tùy chọn Automatically scan images on push.
- Bật tùy chọn Prevent vulnerable images from running, thiết lập ngưỡng chặn từ mức High hoặc Critical.
Thao tác này đóng vai trò chốt chặn cuối cùng. Dù dev vô tình push image dính lỗ hổng đã được cảnh báo, lệnh docker pull từ production server sẽ bị Harbor từ chối ngay lập tức.
Bước 5: Ký số Container Image với Cosign
Chặn lỗi bảo mật là chưa đủ. Bạn cần chắc chắn image không bị kẻ gian chèn mã độc vào giữa đường. Ta sử dụng Cosign:
# Cài đặt Cosign binary
wget https://github.com/sigstore/cosign/releases/download/v2.2.3/cosign-linux-amd64 -O cosign
chmod +x cosign && sudo mv cosign /usr/local/bin/
# Tạo cặp khóa ký số (nhập mật khẩu bảo vệ khi được yêu cầu)
cosign generate-key-pair
# Lệnh tạo ra 2 file: cosign.key (khóa bí mật) và cosign.pub (khóa công khai)
# Đăng nhập vào Harbor
docker login registry.example.com
# Gắn tag và đẩy image thử nghiệm
docker tag nginx:alpine registry.example.com/fintech-core/web:v1.0
docker push registry.example.com/fintech-core/web:v1.0
# Ký số lên image vừa đẩy
cosign sign --key cosign.key registry.example.com/fintech-core/web:v1.0
# Xác minh chữ ký số
cosign verify --key cosign.pub registry.example.com/fintech-core/web:v1.0
Khi lệnh verify trả về payload chứa đúng digest SHA-256, hệ thống xác nhận image này hoàn toàn nguyên bản từ khâu đóng gói.
Bước 6: Cấp quyền tối thiểu cho CI/CD bằng Robot Account
Tuyệt đối không dùng tài khoản cá nhân hay mật khẩu admin trong script CI/CD. Nếu token lộ trên log pipeline, hacker sẽ chiếm toàn quyền registry. Giải pháp chuẩn là dùng Robot Account:
- Trong dự án
fintech-core, truy cập tab Robot Accounts > chọn Add Robot Account. - Đặt tên là
gitlab-runner, giới hạn thời gian hết hạn (ví dụ: 90 ngày). - Chỉ tích chọn đúng 2 quyền: Push và Pull trong phạm vi dự án này.
- Nhấn Save và sao chép Secret Token ngay lập tức. Token chỉ hiển thị một lần duy nhất.
Trong Harbor 2.x, username của project robot account sẽ có tiền tố project. Đăng nhập từ runner CI/CD bằng cú pháp:
docker login registry.example.com -u 'robot$fintech-core+gitlab-runner' -p 'YOUR_SECRET_TOKEN'
Lời kết
Dựng Harbor không chỉ để có một nơi lưu trữ file Docker image. Nó là tấm khiên giúp đội ngũ DevOps kiểm soát chính xác những gì chuẩn bị chạy trên máy chủ của mình.
Bỏ ra khoảng hai giờ thiết lập Harbor kèm Trivy và Cosign sẽ bảo vệ bạn khỏi vô số rủi ro bảo mật chuỗi cung ứng. Bắt đầu càng sớm, hệ thống của bạn càng ít nợ kỹ thuật về sau.
