Architecture de référence Harbor¶
Vue d'ensemble des composants¶
Harbor est compose de plusieurs services qui s'appuient sur un registre OCI (Distribution) en backend.
graph TD
LB["Load Balancer<br/>(Traefik / Nginx)"] -->|:443| Core["Harbor Core<br/>(API, UI, Auth)"]
Core --> Registry["Registry<br/>(Distribution)"]
Core --> Jobs["Job Service<br/>(GC, Replic.)"]
Core --> Trivy["Trivy Adapter<br/>(Scan vuln.)"]
Registry --> S3["Object Store<br/>(S3/MinIO)"]
Jobs --> PG["PostgreSQL<br/>(metadata)"]
PG --> Redis["Redis<br/>(cache/queue)"] Detail des composants¶
Harbor Core¶
Le composant central qui expose l'API REST et l'interface web.
| Fonction | Description |
|---|---|
| API v2.0 | Gestion des projets, artefacts, utilisateurs, robots |
| Authentification | OIDC, LDAP, base locale, robot tokens |
| Autorisation | RBAC par projet et rôle |
| UI Web | Interface de gestion complète |
| Webhook | Notifications sur push, scan, réplication |
| Content trust | Vérification des signatures Cosign/Notation |
Registry (Distribution)¶
Le registre OCI sous-jacent qui stocke les blobs (layers) et les manifests.
- Reçoit les push/pull via l'API Docker Registry v2 / OCI Distribution
- Stocke les blobs dans le backend de stockage configure (filesystem, S3, MinIO)
- Harbor Core intercepte les requêtes pour appliquer l'authentification et le RBAC
Trivy Adapter¶
Scanner de vulnerabilites integre qui analyse les images apres chaque push.
graph LR
Push["Image poussee"] --> Core["Harbor Core"] --> Trivy["Trivy Adapter"] --> CVE["Base CVE<br/>(NVD, GitHub Advisory)"]
Trivy --> Rapport["Rapport CVE<br/>stocke dans PostgreSQL"]
Rapport --> Policy["Politique :<br/>bloquer si Critical/High"] | Configuration | Valeur recommandee |
|---|---|
| Scan automatique | À chaque push |
| Base de vulnerabilites | Mise à jour quotidienne |
| Politique de blocage | Critical et High bloques |
| Timeout de scan | 300 secondes |
Job Service¶
Service de tâches asynchrones :
- Garbage collection : nettoyage des blobs orphelins
- Réplication : synchronisation vers/depuis d'autres registres
- Scan : orchestration des scans de vulnerabilites en lot
- Retention : application des regles de retention des tags
Redis¶
Cache et file de messages :
- Cache des sessions utilisateur et des tokens
- File d'attente pour les jobs asynchrones (scan, réplication, GC)
- Cache des résultats de scan recents
PostgreSQL¶
Base de données relationnelle stockant toutes les metadonnees :
| Donnée | Table/Schema |
|---|---|
| Projets | project |
| Artefacts (manifests) | artifact |
| Tags | tag |
| Résultats de scan | vulnerability_record |
| Robots accounts | robot |
| Regles de réplication | replication_policy |
| Audit log | audit_log |
| Utilisateurs et rôles | harbor_user, role |
PostgreSQL externe obligatoire en production
Le PostgreSQL embarque dans Harbor est destine aux tests uniquement. En production, utiliser une instance PostgreSQL externe avec réplication et backups.
Object Storage (S3/MinIO)¶
Stockage des blobs (layers d'images, charts Helm, artefacts OCI).
| Option | Usage |
|---|---|
| MinIO | Object storage on-premise, S3-compatible |
| S3 AWS | Cloud AWS |
| GCS | Cloud GCP |
| Azure Blob | Cloud Azure |
| Filesystem | Tests uniquement (pas de HA) |
Modèle de projets¶
Harbor organise les artefacts en projets. Chaque projet est un namespace isole avec son propre RBAC, ses quotas et ses politiques.
Structure recommandee¶
harbor.example.com/
├── library/ # Images de base validees (public interne)
│ ├── debian:bookworm-slim
│ ├── python:3.12-slim
│ └── node:22-alpine
├── infra/ # Images d'infrastructure
│ ├── traefik:v3.1
│ ├── postgres:16
│ └── redis:7
├── app-frontend/ # Application frontend (equipe frontend)
│ ├── webapp:v2.1.0
│ └── webapp:sha-a1b2c3d
├── app-backend/ # Application backend (equipe backend)
│ ├── api:v3.0.1
│ └── worker:v3.0.1
├── charts/ # Charts Helm
│ ├── webapp-chart:1.0.0
│ └── api-chart:2.1.0
└── mirror/ # Miroir d'images publiques
├── docker.io/library/nginx:1.27
└── quay.io/prometheus/prometheus:v2.53
Configuration de projet¶
| Parametre | Projet library | Projet app-* | Projet mirror |
|---|---|---|---|
| Visibilité | Public (interne) | Prive | Public (interne) |
| Scan automatique | Oui | Oui | Oui |
| Bloquer vulnerabilites | Critical | Critical + High | Critical |
| Tag immutability | Oui | Oui | Oui |
| Quota stockage | 50 Go | 20 Go | 100 Go |
| Réplication | Push vers DR | Push vers DR | Pull depuis publics |
Robot accounts¶
Les robot accounts remplacent les credentials humains pour l'automatisation (CI/CD, Kubernetes).
Types de robots¶
| Robot | Scope | Permissions | Usage |
|---|---|---|---|
robot-ci-push | Projet app-backend | Push, Pull | CI/CD pousse les images |
robot-k8s-pull | Projets app-*, library | Pull uniquement | Kubernetes tire les images |
robot-scanner | Tous les projets | Pull, Scan | Scanner externe |
robot-replicator | Projet mirror | Pull, Push, Réplication | Réplication depuis publics |
Creation d'un robot account¶
# Via l'API Harbor
curl -X POST https://harbor.example.com/api/v2.0/robots \
-H "Content-Type: application/json" \
-u admin:Harbor12345 \
-d '{
"name": "robot-ci-push",
"description": "CI/CD push for app-backend",
"duration": -1,
"level": "project",
"permissions": [
{
"namespace": "app-backend",
"kind": "project",
"access": [
{"resource": "repository", "action": "push"},
{"resource": "repository", "action": "pull"},
{"resource": "tag", "action": "create"}
]
}
]
}'
Rotation des tokens robot
Les tokens robot doivent etre renouveles régulièrement. Utiliser duration pour définir une expiration automatique et automatiser le renouvellement via Vault ou le pipeline CI/CD.
Regles de réplication¶
Configuration type¶
| Regle | Mode | Source | Destination | Filtre | Déclencheur |
|---|---|---|---|---|---|
| DR cross-site | Push | harbor.example.com | harbor-dr.example.com | ** | À chaque push |
| Miroir Docker Hub | Pull | docker.io | harbor.example.com | library/** | Planifie (6h) |
| Miroir Quay | Pull | quay.io | harbor.example.com | prometheus/** | Planifie (6h) |
| Edge sync | Push | harbor.example.com | harbor-edge.local | label=edge | À chaque push |
Topologie de réplication¶
graph TD
Internet["Internet<br/>Docker Hub, Quay.io"] -->|Pull planifie| Principal["Harbor principal<br/>harbor.example.com"]
Principal -->|Push chaque push| DR["Harbor DR<br/>(passif)"]
Principal -->|Push chaque push<br/>label=edge| Edge["Harbor Edge<br/>(air-gapped)"] Guide de sizing¶
Dimensionnement par profil¶
| Profil | Équipes | Images | Stockage | Harbor Core | PostgreSQL | Redis | MinIO |
|---|---|---|---|---|---|---|---|
| Small (lab) | 1-5 | < 500 | 50 Go | 1 CPU, 1 Go | 1 CPU, 1 Go | 256 Mo | 2 CPU, 2 Go |
| Medium (PME) | 5-20 | 500-5000 | 500 Go | 2 CPU, 2 Go | 2 CPU, 4 Go | 512 Mo | 4 CPU, 4 Go |
| Large (DSI) | 20+ | 5000+ | 2+ To | 4 CPU, 4 Go | 4 CPU, 8 Go | 1 Go | Cluster MinIO |
Facteurs de croissance¶
Le stockage croit en fonction de :
- Nombre de builds CI/CD par jour : chaque push ajoute des layers
- Taille des images : images Go (~50 Mo) vs images Java (~300 Mo) vs images ML (~2 Go)
- Retention des tags : combien de versions sont conservees
- Deduplication : les layers partages entre images sont stockes une seule fois
Estimer le stockage
Formule approximative :
Exemple : 50 images × 200 Mo × 0.4 (60% dedup) × 10 versions = 40 Go
Haute disponibilité¶
Pour un déploiement HA :
| Composant | Replicas | Notes |
|---|---|---|
| Harbor Core | 2+ | Stateless, derriere un load balancer |
| Registry | 2+ | Stateless si stockage S3/MinIO |
| Job Service | 1 | Un seul actif (leader election) |
| Trivy Adapter | 2+ | Stateless, scale horizontalement |
| PostgreSQL | 2+ | Primary + replica(s), failover automatique |
| Redis | 3 | Sentinel ou cluster pour la HA |
| MinIO | 4+ | Cluster distribue pour la redondance |