Table des matières

Introduction

Harbor est une solution de registry Docker d’entreprise et Open Source de VMware.

C’est un serveur permettant de stocker « on premise » ou dans le cloud des images Docker, au même titre que le produit historiquement appelé Docker Registry (maintenant Docker Distribution), mais avec des fonctionnalités supplémentaires, notamment :

Par rapport à Docker Distribution, Harbor offre de meilleures performances et une meilleure sécurité.

Harbor résout les problèmes communs en instaurant la confiance, la conformité, les performances et l'interopérabilité. Il comble une lacune pour les organisations et les applications qui ne peuvent pas utiliser un registre public ou basé sur un nuage, ou qui souhaitent une expérience cohérente dans le cloud.

Harbor est déployé en tant que conteneurs Docker. Par conséquent, les distributions Linux prenant en charge Docker sont obligatoires. Harbor ne limite pas son installation à un système d'exploitation spécifique. Vous pouvez utiliser n'importe quel système d'exploitation de votre choix. toutefois, les étapes d'installation varient en fonction du choix du système d'exploitation.

Harbor est hébergé par la Cloud Native Computing Foundation (CNCF).

Caractéristiques

Installation Harbor.io

Harbor peut être installé de deux manières différentes:

Tous les installateurs peuvent être téléchargés à partir de la page officielle.

Ce guide décrit les étapes à suivre pour installer et configurer Harbor à l’aide du programme d’installation en ligne ou hors ligne. Les processus d'installation sont presque les mêmes.

Si vous exécutez une version précédente de Harbor, vous devrez peut-être mettre à jour le fichier “harbor.cfg” et migrer les données pour les adapter au nouveau schéma de base de données. Pour plus de détails, veuillez vous reporter au Guide de migration de Harbor.

De plus, les instructions de déploiement sur Kubernetes ont été créées par la communauté. Reportez-vous à la documentation “Harbor on Kubernetes” pour plus de détails.

Prérequis pour l'hôte cible

Harbor est déployé sous la forme de plusieurs conteneurs Docker et peut donc être déployé sur toute distribution Linux prenant en charge Docker. L’hôte cible requiert l’installation de Python, Docker et Docker Compose.

Hardware

Resource Capacity Description
CPU minimum 2 CPU 4 CPU préféré
Mem minimum 4GB 8GB préféré
Disk minimum 40GB 160GB préféré

Software

Software Version Description
Python version 2.7 ou + Notez que vous devrez peut-être installer Python sur des distributions Linux (Gentoo, Arch) qui ne sont pas fournies avec un interpréteur Python installé par défaut.
Docker engine version 1.10 ou + Pour les instructions d'installation, veuillez vous référer à: https://docs.docker.com/engine/installation
Docker Compose version 1.6.0 ou + Pour les instructions d'installation, veuillez vous référer à: https://docs.docker.com/compose/install/
Openssl Dernière version Générer un certificat et des clés pour Harbor

Network ports

Port Protocol Description
443 HTTPS Le portail Harbor et l'API principale accepteront les requêtes sur ce port pour le protocole https
4443 HTTPS Connexions au service Docker Content Trust pour Harbor, nécessaires uniquement lorsque le notaire est activé
80 HTTP Le portail Harbor et l'API principale accepteront les requêtes sur ce port pour le protocole http

Packages - CentOS

Nous allons installer les packages suivants :

[root@registry ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

Nous allons déployer en plus les packages ci-dessous.

[root@registry ~]# yum install wget nano epel-release yum-utils 

On ajoute le repository et on installe docker.

[root@registry ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
 
[root@registry ~]# yum install docker-ce
 
[root@registry ~]# systemctl start docker
 
[root@registry ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
 
[root@registry ~]# curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
 
[root@registry ~]# chmod +x /usr/local/bin/docker-compose
 
[root@registry ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Nous créerons un utilisateur “admdock” qui sera membre du groupe docker. Cela nous évitera de travailler avec “root”.

[root@registry ~]# useradd admdock
 
[root@registry ~]# passwd admdock
Changement de mot de passe pour l'utilisateur admdock.
Nouveau mot de passe : 
MOT DE PASSE INCORRECT : Le mot de passe comporte moins de 8 caractères
Retapez le nouveau mot de passe : 
passwd : mise à jour réussie de tous les jetons d'authentification.
 
[root@registry ~]# usermod -a -G docker admdock
 
[root@registry ~]# visudo -f /etc/sudoers.d/harbor
admdock ALL=(ALL) NOPASSWD: ALL
 
[root@registry ~]# su - admdock
 
[admdock@registry ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete 
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
 
Hello from Docker!
This message shows that your installation appears to be working correctly.
 
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
 
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
 
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Packages - Debian

Nous allons installer les packages suivants :

[root@registry ~]# apt update
[root@registry ~]# apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
[root@registry ~]# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

On ajoute le repository et on installe docker.

[root@registry ~]# add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
 
[root@registry ~]# apt update
[root@registry ~]# apt -y install docker-ce docker-ce-cli containerd.io
[root@registry ~]# apt -y install docker-compose

Nous créerons un utilisateur “admdock” qui sera membre du groupe docker. Cela nous évitera de travailler avec “root”.

[root@registry ~]# useradd admdock
 
[root@registry ~]# passwd admdock
Changement de mot de passe pour l'utilisateur admdock.
Nouveau mot de passe : 
MOT DE PASSE INCORRECT : Le mot de passe comporte moins de 8 caractères
Retapez le nouveau mot de passe : 
passwd : mise à jour réussie de tous les jetons d'authentification.
 
[root@registry ~]# usermod -aG docker admdock
 
[root@registry ~]# visudo -f /etc/sudoers.d/harbor
admdock ALL=(ALL) NOPASSWD: ALL
 
[root@registry ~]# su - admdock
 
[admdock@registry ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete 
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
 
Hello from Docker!
This message shows that your installation appears to be working correctly.
 
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
 
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
 
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Installation Harbor

Maintenant que Docker est opérationnel sur notre serveur, nous allons procéder au déploiement d'harbor.

On passe en tant que “admdock” pour télécharger les sources d'harbor.

[root@registry ~]# su - admdock
 
[admdock@registry ~]# curl -s https://api.github.com/repos/goharbor/harbor/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep '\.tgz$' | wget -i -
 
[admdock@registry ~]# tar xvzf harbor-offline-installer-v1.10.6.tgz

Maintenant, nous allons préparer nos certificats.

[admdock@registry ~]# mkdir cert && cd cert
 
[admdock@registry ~]# openssl req -sha256 -x509 -days 365 -nodes -newkey rsa:4096 -keyout registry.oowy.lan.key -out registry.oowy.lan.crt
Generating a 4096 bit RSA private key
............................++
.....................................................................................++
writing new private key to 'registry.oowy.lan.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:ESSONNE
Locality Name (eg, city) [Default City]:EVRY
Organization Name (eg, company) [Default Company Ltd]:oowy
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:registry.oowy.lan
Email Address []:security@oowy.lan

Arriver à cette étape, nous avons les sources d'harbor ainsi que nos certificats de disponible. Il nous reste plus qu'à configurer le fichier “harbor.yml” avant de lancer l'installation.

Note:

Depuis la version 1.8 d'harbor, le fichier de configuration n'est plus au format 'ini' mais passe au format 'yml'

[admdock@registry ~]# cd ../harbor/
 
[admdock@registry ~]# nano harbor.yml
# 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.oowy.lan
 
# 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: /home/admdock/cert/registry.oowy.lan.crt
  private_key: /home/admdock/cert/registry.oowy.lan.key

Harbor a intégré Notary et Clair (pour le scan de vulnérabilité). Cependant, l'installation par défaut n'inclut pas les services Notary ou Clair.

Note:

Pour installer le service Harbor avec Notary, ajoutez un paramètre lorsque vous exécutez install.sh:     

$ sudo ./install.sh --with-notary

Remarque: pour l'installation avec Notary, le paramètre “ui_url_protocol” doit être défini sur “https”.

Note:

Pour installer le service Harbor avec Clair, ajoutez un paramètre lorsque vous exécutez install.sh:     

$ sudo ./install.sh --with-clair

Note:

Pour installer Harbor avec le service chartmuseum, ajoutez un paramètre lorsque vous exécutez install.sh:     

$ sudo ./install.sh --with-chartmuseum

Note:

Remarque: Si vous souhaitez installer le service Notary, Clair et chartmuseum, vous devez spécifier tous les paramètres dans la même commande:     

$ sudo ./install.sh --with-notary --with-clair --with-chartmuseum

On lance l'installation par défaut avec l'installer fournis dans le “tar.gz”

"harbor_harbor" with the default driver
Creating network "harbor_harbor-clair" with the default driver
Creating network "harbor_harbor-notary" with the default driver
Creating network "harbor_harbor-chartmuseum" with the default driver
Creating network "harbor_notary-sig" with the default driver
Creating harbor-log ... done
Creating harbor-db     ... done
Creating harbor-portal ... done
Creating registry      ... done
Creating registryctl   ... done
Creating redis         ... done
Creating chartmuseum   ... done
Creating clair         ... done
Creating notary-signer     ... done
Creating harbor-core   ... done
Creating clair-adapter     ... done
Creating harbor-jobservice ... done
Creating nginx             ... done
Creating notary-server     ... done
 
✔ ----Harbor has been installed and started successfully.----

Administration Harbor

Accès à la plateforme

Se connecter sur l'interface : https://registry.oowy.lan avec les accès suivants :

Login : admin
Pass  : Harbor12345

Arrêt / Relance Harbor

Arrêter Harbor.

[admdock@registry harbor]$ sudo docker-compose stop
Stopping nginx              ... done
Stopping harbor-portal      ... done
Stopping harbor-jobservice  ... done
Stopping harbor-core        ... done
Stopping registry           ... done
Stopping redis              ... done
Stopping registryctl        ... done
Stopping harbor-db          ... done
Stopping harbor-log         ... done

Relancer Harbor.

[admdock@registry harbor]$ sudo docker-compose start
Starting log         ... done
Starting registry    ... done
Starting registryctl ... done
Starting postgresql  ... done
Starting core        ... done
Starting portal      ... done
Starting redis       ... done
Starting jobservice  ... done
Starting proxy       ... done

Update config

Pour modifier la configuration de Harbor, arrêtez d'abord l'instance Harbor existante et mettez à jour “harbor.yml”. Ensuite, exécutez le script “prepare” pour renseigner la configuration.

Enfin, recréez et démarrez l'instance de Harbor:

[admdock@registry harbor]$ sudo docker-compose down -v
[admdock@registry harbor]$ vim harbor.yml
[admdock@registry harbor]$ sudo prepare
[admdock@registry harbor]$ sudo docker-compose up -d

Suppression data

Suppression des conteneurs de Harbor tout en conservant les données d'image et les fichiers de base de données de Harbor dans le système de fichiers :

[admdock@registry harbor]$ sudo docker-compose down -v

Suppression de la base de données et des données de Harbor (pour une réinstallation propre):

[admdock@registry harbor]$ rm -r /data/database
[admdock@registry harbor]$ rm -r /data/registry

Gestion de la plateforme

Après avoir installé le serveur de registre Harbor, la prochaine action est probablement la bonne gestion des utilisateurs. La méthode d'authentification utilisateur standard dans la plupart des entreprises est LDAP/AD. Il n'est pas justifié de gérer une base de données utilisateur distincte pour l'authentification Harbor si vous utilisez un serveur LDAP.

Nous allons donc configurer le backend LDAP comme base de données pour l'authentification des utilisateurs.

Les pré-requis pour cette configuration sont:

Authentification FreeIPA

Création d'un compte de service

Accédez à votre serveur LDAP et créez un compte qui sera utilisé par Harbor pour se lier au serveur.

Configurer LDAP sur Harbor

Accédez maintenant au tableau de bord d'administration de Harbor et accédez à Administration > Configuration > Authentification

Modifiez vos paramètres comme ci-dessous :

Auth Mode: LDAP
LDAP URL: ldap.example.com
LDAP Search DN: uid=service,cn=users,cn=accounts,dc=example,dc=com
LDAP Search Password: LDAP-Bind-User-Password
LDAP Base DN: cn=users,cn=accounts,dc=example,dc=com
LDAP UID: uid
Auth Mode: Set authentication mode to LDAP
LDAP URL: LDAP Server URL
LDAP Search DN: DN for user with permissions to search LDAP server.
LDAP Search Password: Search user password
LDAP Base DN: The base DN from which to lookup a user
LDAP UID: Attribute used in a search to match a user

Une fois terminé, cliquez sur le bouton «TESTER LE SERVEUR LDAP» pour valider les paramètres.

Authentification AD

Accédez à votre serveur Active Directory et créez un compte qui sera utilisé par Harbor pour se lier au serveur.

Configurer AD sur Harbor

Accédez maintenant au tableau de bord d'administration de Harbor et accédez à Administration > Configuration > Authentification

Modifiez vos paramètres comme ci-dessous :

Auth Mode: LDAP
LDAP URL: ldap.example.com
LDAP Search DN: <Service_Account>@<DOMAIN>
LDAP Search Password: LDAP-Bind-User-Password
LDAP Base DN: dc=example,dc=com
LDAP UID: sAMAccountName
Auth Mode: Set authentication mode to LDAP
LDAP URL: LDAP Server URL
LDAP Search DN: DN for user with permissions to search LDAP server.
LDAP Search Password: Search user password
LDAP Base DN: The base DN from which to lookup a user
LDAP UID: Attribute used in a search to match a user

Test de connexion FreeIPA/AD

Testez la connexion sur le portail Web Harbor pour confirmer que les utilisateurs sur LDAP peuvent accéder au service.

Saisissez le nom d'utilisateur et le mot de passe LDAP pour accéder au tableau de bord Harbor.

Vous devez vous authentifier pour accéder à la registre Harbor en CLI.

$ docker login registry.example.com
Authenticating with existing credentials...
Existing credentials are invalid, please enter valid username and password
Username: USER_LDAP
Password: <LDAPPassword>
Login Succeeded!

Push image

Pull image

Role Based Access Control (RBAC)

Harbor gère les images à travers des projets. Les utilisateurs peuvent être ajoutés à un projet en tant que membre avec l'un des différents rôles suivants:

Outre les rôles ci-dessus, il existe deux rôles au niveau du système:

Gérer des projets

Un projet dans Harbor contient tous les référentiels d'une application. Aucune image ne peut être envoyée à Harbor avant la création du projet. La RBAC s'applique à un projet.

Il existe deux types de projets à Harbor:

Vous pouvez créer un projet après vous être connecté. Cochez la case “Access Level” pour rendre ce projet public.

une fois le projet créé, vous pouvez parcourir les Repositories, Membres, Logs, Réplication et la Configuration à l'aide de l'onglet de navigation.

Il existe deux vues pour afficher les Repositories, en mode liste ou carte, vous pouvez basculer entre eux en cliquant sur l'icône correspondante.

Les propriétés du projet peuvent être modifiées en cliquant sur “Configuration”.

Update de la plateforme

Dans la procédure suivante, nous allons mettre à jour notre registry à jour de la version 1.9.3 vers la version 1.9.4.

Connectez-vous à l'hôte sur lequel Harbor s'exécute, arrêtez et supprimez l'instance Harbor si elle est toujours en cours d'exécution:

[admdock@registry ]$ cd harbor
[admdock@registry harbor]$ sudo docker-compose down -v
Stopping harbor-jobservice ... done
Stopping nginx             ... done
Stopping harbor-core       ... done
Stopping registryctl       ... done
Stopping registry          ... done
Stopping harbor-db         ... done
Stopping harbor-portal     ... done
Stopping redis             ... done
Stopping harbor-log        ... done
Removing harbor-jobservice ... done
Removing nginx             ... done
Removing harbor-core       ... done
Removing registryctl       ... done
Removing registry          ... done
Removing harbor-db         ... done
Removing harbor-portal     ... done
Removing redis             ... done
Removing harbor-log        ... done
Removing network harbor_harbor

Sauvegardez les fichiers actuels de Harbor afin de pouvoir revenir à la version actuelle si nécessaire.

[admdock@registry ]$ mv harbour /my_backup_dir/harbour

Sauvegarder la base de données (par défaut dans le répertoire /data/database)

[admdock@registry ]$ cp -r /data/database/my_backup_dir/

Récupérer la dernière version du package Harbor de Github: https://github.com/goharbor/harbor/releases

Avant de mettre à niveau Harbor, effectuez d'abord la migration. L'outil de migration est fourni sous forme d'image docker.

Vous pouvez extraire l'image du docker hub. Remplacez [tag] par la version finale de Harbor (par exemple v1.9.4) dans la commande ci-dessous:

[admdock@registry ]$ docker pull goharbor/harbor-migrator:v1.9.4

Sous le répertoire ./harbor, exécutez le script ./install.sh pour installer la nouvelle instance Harbor.

Note:

N'oublier pas de mettre à jour le fichier "harbor.yml" avant de lancer l'installation.

Si vous choisissez d'installer Harbor avec des composants tels que Notary, Clair et chartmuseum, reportez-vous au Guide d'installation et de configuration pour plus d'informations.

Annexe

https://goharbor.io

https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

https://github.com/goharbor/harbor/blob/master/docs/user_guide.md

Troubleshooting

Pour pouvoir pusher les images avec un certificat personnalisé

sudo cp registry.oowy.lan.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
sudo systemctl restart docker

If you want to disable user self registration, apply this setting in harbor.cfg:

self_registration = off

Recherche sur AD Microsoft

# ldapsearch -x -h ad01.oowy.lan -D "sa-harbor@oowy.lan" -W -b "dc=oowy,dc=lan" -s sub "(cn=*)" cn mail sn