Aller au contenu
Développement medium

Harbor : le registre d'images pour les équipes DevSecOps

20 min de lecture

Logo Harbor

Ce guide vous montre comment installer et utiliser Harbor pour stocker vos images conteneur, scanner automatiquement les vulnérabilités et éviter les problèmes de rate limiting Docker Hub. Vous apprendrez à déployer Harbor via Docker Compose, configurer le proxy-cache pour mettre en cache Docker Hub, et créer des comptes robot pour vos pipelines CI/CD. Prérequis : un serveur Linux avec Docker installé.

  • Installer Harbor en production avec HTTPS
  • Comprendre l’architecture et les fonctionnalités clés
  • Configurer le proxy-cache pour Docker Hub (éviter le rate limiting)
  • Créer des comptes robot pour vos pipelines CI/CD
  • Scanner automatiquement les images avec Trivy
  • Répliquer des images entre plusieurs registries

Harbor est un registre d’artefacts cloud-native open source, développé initialement par VMware et désormais projet CNCF graduated (le plus haut niveau de maturité). Pensez à Harbor comme un Docker Hub privé hébergé dans votre infrastructure, avec des fonctionnalités de sécurité intégrées.

Analogie : Si Docker Hub est comme un dépôt de photos public sur internet, Harbor est votre propre serveur de photos privé, où vous contrôlez qui peut voir et télécharger les images, et où un gardien (Trivy) vérifie que chaque photo ne contient pas de contenu dangereux.

Docker Hub, le registre public par défaut, pose plusieurs problèmes en entreprise :

ProblèmeImpactSolution Harbor
Rate limiting100 pulls/6h en anonyme, builds CI/CD bloquésProxy-cache : 1 pull externe → N pulls internes
DisponibilitéPannes Docker Hub = arrêt des déploiementsImages mises en cache localement
SécuritéPas de scan de vulnérabilités intégréTrivy scanne chaque push automatiquement
ConformitéImages stockées chez un tiers (USA)Données dans votre datacenter
CoûtPlans payants pour features avancéesOpen source, fonctionnalités complètes

Harbor ne se limite plus aux images Docker. Depuis la version 2.x, il stocke également :

Harbor est composé de plusieurs services qui communiquent entre eux. Comprendre cette architecture vous aidera à diagnostiquer les problèmes et à dimensionner correctement votre installation.

Architecture Harbor

Composants principaux :

ComposantRôlePourquoi c’est important
NGINXReverse proxy, terminaison TLSPoint d’entrée unique, gestion HTTPS
CoreAPI REST, authentification, autorisationCerveau de Harbor
RegistryStockage des images (Docker Distribution)Où vos images sont réellement stockées
TrivyScan de vulnérabilitésDétecte les CVE dans vos images
JobServiceTâches asynchrones (réplication, scan, GC)Travaux en arrière-plan
PostgreSQLBase de donnéesMétadonnées, utilisateurs, projets
RedisCache et sessionsPerformance et sessions utilisateurs

Harbor intègre Trivy comme scanner de vulnérabilités par défaut. Chaque image poussée peut être automatiquement scannée pour détecter les CVE connues.

Workflow de scan :

  1. Un développeur pousse une image
  2. Harbor déclenche automatiquement Trivy
  3. Trivy analyse chaque couche de l’image
  4. Les résultats sont attachés à l’image dans l’interface
  5. Si des vulnérabilités critiques sont détectées, le pull peut être bloqué

Harbor propose plusieurs méthodes d’authentification pour s’adapter à votre infrastructure :

  • Base de données locale : pour les petites équipes ou les labs
  • LDAP/Active Directory : intégration avec l’annuaire d’entreprise
  • OIDC (OpenID Connect) : SSO avec Keycloak, Azure AD, Okta, Google
  • Robot accounts : comptes techniques pour les pipelines CI/CD (voir section dédiée)

Harbor peut être installé de deux manières selon votre environnement :

MéthodeCas d’usageComplexité
Docker ComposeLab, petite équipe, serveur dédiéSimple
Helm sur KubernetesProduction, haute disponibilité, cloudMoyenne

Dans ce guide, nous couvrons les deux méthodes. Commencez par Docker Compose pour vous familiariser avec Harbor, puis passez à Helm pour la production.

Configuration matérielle et logicielle requise :

RessourceMinimum (lab)Recommandé (prod)Pourquoi
CPU2 cores4 coresTrivy consomme beaucoup lors des scans
RAM4 Go8 GoPostgreSQL + Trivy + Redis
Disque40 Go160 Go+Dépend du volume d’images stockées

Logiciels requis :

  • Docker Engine 20.10.10+
  • Docker Compose v2 (ou v1.18+)
  • OpenSSL (pour générer les certificats)

Ports réseau à ouvrir :

PortProtocoleUsage
443HTTPSPortail Harbor et API (défaut)
80HTTPRedirection vers HTTPS
4443HTTPSDocker Content Trust (optionnel)

Téléchargez l’installeur depuis le dépôt officiel GitHub. Deux options :

InstalleurTailleCas d’usage
Online~50 MoTélécharge les images depuis Docker Hub à l’installation
Offline~800 MoImages pré-incluses, pour environnements sans internet
  1. Télécharger l’archive

    Fenêtre de terminal
    cd /opt
    wget https://github.com/goharbor/harbor/releases/download/v2.14.2/harbor-offline-installer-v2.14.2.tgz
  2. Vérifier l’intégrité (optionnel mais recommandé)

    Fenêtre de terminal
    wget https://github.com/goharbor/harbor/releases/download/v2.14.2/harbor-offline-installer-v2.14.2.tgz.asc
    gpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 644FF454C0B4115C
    gpg -v --keyserver hkps://keyserver.ubuntu.com --verify harbor-offline-installer-v2.14.2.tgz.asc
  3. Extraire l’archive

    Fenêtre de terminal
    tar xzvf harbor-offline-installer-v2.14.2.tgz
    cd harbor

Le fichier harbor.yml contient toute la configuration de Harbor. Copiez le template et éditez-le :

Fenêtre de terminal
cp harbor.yml.tmpl harbor.yml
vi harbor.yml

Voici les paramètres essentiels à configurer :

# Nom d'hôte ou IP publique (jamais localhost en production)
hostname: registry.example.com
# Configuration HTTPS (obligatoire en production)
https:
port: 443
certificate: /opt/harbor/certs/server.crt
private_key: /opt/harbor/certs/server.key
# Mot de passe admin initial (changez-le !)
harbor_admin_password: VotreMotDePasseSecurise
# Répertoire de stockage des images
data_volume: /data
# Activer Trivy pour le scan de vulnérabilités
trivy:
ignore_unfixed: false # Inclure les CVE sans correctif
security_check: vuln,config,secret
skip_update: false # Mettre à jour la base de CVE

L’option --with-trivy active le scan de vulnérabilités :

Fenêtre de terminal
sudo ./install.sh --with-trivy

Le script vérifie les prérequis, génère les configurations et démarre les conteneurs. Une fois terminé :

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

Vous pouvez accéder à l’interface web d’Harbor via https://registry.example.com (ou l’URL configurée dans hostname).

Pour un déploiement sur Kubernetes en production, utilisez le chart Helm officiel. Cette méthode offre la haute disponibilité et une meilleure intégration avec l’écosystème cloud-native.

  1. Ajouter le dépôt Helm Harbor

    Fenêtre de terminal
    helm repo add harbor https://helm.goharbor.io
    helm repo update
  2. Créer un fichier de values personnalisé

    values-harbor.yaml
    expose:
    type: ingress
    ingress:
    hosts:
    core: harbor.example.com
    tls:
    enabled: true
    certSource: secret
    secret:
    secretName: harbor-tls
    externalURL: https://harbor.example.com
    persistence:
    enabled: true
    persistentVolumeClaim:
    registry:
    size: 100Gi
    trivy:
    enabled: true
    harborAdminPassword: "VotreMotDePasseSecurise"
  3. Installer Harbor

    Fenêtre de terminal
    helm install harbor harbor/harbor \
    --namespace harbor \
    --create-namespace \
    -f values-harbor.yaml
  4. Vérifier le déploiement

    Fenêtre de terminal
    kubectl -n harbor get pods

Consultez la documentation Helm Harbor pour les options avancées (HA multi-réplicas, stockage S3, PostgreSQL externe…).

Lors du premier accès à Harbor :

  1. Ouvrez https://harbor.example.com dans votre navigateur
  2. Connectez-vous avec admin / Harbor12345 (ou le mot de passe configuré)
  3. Changez immédiatement le mot de passe via Administration → Users

Harbor web interface

Cette section couvre les opérations courantes : pousser une image, la récupérer, et comprendre le scan de vulnérabilités.

Prenons un exemple concret : vous avez une application web simple à conteneuriser.

  1. Créer un projet dans Harbor

    Avant de pousser une image, créez un projet dans l’interface Harbor : Projects → New Project → “monprojet”. Un projet est comme un dossier qui regroupe des images liées (par application, par équipe, etc.).

  2. Créer votre Dockerfile

    FROM nginx:alpine
    COPY index.html /usr/share/nginx/html/
    EXPOSE 80
  3. Construire l’image

    Fenêtre de terminal
    docker build -t monserveurweb:0.1 .
  4. Taguer l’image pour Harbor

    Le format du tag est : <harbor-url>/<projet>/<image>:<version>

    Fenêtre de terminal
    docker tag monserveurweb:0.1 registry.example.com/monprojet/monserveurweb:0.1
  5. Se connecter à Harbor

    Fenêtre de terminal
    docker login registry.example.com
    # Entrez vos identifiants Harbor
  6. Pousser l’image

    Fenêtre de terminal
    docker push registry.example.com/monprojet/monserveurweb:0.1

Vérification : Dans l’interface Harbor, naviguez vers Projects → monprojet. Vous devriez voir votre image avec son tag 0.1.

Une fois l’image poussée, Harbor déclenche automatiquement un scan Trivy (si configuré). Dans l’interface :

  1. Cliquez sur l’image pour voir ses tags
  2. Cliquez sur un tag pour voir le détail
  3. L’onglet Vulnerabilities affiche les CVE détectées

Harbor trivy

Interpréter les résultats :

SévéritéSignificationAction recommandée
CriticalFaille exploitable à distance, impact majeurCorriger immédiatement
HighFaille sérieuseCorriger rapidement
MediumFaille modéréePlanifier la correction
LowFaille mineureCorriger quand possible

Le proxy-cache est l’une des fonctionnalités les plus utiles de Harbor. Il permet de mettre en cache les images de registries externes (Docker Hub, Quay, GCR…) pour :

  • Éviter le rate limiting Docker Hub (100 pulls/6h en anonyme)
  • Accélérer les pulls (images servies depuis votre réseau local)
  • Garantir la disponibilité même si Docker Hub est en panne

Fonctionnement du proxy-cache Harbor

Premier pull : Harbor récupère l’image depuis Docker Hub, la stocke localement, et la sert au client.

Pulls suivants : Harbor sert l’image depuis son cache local. Docker Hub n’est pas contacté (sauf pour vérifier les mises à jour).

  1. Créer un endpoint de registry

    Dans l’interface Harbor : Administration → Registries → New Endpoint

    ChampValeur
    ProviderDocker Hub
    Namedockerhub
    Endpoint URLhttps://hub.docker.com
    Access ID(optionnel, votre username Docker Hub)
    Access Secret(optionnel, votre token Docker Hub)

    Cliquez sur Test Connection pour vérifier, puis OK.

  2. Créer un projet proxy-cache

    Projects → New Project

    ChampValeur
    Project Namedockerhub-proxy
    Access LevelPublic (ou Private selon vos besoins)
    Proxy Cache✅ Activé
    Registrydockerhub (l’endpoint créé à l’étape 1)
  3. Utiliser le proxy-cache

    Au lieu de :

    Fenêtre de terminal
    docker pull nginx:latest

    Utilisez :

    Fenêtre de terminal
    docker pull registry.example.com/dockerhub-proxy/library/nginx:latest

    Pour les images non-officielles :

    Fenêtre de terminal
    docker pull registry.example.com/dockerhub-proxy/bitnami/redis:latest

Harbor supporte le proxy-cache pour de nombreux registries :

  • Docker Hub
  • Quay.io
  • GitHub Container Registry (ghcr.io)
  • AWS ECR
  • Azure ACR
  • Google Container Registry
  • JFrog Artifactory

Les robot accounts sont des comptes techniques conçus pour les pipelines CI/CD. Contrairement aux comptes utilisateurs, ils :

  • N’ont pas accès à l’interface web
  • Ont des permissions limitées (push/pull uniquement)
  • Peuvent être révoqués sans impacter les utilisateurs
  • Ont une durée de vie configurable
  1. Naviguer vers le projet

    Projects → votre-projet → Robot Accounts

  2. Créer le robot

    Cliquez sur New Robot Account :

    ChampValeur recommandée
    Nameci-pipeline
    Expiration365 jours (ou selon votre politique)
    PermissionsPush Artifact, Pull Artifact
  3. Sauvegarder les credentials

    Harbor affiche le token une seule fois. Copiez-le immédiatement et stockez-le dans votre gestionnaire de secrets (Vault, GitLab CI variables, GitHub Secrets…).

.gitlab-ci.yml
variables:
HARBOR_URL: registry.example.com
HARBOR_PROJECT: monprojet
build:
stage: build
script:
- docker login -u "${HARBOR_ROBOT_USER}" -p "${HARBOR_ROBOT_TOKEN}" ${HARBOR_URL}
- docker build -t ${HARBOR_URL}/${HARBOR_PROJECT}/myapp:${CI_COMMIT_SHA} .
- docker push ${HARBOR_URL}/${HARBOR_PROJECT}/myapp:${CI_COMMIT_SHA}

Les variables HARBOR_ROBOT_USER et HARBOR_ROBOT_TOKEN sont définies dans Settings → CI/CD → Variables (type “masked”).

La réplication permet de synchroniser des images entre plusieurs instances Harbor ou vers d’autres registries. Cas d’usage :

  • Multi-datacenter : répliquer les images vers un site de DR
  • Edge computing : pré-pousser les images vers des clusters edge
  • Migration : copier des images depuis un ancien registry
ModeDirectionCas d’usage
PushHarbor → ExternalDistribuer vers d’autres registries
PullExternal → HarborImporter depuis Docker Hub, GCR, etc.
  1. Créer l’endpoint de destination

    Administration → Registries → New Endpoint

    Configurez l’accès au registry de destination (Harbor distant, ECR, etc.).

  2. Créer une règle de réplication

    Administration → Replications → New Replication Rule

    ChampValeur
    Nameprod-datacenter-2
    Replication modePush-based
    Source resource filtermonprojet/**
    Destination registry(l’endpoint créé)
    Trigger modeEvent Based (à chaque push)
  3. Tester la réplication

    Poussez une image dans le projet source. Elle devrait apparaître dans le registry de destination après quelques secondes.

Les problèmes avec Harbor se manifestent généralement de deux façons : l’interface est inaccessible ou les opérations Docker échouent (login, push, pull). Voici les causes les plus fréquentes.

SymptômeCause probableSolution
Harbor ne démarre pasConteneur en erreurdocker compose ps puis logs du conteneur en échec
Erreur “port already in use”Port 443/80 déjà utiliséArrêter le service conflictuel ou changer le port
Interface inaccessibleHTTPS mal configuréVérifier les chemins des certificats dans harbor.yml
Erreur base de donnéesPostgreSQL corrompuVérifier les logs PostgreSQL dans /var/log/harbor/
SymptômeCause probableSolution
x509: certificate signed by unknown authorityCertificat auto-signé non trustéAjouter le CA au système (voir ci-dessous)
unauthorized: authentication requiredMauvais credentialsVérifier username/password, refaire docker login
denied: requested access to the resource is deniedPermissions insuffisantesVérifier les droits sur le projet Harbor
Timeout lors du pushRéseau ou firewallVérifier la connectivité sur le port 443

Si vous utilisez un certificat auto-signé (lab), vous devez l’ajouter au système :

Fenêtre de terminal
# Copier le certificat CA
sudo cp ca.crt /usr/local/share/ca-certificates/harbor-ca.crt
sudo update-ca-certificates
# Redémarrer Docker
sudo systemctl restart docker

Les logs Harbor sont stockés dans /var/log/harbor/ avec un fichier par composant :

Fenêtre de terminal
# Logs du composant core (API)
tail -f /var/log/harbor/core.log
# Logs du registry
tail -f /var/log/harbor/registry.log
# Logs Trivy (scanner)
tail -f /var/log/harbor/trivy-adapter.log

Pour les installations Helm, utilisez kubectl :

Fenêtre de terminal
kubectl -n harbor logs deployment/harbor-core -f
  • Harbor est un registre d’artefacts cloud-native qui stocke images Docker, Helm charts, SBOM et artefacts IA
  • Le proxy-cache résout le rate limiting Docker Hub : 1 pull externe → N pulls internes
  • Trivy scanne automatiquement les images pour détecter les CVE
  • Les robot accounts sont essentiels pour la CI/CD : credentials dédiés, révocables, avec permissions minimales
  • La réplication permet le multi-datacenter et la haute disponibilité
  • HTTPS est obligatoire en production ; Docker refuse les registries HTTP par défaut
  • Projet CNCF graduated = maturité et pérennité garanties

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.