Harbor Registry¶
¿Qué es Harbor?¶
Harbor es un registry de contenedores open source (CNCF Graduated) que proporciona:
- Docker Registry privado
- Helm Chart repository
- Vulnerability scanning (Trivy integrado)
- RBAC (Role-Based Access Control)
- Replication a otros registries
- Image signing (Notary)
- Web UI
Instalación en DEV¶
Esto instala Harbor via Helm en Minikube con NodePort.
Acceso¶
| Campo | Valor |
|---|---|
| URL | https://localhost:30003 |
| Username | admin |
| Password | Harbor12345 |
Configurar Docker/Podman¶
1. Confiar en el certificado¶
# Crear directorio de certificados
sudo mkdir -p /etc/docker/certs.d/localhost:30003
# Obtener certificado de Harbor
kubectl get secret -n harbor harbor-ingress -o jsonpath='{.data.ca\.crt}' | base64 -d | sudo tee /etc/docker/certs.d/localhost:30003/ca.crt
2. Login¶
# Podman
echo 'Harbor12345' | podman login localhost:30003 -u admin --password-stdin
# Docker
echo 'Harbor12345' | docker login localhost:30003 -u admin --password-stdin
Push de Imágenes¶
Taggear imagen¶
# Backend
podman tag localhost/altrupets-backend:dev localhost:30003/altrupets/backend:dev
# Web apps
podman tag localhost/altrupets-web-superusers:dev localhost:30003/altrupets/web-superusers:dev
podman tag localhost/altrupets-web-b2g:dev localhost:30003/altrupets/web-b2g:dev
Push¶
podman push localhost:30003/altrupets/backend:dev
podman push localhost:30003/altrupets/web-superusers:dev
podman push localhost:30003/altrupets/web-b2g:dev
Proyectos¶
Por defecto, Harbor crea un proyecto library. Crea proyectos para organizar:
# Via CLI
curl -X POST "https://localhost:30003/api/v2.0/projects" \
-u "admin:Harbor12345" \
-H "Content-Type: application/json" \
-d '{"project_name": "altrupets", "public": false}'
O via Web UI: Projects → New Project
Configurar Kubernetes¶
Para que Minikube pueda pull de Harbor:
# Crear secret de Docker registry
kubectl create secret docker-registry harbor-registry \
--docker-server=localhost:30003 \
--docker-username=admin \
--docker-password=Harbor12345 \
-n altrupets-dev
# Patchear service account
kubectl patch serviceaccount default -n altrupets-dev \
-p '{"imagePullSecrets": [{"name": "harbor-registry"}]}'
Vulnerability Scanning¶
Harbor incluye Trivy para escaneo automático:
- Push una imagen
- Harbor escanea automáticamente
- Ver resultados en Web UI → Project → Repositories → Tag
Harbor vs Security Scanner¶
El proyecto tiene dos herramientas de escaneo de vulnerabilidades que son complementarias, no redundantes:
| Aspecto | Security Scanner | Harbor Trivy |
|---|---|---|
| Cuándo escanea | Antes del push (CI/CD) | Después del push (Registry) |
| Qué escanea | Código, dependencias, IaC, imágenes | Solo imágenes |
| Ubicación | Kubernetes Job/CronJob | Integrado en Harbor |
| Propósito | Pre-push, shift-left | Post-push, defense-in-depth |
| Herramientas | Trivy, tfsec, checkov, trufflehog, bandit, safety | Trivy |
Flujo de seguridad recomendado:
flowchart TB
subgraph Dev["1. Development"]
IDE["dart analyze<br/>eslint"]
end
subgraph CI["2. Pre-commit / CI"]
Scan["make dev-security-scan"]
Trivy["Trivy<br/>filesystem"]
Tfsec["tfsec<br/>Terraform"]
Checkov["checkov<br/>IaC"]
Trufflehog["trufflehog<br/>secrets"]
Bandit["bandit<br/>Python SAST"]
Safety["safety<br/>Python deps"]
Scan --> Trivy
Scan --> Tfsec
Scan --> Checkov
Scan --> Trufflehog
Scan --> Bandit
Scan --> Safety
end
subgraph Registry["3. Container Registry (Harbor)"]
Harbor["Harbor Trivy<br/>automatic on push"]
Block["Block critical<br/>vulnerabilities"]
Harbor --> Block
end
subgraph Runtime["4. Runtime (Production)"]
K8s["Kubernetes<br/>security policies"]
end
Dev --> CI
CI --> Registry
Registry --> Runtime
Beneficio: Vulnerabilidades detectadas en paso 2 nunca llegan al paso 3.
Comparación con Alternativas¶
| Feature | Harbor | GHCR | Docker Registry 2 |
|---|---|---|---|
| Costo | GRATIS | 500MB gratis | GRATIS |
| Docker Registry | ✅ | ✅ | ✅ |
| Helm Charts | ✅ | ❌ | ❌ |
| Vulnerability Scan | ✅ Trivy | ✅ Dependabot | ❌ |
| RBAC | ✅ | ✅ | ❌ |
| UI Web | ✅ | ✅ | ❌ |
| On-premise | ✅ | ❌ | ✅ |
Comandos Makefile¶
Troubleshooting¶
Error: x509: certificate signed by unknown authority¶
# Agregar certificado al trust store
sudo cp /etc/docker/certs.d/localhost:30003/ca.crt /usr/local/share/ca-certificates/harbor.crt
sudo update-ca-certificates
Error: connection refused¶
Verificar que Harbor esté corriendo: