Passer au contenu principal

À propos des comptes robot

Ce guide explique comment créer et gérer les comptes robot pour l'accès automatisé au Container Registry Numspot.


Vue d'ensemble

Les comptes robot sont des comptes de service utilisés pour les interactions automatisées avec Harbor, telles que :

  • Les pipelines CI/CD qui poussent et tirent des images.
  • Les clusters Kubernetes qui tirent des images pour les déploiements.
  • Les outils automatisés qui analysent ou gèrent des images.
  • La réplication inter-registries.

Pourquoi utiliser des comptes robot ?

  • Sécurité : éviter d'utiliser les identifiants admin dans l'automatisation.
  • Permissions granulaires : limiter l'accès à des projets et opérations spécifiques.
  • Audit : suivre les opérations automatisées séparément des actions utilisateur.
  • Rotation des identifiants : rotation des jetons des comptes robot sans affecter les utilisateurs.
  • Responsabilité : distinction claire entre les accès humains et automatisés.

Types de comptes robot

Comptes robot au niveau système

  • Portée : tous les projets dans le registry.
  • Créé par : administrateurs système Harbor.
  • Cas d'usage : automatisation à l'échelle du registry, réplication inter-projets.

Comptes robot au niveau projet

  • Portée : un seul projet uniquement.
  • Créé par : administrateurs de projet.
  • Cas d'usage : CI/CD spécifique au projet, déploiements d'applications.

Créer des comptes robot

Via l'interface Harbor (niveau projet)

  1. Connectez-vous à l'interface Harbor.
  2. Accédez à Projects → Sélectionnez le projet → Robots.
  3. Cliquez sur New Robot Account.
  4. Configurez :
ChampValeur
Nameci-cd-pipeline (préfixe ajouté automatiquement)
DescriptionRobot for CI/CD pipeline pushes
ExpirationNever ou date spécifique
PermissionsSélectionnez les permissions appropriées
  1. Cliquez sur Add

Niveaux de permission

PermissionDescriptionCas d'usage
PushPousser des images vers le dépôtPipelines CI qui construisent des images
PullTirer des images depuis le dépôtDéploiements Kubernetes
ReadVoir les métadonnées du dépôtOutils de monitoring
DeleteSupprimer des images et tagsJobs de nettoyage
CreateCréer des dépôtsConfiguration initiale du projet
Scanner pullRécupérer les résultats de scanOutils de sécurité

Combinaisons de permissions courantes

Cas d'usagePermissions
CI/CD PushPush + Create
Kubernetes PullPull + Read
Accès completPush + Pull + Read + Delete + Create
ScannerPull + Read + Scanner pull

Via API (niveau projet)

curl -X POST "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/robots" \
-u "admin:{password}" \
-H "Content-Type: application/json" \
-d '{
"name": "ci-cd-pipeline",
"description": "Robot for CI/CD pipeline pushes",
"expires_at": -1,
"permissions": [
{
"kind": "project",
"namespace": "{project_name}",
"access": [
{"action": "push"},
{"action": "pull"},
{"action": "create"}
]
}
]
}'

Réponse :

{
"id": 1,
"name": "robot${project_name}+ci-cd-pipeline",
"description": "Robot for CI/CD pipeline pushes",
"expires_at": -1,
"secret": "generated-secret-token",
"creation_time": "2026-05-05T10:00:00Z"
}
avertissement

Sauvegardez immédiatement la valeur du secret. Elle n'est affichée qu'une seule fois et ne peut pas être récupérée ultérieurement.

Via l'interface Harbor (niveau système)

  1. Connectez-vous en tant qu'administrateur système.
  2. Accédez à AdministrationRobot Accounts.
  3. Cliquez sur New Robot Account.
  4. Configurez :
ChampValeur
Namesystem-replication
DescriptionSystem-wide replication robot
ExpirationNever ou date spécifique
ScopeNiveau système
PermissionsTous les projets ou projets spécifiques
  1. Cliquez sur Add

Via API (niveau système)

curl -X POST "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/robots" \
-u "admin:{password}" \
-H "Content-Type: application/json" \
-d '{
"name": "system-replication",
"description": "System-wide replication robot",
"expires_at": -1,
"level": "system",
"permissions": [
{
"kind": "project",
"namespace": "*",
"access": [
{"action": "push"},
{"action": "pull"},
{"action": "delete"},
{"action": "create"}
]
}
]
}'

Gérer les identifiants des comptes robot

Sauvegarder les identifiants

Après avoir créé un compte robot, vous recevrez :

  • Nom d'utilisateur : robot${project_name}+robot-name.
  • Secret/Jeton : jeton généré (affiché une seule fois).

Stockez les identifiants de manière sécurisée :

## Exemple : Sauvegarder dans un secret Kubernetes
kubectl create secret docker-registry harbor-robot-secret \
--docker-server=registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com \
--docker-username='robot${project_name}+ci-cd-pipeline' \
--docker-password='generated-secret-token'

## Exemple : Sauvegarder dans des variables d'environnement
export HARBOR_ROBOT_USER='robot${project_name}+ci-cd-pipeline'
export HARBOR_ROBOT_SECRET='generated-secret-token'

Utiliser les comptes robot

Docker Login

docker login registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com \
-u 'robot${project_name}+ci-cd-pipeline' \
-p 'generated-secret-token'

Docker Push/Pull

## Push image
docker push registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/myproject/myimage:v1.0

## Pull image
docker pull registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/myproject/myimage:v1.0

Kubernetes Image Pull Secret

apiVersion: v1
kind: Secret
metadata:
name: harbor-robot-secret
namespace: default
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: ewogICJhdXRocyI6IHsKICAgICJyZWdpc3RyeS17cmVnaXN0cnlJZH0uaGNwLmNsb3VkZ291di1ldS13ZXN0LTEubnVtc3BvdC5jb20iOiB7CiAgICAgICJ1c2VybmFtZSI6ICJyb2JvdCR7cHJvamVjdF9uYW1lfStjaS1jZC1waXBlbGluZSIsCiAgICAgICJwYXNzd29yZCI6ICJnZW5lcmF0ZWQtc2VjcmV0LXRva2VuIiwKICAgICAgImF1dGgiOiAiYjNvTlRtVm1kWEJwYm1samJtRjBaVG9qTVE9PSIKICAgIH0KICB9Cn0=

Déploiement Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
imagePullSecrets:
- name: harbor-robot-secret
containers:
- name: myapp
image: registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/myproject/myimage:v1.0

CI/CD (GitLab CI)

## .gitlab-ci.yml
variables:
HARBOR_REGISTRY: registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com
HARBOR_USER: robot${project_name}+ci-cd-pipeline
HARBOR_PASSWORD: generated-secret-token

docker-build:
stage: build
image: docker:latest
services:
- docker:dind
before_script:
- docker login -u "$HARBOR_USER" -p "$HARBOR_PASSWORD" $HARBOR_REGISTRY
script:
- docker build -t $HARBOR_REGISTRY/myproject/myimage:$CI_COMMIT_SHA .
- docker push $HARBOR_REGISTRY/myproject/myimage:$CI_COMMIT_SHA

CI/CD (GitHub Actions)

## .github/workflows/docker.yml
name: Docker Build and Push

on:
push:
branches: [main]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Login to Harbor
uses: docker/login-action@v2
with:
registry: registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com
username: ${{ secrets.HARBOR_ROBOT_USER }}
password: ${{ secrets.HARBOR_ROBOT_SECRET }}

- name: Build and push
uses: docker/build-push-action@v4
with:
push: true
tags: registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/myproject/myimage:${{ github.sha }}

Gérer les comptes robot existants

Lister les comptes robot

Via l'interface Harbor

  1. Accédez à Projects → Sélectionnez le projet → Robots.
  2. Consultez la liste des comptes robot.

Via API

## Lister les robots au niveau projet
curl -X GET "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/robots" \
-u "admin:{password}"

## Lister les robots au niveau système
curl -X GET "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/robots" \
-u "admin:{password}"

Modifier un compte robot

Via l'interface Harbor

  1. Accédez à la liste des comptes robot
  2. Cliquez sur Edit sur le compte robot
  3. Modifiez :
  • La description
  • La date d'expiration
  • Les permissions
  1. Cliquez sur Save

Via API

curl -X PUT "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/robots/{robot_id}" \
-u "admin:{password}" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated description",
"expires_at": 1735689600,
"permissions": [
{
"kind": "project",
"namespace": "{project_name}",
"access": [
{"action": "push"},
{"action": "pull"}
]
}
]
}'

Rafraîchir le secret

Régénérer le secret du compte robot :

Via l'interface Harbor

  1. Accédez à la liste des comptes robot
  2. Cliquez sur Refresh Secret sur le compte robot
  3. Copiez immédiatement le nouveau secret (affiché une seule fois)

Via API

curl -X PATCH "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/robots/{robot_id}" \
-u "admin:{password}" \
-H "Content-Type: application/json" \
-d '{
"secret": ""
}'

Réponse :

{
"secret": "new-generated-secret-token"
}
avertissement

Le rafraîchissement du secret invalide immédiatement l'ancien secret. Mettez à jour tous les systèmes utilisant le compte robot.

Désactiver un compte robot

Désactiver temporairement sans supprimer :

curl -X PUT "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/robots/{robot_id}" \
-u "admin:{password}" \
-H "Content-Type: application/json" \
-d '{
"disable": true
}'

Supprimer un compte robot

avertissement

La suppression est permanente. Tous les systèmes utilisant le compte robot perdront l'accès.

Via l'interface Harbor

  1. Accédez à la liste des comptes robot.
  2. Cliquez sur Delete sur le compte robot.
  3. Confirmez la suppression.

Via API

curl -X DELETE "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/robots/{robot_id}" \
-u "admin:{password}"

Bonnes pratiques pour les comptes robot

Sécurité

  1. Principe du moindre privilège : Accordez les permissions minimales nécessaires
  2. Portée projet : Utilisez des robots au niveau projet plutôt qu'au niveau système
  3. Expiration courte : Définissez des dates d'expiration raisonnables
  4. Rotation des secrets : Rafraîchissez régulièrement les secrets des comptes robot
  5. Ne jamais commiter les secrets : Utilisez des variables d'environnement ou des outils de gestion de secrets
  6. Auditer l'utilisation : Surveillez l'activité des comptes robot dans les logs d'audit

Organisation

  1. Noms descriptifs : Utilisez des noms significatifs (ex: ci-cd-production, k8s-deploy-staging)
  2. Documenter l'objectif : Incluez des descriptions détaillées
  3. Taguer les environnements : Utilisez des conventions de nommage pour les environnements
  4. Suivre la propriété : Documentez quelle équipe/système possède chaque robot

Gestion du cycle de vie

  1. Revue régulière : Auditez les comptes robot trimestriellement
  2. Supprimer les inutilisés : Supprimez les comptes robot qui ne sont plus utilisés
  3. Alertes sur l'expiration : Surveillez les comptes proches de l'expiration
  4. Mettre à jour l'automatisation : Rafraîchissez les identifiants dans le CI/CD avant l'expiration

Modèles de comptes robot

Robot pour pipeline CI/CD

curl -X POST "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/robots" \
-u "admin:{password}" \
-H "Content-Type: application/json" \
-d '{
"name": "ci-pipeline",
"description": "CI pipeline for building and pushing images",
"expires_at": -1,
"permissions": [
{
"kind": "project",
"namespace": "{project_name}",
"access": [
{"action": "push"},
{"action": "pull"},
{"action": "create"}
]
}
]
}'

Robot pour déploiement Kubernetes

curl -X POST "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/robots" \
-u "admin:{password}" \
-H "Content-Type: application/json" \
-d '{
"name": "k8s-deploy",
"description": "Kubernetes cluster image pull",
"expires_at": -1,
"permissions": [
{
"kind": "project",
"namespace": "{project_name}",
"access": [
{"action": "pull"},
{"action": "read"}
]
}
]
}'

Robot de réplication

curl -X POST "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/robots" \
-u "admin:{password}" \
-H "Content-Type: application/json" \
-d '{
"name": "replication-push",
"description": "Cross-registry replication",
"expires_at": -1,
"level": "system",
"permissions": [
{
"kind": "project",
"namespace": "*",
"access": [
{"action": "push"},
{"action": "pull"},
{"action": "delete"},
{"action": "create"}
]
}
]
}'

Surveiller l'utilisation des comptes robot

Via les logs d'audit

  1. Accédez à AdministrationAudit Log.
  2. Filtrez par nom d'utilisateur du compte robot.
  3. Consultez les opérations :
    • Opérations push/pull.
    • Création de dépôts.
    • Suppression d'images.
    • Horodatage du dernier accès.

Via API

## Récupérer les logs d'audit pour un compte robot
curl -X GET "https://registry-{registryId}.hcp.cloudgouv-eu-west-1.numspot.com/api/v2.0/projects/{project_id}/logs?username=robot%24{project_name}%2Bci-pipeline" \
-u "admin:{password}" | jq '.[] | {operation: .operation, repository: .repo_name, time: .op_time}'

Métriques à surveiller

  • Fréquence pull/push : suivez les patterns d'utilisation.
  • Échecs d'authentification : alertes sur les tentatives de connexion échouées.
  • Heure du dernier accès : identifiez les comptes robot inactifs.
  • Violations de permissions : alertes sur les tentatives d'accès non autorisées.

Dépannage

Problème 1 : échec de l'authentification

Symptôme : Docker login ou pull échoue avec erreur 401.

Solutions :

  1. Vérifiez le format du nom d'utilisateur du compte robot : robot${project_name}+robot-name.
  2. Vérifiez si le secret a été rafraîchi récemment.
  3. Vérifiez que le compte robot n'est pas désactivé.
  4. Vérifiez que les permissions correspondent à l'opération (pull vs push).

Problème 2 : accès refusé

Symptôme : erreur 403 Forbidden sur push/pull.

Solutions :

  1. Vérifiez que le compte robot a les permissions correctes.
  2. Vérifiez que le compte robot est associé au bon projet.
  3. Vérifiez que le dépôt existe (ou que la permission create est accordée).
  4. Vérifiez que les quotas du projet ne sont pas dépassés.

Problème 3 : compte robot expiré

Symptôme : l'authentification échoue après la date d'expiration.

Solutions :

  1. Mettez à jour l'expiration du compte robot.
  2. Créez un nouveau compte robot si nécessaire.
  3. Mettez à jour les secrets dans tous les systèmes consommateurs.

Problème 4 : impossible de rafraîchir le secret

Symptôme : le rafraîchissement du secret échoue.

Solutions :

  1. Vérifiez que vous avez les permissions d'administrateur de projet.
  2. Vérifiez que le compte robot existe toujours.
  3. Essayez de mettre à jour via l'API au lieu de l'interface.
  4. Contactez le support si le problème persiste.

Référence API

Créer un compte robot (projet)

POST /api/v2.0/projects/{project_id}/robots
Authorization: Basic {base64(admin:password)}
Content-Type: application/json

{
"name": "string",
"description": "string",
"expires_at": number,
"permissions": [
{
"kind": "project",
"namespace": "string",
"access": [
{"action": "push | pull | read | delete | create"}
]
}
]
}

Lister les comptes robot (projet)

GET /api/v2.0/projects/{project_id}/robots
Authorization: Basic {base64(admin:password)}

Récupérer un compte robot

GET /api/v2.0/projects/{project_id}/robots/{robot_id}
Authorization: Basic {base64(admin:password)}

Modifier un compte robot

PUT /api/v2.0/projects/{project_id}/robots/{robot_id}
Authorization: Basic {base64(admin:password)}
Content-Type: application/json

{
"description": "string",
"expires_at": number,
"disable": boolean,
"permissions": []
}

Rafraîchir le secret

PATCH /api/v2.0/projects/{project_id}/robots/{robot_id}
Authorization: Basic {base64(admin:password)}
Content-Type: application/json

{
"secret": ""
}

Supprimer un compte robot

DELETE /api/v2.0/projects/{project_id}/robots/{robot_id}
Authorization: Basic {base64(admin:password)}

Limitations

  • Secret affiché une seule fois : impossible de récupérer le secret après la création.
  • Immuabilité du nom : impossible de renommer un compte robot après sa création.
  • Granularité des permissions limitée : permissions au niveau Harbor uniquement.
  • Expiration requise : doit définir une date d'expiration pour les robots au niveau système.
  • Pas de restrictions IP : les comptes robot ne peuvent pas être restreints par IP (utilisez les permissions de projet).