Harbor : registry Docker prive avec scanning

Harbor : registry Docker prive avec scanning

Harbor est le registry conteneur open-source de la CNCF : stockage prive d'images Docker/OCI, scanning de vulnerabilites (Trivy), signing (Cosign), replication, RBAC. La solution professionnelle pour heberger vos images en interne.

Introduction

Harbor vous donne :

  • Registry Docker/OCI prive (vs Docker Hub public)
  • Scanning automatique des vulnerabilites (Trivy integre)
  • Image signing avec Cosign / Notary
  • Replication multi-sites
  • RBAC : utilisateurs, groupes, projets
  • Retention policies (auto-cleanup vieilles images)
  • Webhooks pour CI/CD
  • Helm charts hosting
  • Garbage collection

Alternative a : Docker Hub (cher), GitLab Registry, AWS ECR, Azure ACR.

Prerequis

  • VPS Linux Debian/Ubuntu (4 vCPU, 8 Go RAM, 200+ Go SSD)
  • Docker + Docker Compose
  • Nom de domaine
  • Certificat TLS (Let's Encrypt)

Etape 1 : Telecharger Harbor

cd /opt
sudo wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz
sudo tar xzf harbor-online-installer-v2.10.0.tgz
cd harbor

Etape 2 : Generer le certificat TLS

Via Let's Encrypt avec certbot DNS-01 :

sudo certbot certonly --manual --preferred-challenges=dns -d registry.votre-domaine.fr

Copiez les certs :

sudo mkdir -p /etc/harbor/certs
sudo cp /etc/letsencrypt/live/registry.votre-domaine.fr/fullchain.pem /etc/harbor/certs/
sudo cp /etc/letsencrypt/live/registry.votre-domaine.fr/privkey.pem /etc/harbor/certs/

Etape 3 : Configurer harbor.yml

sudo cp harbor.yml.tmpl harbor.yml
sudo nano harbor.yml
hostname: registry.votre-domaine.fr

http:
  port: 80

https:
  port: 443
  certificate: /etc/harbor/certs/fullchain.pem
  private_key: /etc/harbor/certs/privkey.pem

harbor_admin_password: pass-tres-fort

database:
  password: pass-db-fort
  max_idle_conns: 100
  max_open_conns: 900

data_volume: /data/harbor

trivy:
  ignore_unfixed: false
  skip_update: false
  insecure: false

log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor

Etape 4 : Installer

sudo ./install.sh --with-trivy

Compte 5-10 min. Le script telecharge les images, configure docker-compose et demarre la stack.

A la fin :

✔ ----Harbor has been installed and started successfully.----

Etape 5 : Premier acces

Visitez https://registry.votre-domaine.fr. Login : admin + le mot de passe configure.

Etape 6 : Creer un projet

Projects > New project.

Nom : monequipe. Access level : Private (necessite auth pour pull).

Clic sur le projet pour l'explorer.

Etape 7 : Push une image

Sur votre machine :

docker login registry.votre-domaine.fr

Username admin, password votre password.

Tag et push :

docker pull alpine:latest
docker tag alpine:latest registry.votre-domaine.fr/monequipe/alpine:latest
docker push registry.votre-domaine.fr/monequipe/alpine:latest

Verifiez dans Harbor UI : votre image apparait sous monequipe.

Etape 8 : Scan de vulnerabilites

Cliquez sur l'image dans Harbor > Scan. Trivy scanne et liste les CVE :

| Severity | CVE       | Package  | Fixed Version |
| HIGH     | CVE-2023-...| openssl | 3.1.4-r1 |
| MEDIUM   | CVE-2023-...| musl    | 1.2.4_git-r2 |

Pour scanner automatiquement chaque push :

Project > Configuration > Vulnerability scanning > Automatically scan images on push.

Etape 9 : Retention policies

Project > Policy > Tag Retention. Exemple :

  • Garder les 10 dernieres versions par tag
  • Sauf les tags latest, stable, release-*

Run le scheduler tous les jours a 2h :

Project > Policy > Tag Retention > Schedule > Custom : 0 2 * * *.

Etape 10 : Replication

Pour repliquer vers un autre Harbor / Docker Hub / ECR :

Administration > Registries > New endpoint. Configurez la cible.

Administration > Replications > New rule. Choisissez source > destination.

Par exemple : replique tous les release-* vers AWS ECR pour disaster recovery.

Etape 11 : Robot accounts pour CI/CD

Pour eviter d'utiliser admin dans vos pipelines :

Project > Robot Accounts > New robot account.

Nom : ci-bot. Permissions : push + pull. Token genere, copiez-le.

Dans votre CI :

echo "$TOKEN" | docker login registry.votre-domaine.fr -u 'robot$monequipe+ci-bot' --password-stdin
docker build -t registry.votre-domaine.fr/monequipe/monapp:$VERSION .
docker push registry.votre-domaine.fr/monequipe/monapp:$VERSION

Etape 12 : Garbage collection

Harbor garde des layers orphelins quand vous deletez des images. GC nettoie :

Administration > Garbage Collection > Schedule. Exemple : tous les dimanches a 3h.

Lancez manuellement la premiere fois :

Administration > Garbage Collection > GC NOW.

⚠️ GC bloque les pushes pendant son execution.

Depannage

"x509: certificate signed by unknown authority"

Le client Docker ne fait pas confiance au cert. Pour Let's Encrypt c'est OK. Pour cert auto-signe :

Sur le client :

sudo mkdir -p /etc/docker/certs.d/registry.votre-domaine.fr
sudo cp ca.crt /etc/docker/certs.d/registry.votre-domaine.fr/
sudo systemctl restart docker

"denied: requested access to the resource is denied"

Verifiez :

  • Project visibility (Public vs Private)
  • Utilisateur dans le project members
  • Robot token toujours valide

Disque qui se remplit

Trop d'images. Configurez retention policies + GC. Verifiez :

sudo du -sh /data/harbor/registry

Harbor down / lent

cd /opt/harbor
sudo docker compose ps
sudo docker compose logs -f core
sudo docker compose logs -f registry

Souvent : Postgres ou Redis a court de ressources. Augmentez RAM ou tunez.

Trivy scan timeout

Augmentez le timeout dans harbor.yml :

trivy:
  timeout: 30m

Reinstallez :

sudo docker compose down
sudo ./install.sh --with-trivy

Commandes utiles

# Status stack
cd /opt/harbor
sudo docker compose ps

# Logs
sudo docker compose logs -f
sudo docker compose logs -f core
sudo docker compose logs -f registry

# Restart
sudo docker compose restart

# Stop / Start
sudo docker compose down
sudo docker compose up -d

# Update Harbor (sauvegardez avant !)
sudo docker compose down
sudo cp -r /opt/harbor /opt/harbor.bak
# Telecharger nouvelle version, copier harbor.yml, ./install.sh

# Backup base + config
sudo docker compose exec postgresql pg_dump -U postgres registry | gzip > harbor-db-$(date +%F).sql.gz
sudo tar czf harbor-data-$(date +%F).tar.gz /data/harbor

# Tester un pull/push
docker login registry.votre-domaine.fr
docker pull registry.votre-domaine.fr/library/alpine:latest

Conclusion

Harbor est la solution serieuse pour heberger vos images en interne :

  • Securite : scan + signing + RBAC
  • Productivite : webhooks, retention, replication
  • Compatibilite : Docker, OCI, Helm charts

Pour aller plus loin :

  • Activez Cosign signing pour la supply chain security
  • Combinez avec Falco pour la runtime security
  • Pour les gros clusters K8s, configurez la replication vers une registry edge proche des nodes

Ressources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members