Aller au contenu principal

Maîtrisez Harbor

Dans le monde de la gestion des images de conteneurs, Harbor se présente comme une solution incontournable. Ce registre de conteneurs open-source offre aux administrateurs systèmes une plateforme robuste et flexible pour le stockage, la distribution et la sécurisation des images de conteneurs. En tant qu'élément clé dans l'écosystème des conteneurs, Harbor facilite la gestion des images de conteneurs, un aspect important pour les processus de développement et de déploiement modernes.

Fonctionnalités d'Harbor

Harbor, en tant que registre de conteneurs, offre quelques fonctionnalités essentielles pour la gestion sécurisée et efficace des images de conteneurs. Ces fonctionnalités sont conçues pour répondre aux exigences des environnements DevOps, en mettant l'accent sur la sécurité, la performance et la flexibilité.

Gestion de la Sécurité et des Vulnérabilités : Une des principales forces de Harbor est sa capacité à scanner les images de conteneurs pour détecter des vulnérabilités de sécurité. Cette fonctionnalité permet aux administrateurs systèmes de s'assurer que les images stockées dans leur registre sont à jour et ne contiennent pas de failles de sécurité connues. Harbor utilise des bases de données de vulnérabilités régulièrement mises à jour pour effectuer ces analyses, fournissant ainsi une évaluation continue et fiable.

Contrôle d'Accès Basé sur les Rôles (RBAC) : Harbor intègre un système sophistiqué de gestion des droits d'accès, permettant de définir des politiques précises pour les utilisateurs et les groupes. Cette approche RBAC assure que seules les personnes autorisées peuvent accéder, modifier ou supprimer des images de conteneurs. Elle est essentielle pour maintenir l'intégrité et la sécurité des données dans des environnements multi-utilisateurs.

Réplication d'Images : Harbor supporte la réplication d'images entre plusieurs registres, facilitant ainsi la gestion de l'infrastructure à grande échelle. Cette fonction est particulièrement utile pour les entreprises qui opèrent dans plusieurs régions géographiques et qui doivent garantir la disponibilité et la performance en distribuant les images de conteneurs de manière efficace.

Intégration avec les Outils d'Orchestration de Conteneurs : Harbor fonctionne de manière transparente avec des outils d'orchestration de conteneurs tels que Kubernetes, ce qui permet aux utilisateurs de déployer et de gérer facilement des applications conteneurisées. Cette intégration est un aspect crucial dans les pipelines de CI/CD, où la rapidité et l'efficacité sont primordiales.

Support des Chartes Helm : En plus de la gestion des images de conteneurs, Harbor prend également en charge les chartes Helm, un outil largement utilisé pour le déploiement d'applications sur Kubernetes. Cette fonctionnalité rend Harbor encore plus polyvalent, en offrant une solution unique pour gérer à la fois les images de conteneurs et les applications Kubernetes.

Historique

Harbor a débuté comme un projet interne chez VMware, conçu pour répondre aux besoins spécifiques de gestion et de sécurité des images de conteneurs au sein de l'entreprise. À l'époque, les solutions existantes ne répondaient pas entièrement aux exigences de sécurité, de performance et de gestion à grande échelle. Harbor a été développé pour combler ce vide, offrant une plateforme robuste et sécurisée pour la gestion des images de conteneurs.

Au fil du temps, Harbor a gagné en popularité et en reconnaissance dans la communauté des développeurs et des administrateurs systèmes, principalement pour sa capacité à sécuriser efficacement les images de conteneurs. En réponse à cette demande croissante, VMware a décidé de rendre Harbor open source, permettant ainsi à une communauté plus large de contribuer au projet et de l'améliorer.

Ce passage à l'open source a marqué un tournant pour Harbor. Le projet a été adopté par la Cloud Native Computing Foundation (CNCF), un organisme qui soutient des projets clés dans l'écosystème des technologies cloud natives. L'inclusion d'Harbor dans le giron de la CNCF a renforcé sa crédibilité et sa visibilité, attirant encore plus de contributeurs et d'utilisateurs.

L'évolution d'Harbor a été marquée par plusieurs mises à jour majeures, qui ont introduit de nouvelles fonctionnalités et améliorations, telles que la gestion fine des accès, le scan des vulnérabilités, la réplication des images et la compatibilité avec d'autres outils et standards de l'écosystème cloud natif.

Aujourd'hui, Harbor est reconnu comme une solution de référence pour la gestion sécurisée des images de conteneurs. Son histoire témoigne de l'importance d'une communauté active et engagée dans le développement de solutions open source répondant aux besoins changeants des professionnels du DevOps et de la sécurité informatique.

Installation et Configuration de Base d'Harbor**

L'installation d'Harbor est la première étape essentielle pour les administrateurs systèmes souhaitant implémenter ce registre de conteneurs dans leur infrastructure. Avant de commencer, il est crucial de s'assurer que votre environnement répond aux prérequis nécessaires, notamment en termes de compatibilité système et de ressources disponibles.

Prérequis Système

Pour installer Harbor, vous aurez besoin d'un système d'exploitation Linux avec Docker installé. La version de Docker doit être compatible avec celle d'Harbor que vous prévoyez d'installer. De plus, il est recommandé d'avoir un système possédant au moins 2 Go de RAM et 40 Go d'espace disque disponible pour permettre une exécution fluide du registre.

Téléchargement et Installation

Comme d'habitude pour tester un produit, rien de mieux que d'utiliser vagrant :

# -*- mode: ruby -*-
# vi: set ft=ruby :


Vagrant.configure("2") do |config|
  config.vm.synced_folder '.', '/vagrant', disabled: true
  config.hostmanager.enabled = true
  config.hostmanager.manage_host = true

  config.vm.define "registry" do |server|
    server.vm.box = "generic/ubuntu2204"
    server.vm.provider :libvirt do |lv|
      lv.memory = 2048
      lv.cpus = 2
      lv.management_network_name = 'my_network'
      lv.management_network_address = '192.168.3.0/24'
    end
    server.vm.provision :shell, :inline => "apt update"
    server.vm.hostname = "registry.harbor.local"
  end
end

On lance la vm :

vagrant up
vagrant ssh

Allez, on installe docker :

sudo apt update
sudo apt install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker vagrant
exit

Ensuite, vous pouvez télécharger la dernière version d'Harbor depuis son répertoire officiel GitHub.

vagrant ssh
cd /tmp
wget https://github.com/goharbor/harbor/releases/download/v2.9.1/harbor-offline-installer-v2.9.1.tgz
tar xvfz harbor-offline-installer-v2.9.1.tgz
cd harbor

Après le téléchargement, décompressez le fichier et naviguez dans le répertoire décompressé. Harbor propose un script d'installation install.sh qui facilite le processus d'installation. Avant d'exécuter ce script, il est important de configurer le fichier harbor.yml pour définir les paramètres tels que le nom de domaine, les ports et de stockage.

mv harbor.yml.tmpl harbor.yml
vi harbor.yml

Ouvrez le fichier harbor.yml avec un éditeur de texte. Ici, changez hostname pour qu'il corresponde au nom de votre serveur. Commentez les lignes sur la partie des ports (pour le POC). Ce qui donne :

# Configuration file of Harbor

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: registry.harbor.local

# http related config
#http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  #port: 80

# https related config
#https:
  # https port for harbor, default is 443
  #port: 443
  # The path of cert and key files for nginx
  #certificate: /your/certificate/path
  #private_key: /your/private/key/path
...

Pour vérifier que tout est prêt, vous pouvez lancer la commande suivante :

sudo ./prepare --with-trivy
prepare base dir is set to /tmp/harbor
Unable to find image 'goharbor/prepare:v2.9.1' locally
v2.9.1: Pulling from goharbor/prepare
634892f30522: Pull complete
906becd729e4: Pull complete
e58f76f9e52a: Pull complete
e41fbb12868c: Pull complete
ad28d7943816: Pull complete
960887ca092b: Pull complete
fc61eb4dedb0: Pull complete
89a061d97c90: Pull complete
5bb6cb96862f: Pull complete
3145ed01c09c: Pull complete
Digest: sha256:ab50c4c9cfe6342da4605665df7657be744227dcce604a12804cb023a99f51d6
Status: Downloaded newer image for goharbor/prepare:v2.9.1
WARNING:root:WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https
Generated configuration file: /config/portal/nginx.conf
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/registryctl/config.yml
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
Generated and saved secret to file: /data/secret/keys/secretkey
Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir

Tout est prêt...

Lancement de l'Installation

Une fois que vous avez configuré harbor.yml selon vos besoins, lancez le script d'installation avec la commande ./install.sh. Ce script va récupérer toutes les images nécessaires : le serveur web NGINX, Redis...

sudo ./install.sh

[Step 0]: checking if docker is installed ...

Note: docker version: 24.0.7

[Step 1]: checking docker-compose is installed ...

Note: Docker Compose version v2.21.0

[Step 2]: loading Harbor images ...

Note: stopping existing Harbor instance ...

...

[Step 5]: starting Harbor ...
[+] Running 10/10
 ✔ Network harbor_harbor        Created                                                                                                                    0.9s
 ✔ Container harbor-log         Started                                                                                                                    0.2s
 ✔ Container redis              Started                                                                                                                    0.1s
 ✔ Container harbor-db          Started                                                                                                                    0.3s
 ✔ Container harbor-portal      Started                                                                                                                    0.3s
 ✔ Container registryctl        Started                                                                                                                    0.5s
 ✔ Container registry           Started                                                                                                                    0.5s
 ✔ Container harbor-core        Started                                                                                                                    0.1s
 ✔ Container nginx              Started                                                                                                                    0.1s
 ✔ Container harbor-jobservice  Started                                                                                                                    0.2s
✔ ----Harbor has been installed and started successfully.----
exit

Une fois l'installation terminée, vous pouvez accéder à l'interface web d'Harbor.

Premier Accès et Configuration Initiale

Lors du premier accès à Harbor, vous serez invité à vous connecter. Les identifiants par défaut sont souvent admin pour le nom d'utilisateur et Harbor12345 pour le mot de passe. Il est fortement recommandé de changer ces identifiants par défaut dès la première connexion pour des raisons de sécurité.

Dans les projets, créez le projet monprojet

Gestion des Images de Conteneurs avec Harbor

La gestion des images de conteneurs dans Harbor est un processus qui allie simplicité et sécurité. Pour illustrer cela, nous allons détailler l'intégration d'une image de conteneur simple, en commençant par la création de l'image avec un Dockerfile, puis son stockage dans Harbor.

Création d'une Image de Conteneur Simple

Dockerfile Basique: Commençons par créer un Dockerfile simple pour une application web basique. Voici un exemple de Dockerfile qui installe un serveur web Nginx.

# Utilisation d'une image de base Nginx
FROM nginx:alpine

# Copie d'un fichier HTML personnalisé dans le serveur web
COPY index.html /usr/share/nginx/html/

# Exposition du port 80
EXPOSE 80

index.html:

Créez un fichier index.html simple. Par exemple:

<!DOCTYPE html>
<html>
<head>
    <title>Bienvenue sur mon site web</title>
</head>
<body>
    <h1>Ceci est une page d'accueil servie par Nginx dans un conteneur Docker!</h1>
</body>
</html>

Construire et Taguer l'Image

  1. Construire l'Image: Ouvrez un terminal et naviguez vers le dossier contenant le Dockerfile et le fichier index.html. Exécutez la commande suivante pour construire l'image :

    docker build -t monserveurweb:0.1 .
    
  2. Taguer l'Image pour Harbor: Après la construction, taguez l'image pour votre registre Harbor.

    docker tag monserveurweb:0.1 registry.harbor.local/monprojet/monserveurweb:0.1
    

Pousser l'Image vers Harbor

  1. Connexion à Harbor: Connectez-vous à votre registre Harbor en utilisant Docker CLI.

     docker login registry.harbor.local                                                                                                                   10:38:18
     Username: admin
     Password:
     WARNING! Your password will be stored unencrypted in /home/bob/.docker/config.json.
     Configure a credential helper to remove this warning. See
     https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
     Login Succeeded
    

    Entrez vos identifiants Harbor lorsque vous y êtes invité.

  2. Pousser l'Image: Une fois connecté, poussez l'image vers Harbor.

    docker push registry.harbor.local/monprojet/monserveurweb:0.1
     The push refers to repository [registry.harbor.local/monprojet/monserveurweb]
     9bb0e6b909e4: Pushed
     a34b395c0ca3: Pushed
     5e728486380e: Pushed
     b968c967e155: Pushed
     92ef9174e989: Pushed
     28c7b3c0b176: Pushed
     fbed1f6990ee: Pushed
     dd731ddf52be: Pushed
     9fe9a137fd00: Pushed
     0.1: digest: sha256:aacd787ab58757a824fa0b50ccdf89a63a5ed159b33ecd2149bac089fd1d43f2 size: 2196
    

Gestion dans Harbor

Une fois l'image poussée vers Harbor :

  • Harbor Scanne l'Image pour des vulnérabilités.
  • Vous pouvez Voir l'Image dans le Projet spécifié dans Harbor, gérer les tags, voir les détails de l'image et examiner les résultats du scan de sécurité.
  • Déployer l'Image : Utilisez cette image dans vos environnements de développement ou de production en se référant à son tag dans Harbor.

Resultat du scan de l'image

Harbor et la CI/CD

L'intégration d'Harbor dans les pipelines de CI/CD (Continuous Integration/Continuous Deployment) joue un rôle important dans l'automatisation et la sécurisation des processus de déploiement des applications conteneurisées.

Intégration avec les Outils de CI/CD

Harbor peut être intégré avec divers outils de CI/CD tels que Jenkins, GitLab CI et Github Actions. Cette intégration permet d'automatiser le processus de construction, de test et de déploiement des images de conteneurs.

  • Automatisation du Pipeline: Dans un pipeline CI/CD, les images de conteneurs sont automatiquement construites et poussées vers Harbor à chaque commit dans le système de contrôle de version. Ceci assure que les images sont constamment mises à jour et prêtes pour le déploiement.
  • Scans de Sécurité Automatisés: Lorsqu'une image est poussée vers Harbor, elle peut être automatiquement scannée pour détecter des vulnérabilités, garantissant ainsi que seules les images sécurisées sont déployées dans les environnements de production.

Exemple de Workflow CI/CD avec Harbor

  1. Développement et Commit: Un développeur fait des modifications au code source et effectue un commit dans le système de contrôle de version.
  2. Déclenchement du Pipeline CI: Le commit déclenche le pipeline CI, où le code est construit et testé. Si les tests réussissent, une image de conteneur est construite.
  3. Push vers Harbor: La nouvelle image est poussée vers Harbor, où elle est stockée dans le registre de conteneurs.
  4. Scannage des Vulnérabilités: Harbor scanne automatiquement l'image pour des vulnérabilités. Si des problèmes sont détectés, ils sont signalés pour correction.
  5. Déploiement: Une fois l'image approuvée et sécurisée, elle est automatiquement déployée dans l'environnement de production ou de test, selon le pipeline.

Conclusion

En conclusion, Harbor représente bien plus qu'un simple registre de conteneurs ; c'est une plateforme complète qui améliore la sécurité, la fiabilité et l'efficacité des processus de déploiement des applications conteneurisées. Son adoption va vous permettre de relever les défis actuels en matière de sécurité des conteneurs.

Plus loin

Voici des liens utiles concernant Harbor :

  1. Site Officiel du Projet Harbor
  2. Documentation de Harbor
  3. Le Projet sur Github