Vấn đề thực tế: Khi chạm giới hạn registry miễn phí và nỗi lo về container không xác thực
Vài tháng trước, các tiến trình build trong HomeLab của tôi bỗng nhiên dừng trệ hoàn toàn. Lúc đó tôi có ba GitLab runner nội bộ đang build microservices, một cluster k3s gồm bốn node liên tục pull image thử nghiệm, cùng vài cron job chạy tác vụ bảo trì định kỳ. Đột nhiên mọi pipeline đều gãy với lỗi 429 Too Many Requests. Docker Hub đã siết chặt IP public của tôi với mức giới hạn nghiêm ngặt 100 lần pull mỗi 6 giờ đối với người dùng ẩn danh.
Ngoài vấn đề chạm trần giới hạn lượt tải, một rủi ro còn nguy hiểm hơn đã âm thầm len lỏi vào hệ thống: sự tin tưởng mù quáng. Khi thử nghiệm các base image hoặc pull các container thử nghiệm về, tôi hoàn toàn không có bất kỳ cơ chế kiểm tra lỗ hổng bảo mật tự động nào. Một base image dính lỗi nghiêm trọng cho phép thực thi mã từ xa (RCE) có thể nằm im lìm trên các node suốt nhiều tháng mà không hề bị phát hiện. Tệ hơn nữa, các worker node chỉ đơn giản kéo về bất kỳ file nhị phân nào khớp với tag chỉ định mà không hề có bằng chứng mật mã học để xác minh rằng image đó thực sự xuất phát từ pipeline build của chính mình.
Phân tích nguyên nhân gốc rễ: Vì sao Docker Hub và Registry tối giản không còn đáp ứng được
Phần lớn kỹ sư HomeLab đều bắt đầu với một trong hai mô hình cơ bản: hoặc phụ thuộc vào các dịch vụ SaaS registry công cộng, hoặc dựng một container registry:2 thuần túy, tối giản.
Cả hai mô hình này đều nhanh chóng bộc lộ hạn chế ngay khi lab của bạn mở rộng quy mô vượt quá vài chiếc máy:
- Lãng phí băng thông và độ trễ đường truyền: Việc push một container microservice nặng 1.2GB lên registry bên ngoài qua đường truyền mạng gia đình với tốc độ upload 50Mbps là một trải nghiệm vô cùng chậm chạp. Sau đó lại phải pull chính image đó về một máy chủ khác nằm chung trong mạng switch Gigabit cục bộ thì thực sự không hợp lý chút nào.
- Thiếu kiểm tra bảo mật tự động: Container
registry:2mặc định về bản chất chỉ là một HTTP API bọc ngoài thư mục ổ đĩa. Nó không tích hợp sẵn engine quét lỗ hổng, không có cơ sở dữ liệu CVE, và không có cơ chế nào để ngăn chặn việc triển khai nếu image bị xâm nhập hay dính mã độc. - Thiếu nguồn gốc xuất xứ và kiểm soát chính sách: Các registry tối giản không hỗ trợ phân quyền chi tiết theo vai trò (RBAC), không có tính năng khóa tag (tag immutability) cũng như kiểm tra chữ ký số. Bất kỳ ai trong mạng nội bộ cũng có thể vô tình ghi đè tag
latestbằng đoạn mã chưa qua kiểm thử hoặc đang bị lỗi.
So sánh các giải pháp: Tìm kiếm Registry phù hợp cho HomeLab
Khi cân nhắc lựa chọn một nền tảng chuyên dụng cho lab của mình, tôi đã đánh giá ba ứng viên tiêu biểu:
| Giải pháp | Mức tiêu thụ tài nguyên | Bảo mật & Quét lỗ hổng | Hỗ trợ ký ảnh (Image Signing) | Phù hợp nhất cho |
|---|---|---|---|---|
| Docker Registry v2 | Cực nhẹ (~50-100MB RAM) | Không có (Cần công cụ CLI bên ngoài) | Không có | Môi trường staging cục bộ tạm thời, không yêu cầu bảo mật. |
| Nexus OSS / JFrog Artifactory | Nặng (>4GB RAM, chạy trên JVM) | Chỉ có ở bản trả phí (tính năng Xray / Pro) | Cấu hình plugin phức tạp | Hệ thống đa artifact cấp doanh nghiệp (Maven, npm, PyPI + Docker). |
| Project Harbor | Vừa phải (~2GB đến 3GB RAM) | Tích hợp sẵn bộ quét Trivy | Hỗ trợ native Cosign và Notary | HomeLab, pipeline GitOps và quản trị container toàn diện. |
Docker Registry v2 rất gọn nhẹ nhưng lại bỏ qua hoàn toàn vấn đề an toàn container. Nexus và Artifactory lại đòi hỏi tài nguyên hệ thống rất lớn, đồng thời giữ lại tính năng quét lỗ hổng tự động cho các gói giấy phép thương mại đắt đỏ. Harbor chính là điểm cân bằng lý tưởng. Là một dự án mã nguồn mở đã tốt nghiệp (graduated) của CNCF, Harbor cung cấp sẵn tính năng quét Trivy tích hợp, cơ chế khóa tag, tài khoản robot và xác thực image mà không cần đến các gói trả phí doanh nghiệp.
Giải pháp tối ưu: Triển khai Harbor trên Docker cùng Trivy và Cosign
Dưới đây là cấu hình thực tế đã được kiểm chứng mà tôi đang sử dụng để vận hành Harbor trên máy chủ Ubuntu 24.04 LTS bằng Docker Compose, hoàn thiện với tính năng quét bảo mật Trivy và ký ảnh qua Cosign.
Bước 1: Chuẩn bị máy chủ
Dành riêng một máy ảo hoặc máy chủ vật lý với tối thiểu 2 vCPU, 4GB RAM và 50GB dung lượng lưu trữ trống. Kiểm tra phiên bản cài đặt của Docker Engine và Compose plugin:
# Kiểm tra phiên bản Docker và Compose đã cài đặt
docker --version
docker compose version
# Tạo thư mục làm việc cho Harbor
sudo mkdir -p /opt/harbor
cd /opt/harbor
Bước 2: Tạo chứng chỉ SSL và cấu hình Trust Store nội bộ
Các container engine hiện đại đều mặc định từ chối các registry dùng HTTP không bảo mật. Nếu bạn có sẵn một CA nội bộ như Step-CA hoặc pfSense, hãy cấp chứng chỉ cho tên miền core.harbor.local. Nếu không, hãy tự tạo một Certificate Authority cục bộ riêng cùng chứng chỉ máy chủ bằng OpenSSL:
# Tạo private key và chứng chỉ cho root CA (thời hạn 10 năm)
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=US/ST=Lab/L=Home/O=HomeLab/CN=HomeLab-RootCA" \
-key ca.key -out ca.crt
# Tạo server key và yêu cầu ký chứng chỉ (CSR)
openssl genrsa -out harbor.local.key 4096
openssl req -sha512 -new \
-subj "/C=US/ST=Lab/L=Home/O=HomeLab/CN=core.harbor.local" \
-key harbor.local.key -out harbor.local.csr
# Khai báo Subject Alternative Names (SAN)
cat > v3.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = core.harbor.local
DNS.2 = harbor.local
EOF
# Ký chứng chỉ server bằng CA nội bộ vừa tạo
openssl x509 -req -sha512 -days 365 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.local.csr -out harbor.local.crt
# Lưu trữ chứng chỉ vào thư mục chứa certificate của Harbor
sudo mkdir -p /data/cert
sudo cp harbor.local.crt /data/cert/
sudo cp harbor.local.key /data/cert/
Bước 3: Tải về và cấu hình Harbor
Tải gói cài đặt offline bundle mới nhất từ GitHub để tránh gặp sự cố gián đoạn mạng trong quá trình cài đặt:
cd /opt/harbor
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
tar xvf harbor-offline-installer-v2.10.0.tgz
cp harbor.yml.tmpl harbor.yml
Mở file harbor.yml và chỉnh sửa hostname, đường dẫn chứng chỉ cùng mật khẩu quản trị viên:
# Cấu hình chính trong harbor.yml
hostname: core.harbor.local
# Điều hướng lưu lượng HTTP thuần hoặc giữ lại cho các proxy nội bộ
http:
port: 80
https:
port: 443
certificate: /data/cert/harbor.local.crt
private_key: /data/cert/harbor.local.key
# Thiết lập mật khẩu quản trị mạnh
harbor_admin_password: ChangeThisStrongSecret2026!
# Thư mục lưu trữ dữ liệu bền vững (images, database, chart repo)
data_volume: /data/harbor
Bước 4: Chạy bộ cài đặt tích hợp công cụ quét Trivy
Khởi chạy Harbor kèm theo Trivy bằng cách thêm cờ --with-trivy. Bộ cài đặt sẽ tự động sinh file docker-compose.yml và dựng lên 9 service phối hợp nhịp nhàng với nhau:
sudo ./install.sh --with-trivy
# Kiểm tra đảm bảo tất cả container đều hoạt động bình thường
docker compose ps
Bước 5: Thêm Root CA vào danh sách tin cậy trên Docker Client và Build Node
Các công cụ như Docker và Cosign sẽ từ chối kết nối cho đến khi chúng tin cậy root CA nội bộ của bạn. Hãy chạy các lệnh sau trên bất kỳ máy trạm, CI runner hoặc máy chủ client nào cần kết nối tới Harbor:
# 1. Cấu hình đường dẫn tin cậy cho Docker daemon
sudo mkdir -p /etc/docker/certs.d/core.harbor.local
sudo cp /opt/harbor/ca.crt /etc/docker/certs.d/core.harbor.local/ca.crt
# 2. Thêm CA vào trust store của hệ điều hành để Cosign và curl chấp nhận
sudo cp /opt/harbor/ca.crt /usr/local/share/ca-certificates/homelab-ca.crt
sudo update-ca-certificates
# 3. Khởi động lại Docker daemon để áp dụng thay đổi
sudo systemctl restart docker
Ngoài ra, hãy chắc chắn rằng máy client có thể phân giải tên miền core.harbor.local về đúng địa chỉ IP của máy chủ Harbor, thông qua hệ thống DNS nội bộ (như Pi-hole hay AdGuard Home) hoặc cấu hình trong file /etc/hosts.
Bước 6: Tự động hóa chính sách kiểm tra lỗ hổng trên giao diện Web UI
- Trong mục Administration > Interrogation Services, kiểm tra xem Trivy đã ở trạng thái hoạt động chưa. Thiết lập một lịch cron (chẳng hạn như
0 0 * * *) để làm mới cơ sở dữ liệu lỗ hổng hàng đêm. - Chọn Projects, nhấn vào New Project, đặt tên là
productionvà đảm bảo dự án được đặt ở chế độ riêng tư (private). - Chuyển sang tab cấu hình của dự án. Đánh dấu chọn vào Automatically scan images on push.
- Bật tùy chọn Prevent vulnerable images from running và chọn mức High hoặc Critical. Giờ đây, Harbor sẽ chủ động chặn mọi lượt pull từ phía client đối với bất kỳ image nào chứa các mã CVE nghiêm trọng chưa được vá.
Bước 7: Ký xác thực Container Image với Cosign
Quét bảo mật giúp phát hiện các lỗ hổng đã biết. Trong khi đó, việc ký số bằng mật mã học đảm bảo nguồn gốc xuất xứ và ngăn chặn hành vi chỉnh sửa trái phép. Cài đặt Cosign trên máy trạm hoặc CI runner của bạn để tiến hành ký image trực tiếp trên Harbor:
# Tạo cặp khóa ký (chọn mật khẩu an toàn cho file cosign.key)
cosign generate-key-pair
# Đăng nhập Docker vào Harbor registry của bạn
docker login core.harbor.local -u admin
# Build, gắn tag và push image thử nghiệm
docker tag alpine:latest core.harbor.local/production/my-app:1.0.0
docker push core.harbor.local/production/my-app:1.0.0
# Ký digest của image trực tiếp trên Harbor
cosign sign --key cosign.key core.harbor.local/production/my-app:1.0.0
# Xác minh chữ ký của image
cosign verify --key cosign.pub core.harbor.local/production/my-app:1.0.0
Kiểm tra lại giao diện Harbor trong dự án production của bạn. Bên cạnh tag image, bạn sẽ thấy hai biểu tượng: một bảng phân tích chi tiết mã CVE từ Trivy và một dấu tích xanh xác nhận chữ ký Cosign hợp lệ.
Tự vận hành Harbor registry giúp phòng lab của bạn thoát khỏi cảnh bị giới hạn rate limit từ dịch vụ bên ngoài, rút ngắn thời gian pull chỉ còn vài giây trong mạng nội bộ. Quan trọng hơn hết, nó mang đến cho HomeLab các lớp bảo vệ quét mã độc và ký số tiêu chuẩn tương đương các cụm hạ tầng doanh nghiệp lớn.

