π οΈ PLAN D'IMPLΓMENTATION β PD-12
π Navigation User Story
| Document | | | ---------- | -- | | π SpΓ©cification | [PD-12-specification.md](PD-12-specification.md) | | π οΈ **Plan d'implΓ©mentation** | *(ce document)* | | β
CritΓ¨res d'acceptation | [PD-12-acceptability.md](PD-12-acceptability.md) | | π Retour d'expΓ©rience | [PD-12-rex.md](PD-12-rex.md) | [β Retour Γ infrastructure-souveraine](../PD-193-epic.md) Β· [β Index User Story](index.md)
PD-12 β Configuration GitLab Runner pour CI/CD
1. DΓ©coupage en composants
1.1 Composants infrastructure
| Composant | Description | Fichiers |
| VPS Principal | Héberge les runners Docker et Shell avec accès réseau interne | 51.68.126.160 |
| VPS Internet | VPS isolé pour runner sans accès réseau interne | vps-97f12e3e.vps.ovh.net |
| Docker Engine | Runtime d'exΓ©cution des conteneurs CI/CD | InstallΓ© via Ansible |
| GitLab Runner Service | Agent d'exΓ©cution des jobs | gitlab-runner systemd |
1.2 Composants configuration
| Composant | RΓ΄le | Fichier |
| config.toml (principal) | Configuration runners Docker + Shell | config.toml.j2 |
| config-internet-only.toml | Configuration runner isolΓ© | config-internet-only.toml.j2 |
| Ansible Playbook principal | DΓ©ploiement runners VPS principal | setup_gitlab_complete.yml |
| Ansible Playbook internet | DΓ©ploiement runner isolΓ© | setup_internet_runner.yml |
1.3 Composants secrets
| Composant | Stockage | Chemin |
| Runner tokens | Ansible Vault | vault.yml |
| VPS credentials | HashiCorp Vault | kv/ci/vps-internet |
| CI/CD variables | GitLab CI/CD Variables | Projet/Groupe GitLab |
2. Flux techniques
2.1 Flux d'enregistrement du Runner
βββββββββββββββ ββββββββββββββββ βββββββββββββββ
β Administrateur β β β GitLab Web UI β β β GΓ©nΓ©ration β
β β β (Settings) β β token runner β
βββββββββββββββ ββββββββββββββββ ββββββββ¬βββββββ
β
ββββββββββββββββββββββββββ
βΌ
ββββββββββββββββββββββββββββββββ
β Stockage token dans vault.yml β
β (Ansible Vault chiffrΓ©) β
ββββββββββββββββ¬ββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β ansible-playbook β
β setup_gitlab_complete β
βββββββββββββ¬ββββββββββββ
β
βββββββββββββββ΄ββββββββββββββ
βΌ βΌ
βββββββββββββββββββββββββ βββββββββββββββββββββββββ
β GΓ©nΓ©ration config.toml β β systemctl restart β
β depuis template j2 β β gitlab-runner β
βββββββββββββββββββββββββ βββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β gitlab-runner verify β
β β Runner visible GitLab β
βββββββββββββββββββββββββ
2.2 Flux d'exΓ©cution d'un job (Docker executor)
βββββββββββββ ββββββββββββββ βββββββββββββββββ
β git push β β β GitLab CI β β β Pipeline créé β
βββββββββββββ ββββββββββββββ βββββββββ¬ββββββββ
β
βββββββββββββββββββββββββ
βΌ
ββββββββββββββββββββββββββ
β Job assignΓ© au runner β
β (matching tags) β
βββββββββββββ¬βββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β docker pull <image> β
β (if-not-present) β
βββββββββββββ¬βββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β docker run β
β --network=bridge|host β
β --volumes /cache β
β --env CI_* β
βββββββββββββ¬βββββββββββββ
β
βββββββββββββ΄ββββββββββββ
β β
βΌ βΌ
βββββββββββββββββ βββββββββββββββββ
β ExΓ©cution job β β Injection β
β (script) β β secrets β
βββββββββ¬ββββββββ β (masked) β
β βββββββββββββββββ
βΌ
βββββββββββββββββββββββββ
β Upload artifacts/cache β
β β GitLab β
βββββββββββββ¬ββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β docker rm <container> β
β (conteneur Γ©phΓ©mΓ¨re) β
βββββββββββββββββββββββββ
2.3 Flux de gestion du cache
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Job dΓ©marre avec cache: key: $CI_COMMIT_REF_SLUG β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β Recherche cache existant β
β /home/gitlab-runner/cache/ β
β ou cache S3/GCS (si configurΓ©)β
βββββββββββββββββ¬ββββββββββββββββ
β
βββββββββββββββ΄ββββββββββββββ
β Cache trouvΓ©? β
βββββββββββββββ¬ββββββββββββββ
β β
βββββ βββββ
βΌ βΌ
βββββββββββββββββ βββββββββββββββββ
β Restauration β β Cache miss β
β cache β /cacheβ β (dΓ©part vide) β
βββββββββ¬ββββββββ βββββββββ¬ββββββββ
β β
ββββββββββ¬ββββββββββββ
βΌ
βββββββββββββββββββββ
β ExΓ©cution job β
βββββββββββ¬ββββββββββ
βΌ
βββββββββββββββββββββ
β Upload cache si β
β policy: push β
βββββββββββββββββββββ
2.4 Flux d'accès aux secrets
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GitLab CI/CD Variables β
β (Project/Group Settings β CI/CD β Variables) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Variable: SSH_PRIVATE_KEY β
β Type: Variable β
β Protected: β (branches protΓ©gΓ©es uniquement) β
β Masked: β (masquΓ© dans les logs) β
β Scope: Environment: production β
ββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β Job runner dΓ©marre β
β script: β
β echo "$SSH_KEY" β
βββββββββββββ¬ββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β GitLab injecte β
β $SSH_PRIVATE_KEY β
β comme env var β
βββββββββββββ¬ββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β Si echo $SSH_KEY: β
β β [MASKED] dans logs β
βββββββββββββ¬ββββββββββββ
β
βΌ
βββββββββββββββββββββββββ
β Fin du job β
β β conteneur dΓ©truit β
β β env vars perdues β
βββββββββββββββββββββββββ
3. Mapping invariants β mΓ©canismes
| # | Invariant | MΓ©canisme technique | ImplΓ©mentation |
| INV-1 | Le Runner ne doit jamais exposer de secrets en clair dans les logs | GitLab CI/CD Variables masquΓ©es | Variables marquΓ©es Masked: true dans GitLab UI |
| INV-2 | Jobs CI/CD exécutés dans un environnement isolé | Docker executor avec conteneurs éphémères | executor = "docker" + conteneur détruit après chaque job |
| INV-3 | Aucun job ne peut accéder aux données persistantes d'un autre job | Volumes éphémères + network isolation | network_mode = "bridge" pour runner internet, volumes non partagés |
| INV-4 | Toute exΓ©cution de job doit Γͺtre traΓ§able | Variables CI_* automatiques de GitLab | CI_PIPELINE_ID, CI_JOB_ID, CI_COMMIT_SHA injectΓ©es automatiquement |
| INV-5 | Secrets rΓ©vocables sans redΓ©ploiement du Runner | GitLab CI/CD Variables dynamiques | Modification via GitLab UI, effet immΓ©diat au prochain job |
| INV-6 | Le Runner n'exΓ©cute que des jobs explicitement autorisΓ©s | Tags runner + run_untagged = false | Seuls les jobs avec tag correspondant sont exΓ©cutΓ©s |
| INV-7 | Toute règle vérifiable par test ou audit | Scénarios de test + journalisation | Logs journalctl -u gitlab-runner, audit GitLab |
3.1 DΓ©tail des mΓ©canismes de sΓ©curitΓ©
Isolation rΓ©seau (INV-2, INV-3)
# config-internet-only.toml.j2
[runners.docker]
privileged = false # Pas d'accès kernel
network_mode = "bridge" # RΓ©seau isolΓ©
dns = ["8.8.8.8", "1.1.1.1"] # DNS publics uniquement
extra_hosts = ["169.254.169.254:127.0.0.1"] # Bloque metadata cloud
Masquage des secrets (INV-1)
# GitLab CI/CD Variables
SSH_PRIVATE_KEY:
value: "-----BEGIN RSA..."
masked: true # β [MASKED] dans logs
protected: true # β branches protΓ©gΓ©es seulement
TraΓ§abilitΓ© (INV-4)
Variables injectΓ©es automatiquement par GitLab :
CI_PIPELINE_ID : Identifiant unique du pipeline CI_JOB_ID : Identifiant unique du job CI_COMMIT_SHA : Hash du commit CI_RUNNER_ID : ID du runner ayant exΓ©cutΓ© CI_JOB_STARTED_AT : Timestamp de dΓ©marrage
4. Gestion des erreurs
| Cas d'erreur | DΓ©tection | Action | Message |
| Γchec enregistrement runner | gitlab-runner verify retourne erreur | Re-gΓ©nΓ©rer token dans GitLab | ERROR: Verifying runner... is removed |
| Job assignΓ© Γ runner indisponible | Runner offline dans GitLab UI | VΓ©rifier systemctl status gitlab-runner | Job reste en queue "pending" |
| Γchec crΓ©ation conteneur Docker | Job Γ©choue avec erreur Docker | VΓ©rifier docker info, espace disque | ERROR: Cannot connect to Docker daemon |
| Cache indisponible/corrompu | Job Γ©choue Γ restore cache | Cache miss automatique, rebuild | WARNING: Cache file does not exist |
| Secret manquant | Variable non dΓ©finie | VΓ©rifier CI/CD Variables GitLab | Error: variable XXX is not defined |
| AccΓ¨s non autorisΓ© Γ secret | Variable protΓ©gΓ©e sur branche non protΓ©gΓ©e | Γtendre scope ou protΓ©ger branche | Job Γ©choue, variable non injectΓ©e |
| Γchec communication GitLab-Runner | Timeout, runner offline | VΓ©rifier connectivitΓ© rΓ©seau | ERROR: Fetching job failed |
ProcΓ©dure de diagnostic
# 1. Γtat du service
sudo systemctl status gitlab-runner
# 2. Logs dΓ©taillΓ©s
sudo journalctl -u gitlab-runner -f --since "10 minutes ago"
# 3. VΓ©rification de l'enregistrement
sudo gitlab-runner verify
# 4. Test de connectivitΓ©
curl -I https://gitlab.com
# 5. Γtat Docker
docker info
docker ps -a
df -h # Espace disque
# 6. Liste des runners configurΓ©s
sudo gitlab-runner list
5. Impacts sΓ©curitΓ©
5.1 Surface d'attaque
| Vecteur | Risque | Mitigation |
| Conteneur Docker compromis | Escalade vers host | privileged = false, network_mode = bridge |
| Fuite de secrets dans logs | Exposition credentials | Variables masked: true obligatoires |
| Accès métadonnées cloud | Vol credentials IAM | extra_hosts = ["169.254.169.254:127.0.0.1"] |
| Accès réseau interne | Pivot vers services internes | Runner internet sur VPS séparé |
| Token runner volΓ© | ExΓ©cution jobs malveillants | run_untagged = false, tags spΓ©cifiques |
5.2 SΓ©paration des runners
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VPS Principal (51.68.126.160) β
β AccΓ¨s: VPN CloudHSM, PostgreSQL, Redis, services internes β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ ovh-docker : privileged=true, network=host β
β β Build Docker, tests d'intΓ©gration, HSM β
β β’ ovh-shell : executor=shell β
β β Terraform, Ansible, SSH vers autres VPS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β VPS Internet (vps-97f12e3e) β
β AccΓ¨s: Internet public UNIQUEMENT β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ ovh-internet : privileged=false, network=bridge β
β β Lint, docs, tests externes sans secrets internes β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
5.3 Checklist sΓ©curitΓ©
6. Hypothèses techniques
6.1 Hypothèses validées
| # | Hypothèse | Statut | Validation |
| H1 | Instance GitLab.com fonctionnelle | β
ValidΓ© | SLA GitLab 99.95% |
| H2 | VPS OVH accessibles et opΓ©rationnels | β
ValidΓ© | Monitoring OVH |
| H3 | Pipelines CI/CD dΓ©finis en amont | β
ValidΓ© | .gitlab-ci.yml existants |
| H4 | Utilisateurs GitLab avec droits nΓ©cessaires | β
ValidΓ© | RΓ΄le Maintainer minimum |
6.2 Hypothèses à valider à l'implémentation
| # | Hypothèse | Impact si fausse |
| H5 | Espace disque suffisant pour cache (80GB) | Ajout volume ou nettoyage automatique |
| H6 | Bande passante suffisante pour pull images | Pre-pull des images critiques |
| H7 | Latence rΓ©seau < 200ms vers GitLab.com | Impact performance jobs |
6.3 DΓ©cisions techniques prises
| DΓ©cision | Choix | Justification |
| Executor | Docker (pas Kubernetes) | SimplicitΓ©, contrΓ΄le direct, coΓ»t |
| Stockage secrets runner | Ansible Vault | IntΓ©gration existante, chiffrement AES |
| Cache | Local filesystem | Suffisant pour volume actuel |
| Network mode (internet) | Bridge | Isolation rΓ©seau maximale |
| Network mode (principal) | Host | Accès VPN CloudHSM requis |
7. Points de vigilance
7.1 Points critiques
| Point | Risque | Mitigation |
| Rotation tokens runner | Token expirΓ© = runner offline | ProcΓ©dure documentΓ©e, monitoring |
| Espace disque cache | Remplissage = jobs en Γ©chec | Monitoring + docker system prune pΓ©riodique |
| Mise Γ jour gitlab-runner | Breaking changes | Tester sur runner internet d'abord |
| Secrets dans logs | Exposition accidentelle | Audit rΓ©gulier des variables masked |
7.2 Points de clarification (issus de la spec)
| # | Point | RΓ©ponse implΓ©mentΓ©e |
| 1 | Périmètre runner (instance/groupe/projet) | Groupe probatiovault |
| 2 | Politique durΓ©e de vie cache | Pas d'expiration automatique, nettoyage manuel |
| 3 | Volume maximal cache | 80GB (disque VPS) |
| 4 | Politique rotation secrets | Manuelle via GitLab UI, immΓ©diat |
| 5 | Niveau de journalisation | Info par dΓ©faut, journalctl pour debug |
| 6 | Exigences conformitΓ© | Pas d'audit externe requis actuellement |
7.3 ProcΓ©dures de maintenance
# Nettoyage Docker hebdomadaire (cron recommandΓ©)
docker system prune -af --volumes
# Mise Γ jour runner
sudo apt update && sudo apt upgrade gitlab-runner -y
sudo systemctl restart gitlab-runner
# Rotation token runner
# 1. GΓ©nΓ©rer nouveau token dans GitLab UI
# 2. Mettre Γ jour vault.yml
# 3. ansible-playbook setup_gitlab_complete.yml
Annexes
A. Fichiers de rΓ©fΓ©rence
| Fichier | Description |
ansible/setup_internet_runner.yml | Playbook runner isolΓ© |
ansible/roles/gitlab_runner/templates/config.toml.j2 | Template config principal |
ansible/roles/gitlab_runner/templates/config-internet-only.toml.j2 | Template config isolΓ© |
docs/reference/infra/operations/internet-runner.md | Documentation opΓ©rationnelle |
B. Commandes utiles
# VΓ©rifier tous les runners
sudo gitlab-runner list
sudo gitlab-runner verify
# Logs en temps rΓ©el
sudo journalctl -u gitlab-runner -f
# Espace disque
df -h
docker system df
# Test pipeline manuel
# Via GitLab UI : CI/CD β Run Pipeline
Fin du plan d'implΓ©mentation PD-12.