Aller au contenu

πŸ› οΈ 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Γ©

  • Tokens runner stockΓ©s dans Ansible Vault (chiffrΓ© AES-256)
  • Variables CI/CD sensibles marquΓ©es masked et protected
  • Runner internet isolΓ© sur VPS dΓ©diΓ©
  • Docker non privileged pour runner internet
  • AccΓ¨s mΓ©tadonnΓ©es cloud bloquΓ©
  • run_untagged = false sur tous les runners

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.