GitLab

Concepts : plateforme DevOps integree

GitLab est une plateforme DevOps tout-en-un qui combine l'hebergement de depots Git, la CI/CD (Continuous Integration / Continuous Delivery), le registre de conteneurs, les merge requests et la revue de code dans une seule interface.

Fonctionnalites principales utilisees

Fonctionnalite Description
Depots Git Hebergement de tout le code d'infrastructure (playbooks Ansible, Terraform, docs)
CI/CD integre Pipelines automatises pour validation, build et deploiement
Merge Requests Revue de code collaborative avant fusion dans la branche principale
Container Registry Stockage d'images Docker construites par les pipelines CI/CD
Snippets / Wiki Documentation technique et partage de scripts utilitaires

GitLab CE vs EE

GitLab existe en deux editions :

Critere Community Edition (CE) Enterprise Edition (EE)
Licence MIT (gratuit, open source) Proprietaire (payant)
Self-hosted Oui Oui
CI/CD Complet Complet + fonctions avancees
LDAP/SSO Oui Oui + SAML, SCIM
Audit logs Basique Avance
Vulnerability scanning Non Oui (SAST, DAST, dependency scanning)

Choix de GitLab CE

L'edition Community couvre tous nos besoins : hebergement Git, CI/CD, merge requests et container registry. Les fonctionnalites manquantes (SAST, DAST) sont compensees par les outils du SOC (Wazuh, analyse manuelle).


Serveur GitLab

Parametre Valeur
Nom VM INF-PDEV40A
Adresse IP 10.15.100.71 (VLAN 106 -- Services)
Ressources 4 vCPU, 16 Go RAM
URL https://gitlab.infra.indio
Edition GitLab Community Edition (CE)
Systeme Rocky Linux 9.6
Package source Nexus mirror (repo.infra.indio/repository/gitlab-ce/)
graph TB
    subgraph GITLAB["GitLab — 10.15.100.71"]
        NGINX["Nginx<br/>(reverse proxy TLS)"]
        RAILS["GitLab Rails<br/>(application)"]
        GITALY["Gitaly<br/>(stockage Git)"]
        REG["Container Registry"]
        RUNNER["GitLab Runner"]

        NGINX --> RAILS
        RAILS --> GITALY
        RAILS --> REG
        RUNNER --> RAILS
    end

    DEV["Developpeurs / Admins"] -->|"HTTPS :443"| NGINX
    GITALY -->|"xfs"| DISK1["lv_repos<br/>300 Go"]
    REG -->|"xfs"| DISK2["lv_registry<br/>100 Go"]

    style GITLAB fill:#e67e22,color:#fff

Migration du certificat TLS

Le certificat TLS de GitLab a ete migre d'un certificat auto-signe vers un certificat emis par la PKI Vault interne. Cette migration a corrige les erreurs SSL rencontrees par git clone, docker login et les navigateurs.

Comparaison avant / apres

Critere Avant (auto-signe) Apres (PKI Vault)
Issuer CN=gitlab.infra.indio (auto-signe) CN=Infra Indio Intermediate CA
Validite 30 jours 1 an (365 jours)
SAN (Subject Alternative Name) Aucun DNS:gitlab.infra.indio, IP:10.15.100.71
CRL (Certificate Revocation List) Non https://10.15.100.74:8200/v1/pki_int/crl
OCSP Non https://10.15.100.74:8200/v1/pki_int/ocsp
Verification par les clients Echoue (self-signed certificate) Valide (chaine CA complete)
git clone Necessite GIT_SSL_NO_VERIFY=1 Fonctionne nativement
docker login Necessite --insecure-registry Fonctionne nativement
graph LR
    subgraph AVANT["Avant : auto-signe"]
        CERT1["CN=gitlab.infra.indio<br/>Issuer = soi-meme<br/>30 jours, pas de SAN"]
        CLIENT1["Client"] -->|"SSL Error"| CERT1
    end

    subgraph APRES["Apres : PKI Vault"]
        ROOT["Root CA<br/>Infra Indio"]
        INT["Intermediate CA<br/>Infra Indio"]
        CERT2["gitlab.infra.indio<br/>SAN + CRL + OCSP<br/>1 an"]
        ROOT --> INT
        INT --> CERT2
        CLIENT2["Client"] -->|"SSL OK"| CERT2
    end

    style AVANT fill:#e74c3c,color:#fff
    style APRES fill:#27ae60,color:#fff

Impact de la migration

Apres le deploiement du nouveau certificat, il a fallu mettre a jour le trust store de toutes les VMs (via le role Ansible common) pour qu'elles reconnaissent la Intermediate CA de Vault. Sans cette etape, les VMs auraient rejete le nouveau certificat tout comme l'ancien.


Fichiers certificat sur le serveur

Fichier Chemin complet Contenu
Certificat + chain /etc/gitlab/ssl/gitlab.infra.indio.crt Certificat serveur + Intermediate CA
Cle privee /etc/gitlab/ssl/gitlab.infra.indio.key Cle RSA privee du certificat
CA chain (trust store) /etc/pki/ca-trust/source/anchors/infra-ca-chain.pem Root CA + Intermediate CA
Backup ancien cert /etc/gitlab/ssl/gitlab.infra.indio.crt.bak.self-signed Sauvegarde de l'ancien certificat auto-signe

Procedure de renouvellement du certificat

Le certificat doit etre renouvele avant son expiration (1 an). La procedure utilise l'API Vault pour emettre un nouveau certificat depuis le role server-tls.

Etape 1 -- Emettre un nouveau certificat

# Appel a l'API Vault PKI Intermediate
curl -sk \
  --header "X-Vault-Token: $VAULT_TOKEN" \
  --request POST \
  --data '{
    "common_name": "gitlab.infra.indio",
    "alt_names": "gitlab.infra.indio",
    "ip_sans": "10.15.100.71",
    "ttl": "8760h"
  }' \
  https://10.15.100.74:8200/v1/pki_int/issue/server-tls
Parametre Valeur Explication
common_name gitlab.infra.indio Nom principal du certificat
alt_names gitlab.infra.indio SAN DNS supplementaire
ip_sans 10.15.100.71 SAN IP pour acces par adresse
ttl 8760h Duree de validite (1 an = 8760 heures)

Etape 2 -- Deployer sur le serveur

# Copier les fichiers
scp cert.crt root@10.15.100.71:/etc/gitlab/ssl/gitlab.infra.indio.crt
scp cert.key root@10.15.100.71:/etc/gitlab/ssl/gitlab.infra.indio.key

Etape 3 -- Recharger Nginx

# Recharger Nginx sans redemarrer GitLab (zero downtime)
ssh root@10.15.100.71 "gitlab-ctl hup nginx"

Verification apres renouvellement

Apres le rechargement, verifier le nouveau certificat : openssl s_client -connect gitlab.infra.indio:443 -servername gitlab.infra.indio < /dev/null 2>/dev/null | openssl x509 -noout -dates -issuer -subject


Stockage LVM

GitLab utilise trois volumes logiques LVM dedies, chacun avec un filesystem XFS optimise pour les operations d'ecriture intensive (journalisation Git, builds CI) :

Volume logique Taille Point de montage Filesystem Usage
lv_repos 300 Go /var/opt/gitlab/git-data xfs Depots Git (Gitaly)
lv_registry 100 Go /var/opt/gitlab/registry xfs Images Docker (Container Registry)
lv_backups 100 Go /var/opt/gitlab/backups xfs Sauvegardes gitlab-backup
graph TB
    subgraph LVM["Volumes logiques LVM"]
        LV1["lv_repos<br/>300 Go xfs"]
        LV2["lv_registry<br/>100 Go xfs"]
        LV3["lv_backups<br/>100 Go xfs"]
    end

    subgraph GITLAB["Services GitLab"]
        GITALY["Gitaly<br/>(depots Git)"]
        REG["Container Registry<br/>(images Docker)"]
        BACKUP["gitlab-backup<br/>(sauvegardes)"]
    end

    GITALY --> LV1
    REG --> LV2
    BACKUP --> LV3

    style LV1 fill:#3498db,color:#fff
    style LV2 fill:#e67e22,color:#fff
    style LV3 fill:#27ae60,color:#fff

Pourquoi XFS ?

XFS est recommande par GitLab pour les volumes de donnees. Il offre d'excellentes performances en ecriture parallele et supporte les grandes tailles de fichiers. De plus, XFS supporte le reflink copy (si active), ce qui accelere les operations de fork de depots.


Packages depuis Nexus

GitLab CE est installe depuis le miroir Nexus, pas directement depuis packages.gitlab.com :

# /etc/yum.repos.d/nexus-gitlab-ce.repo
[nexus-gitlab-ce]
name=GitLab CE (Nexus)
baseurl=https://repo.infra.indio/repository/gitlab-ce/
enabled=1
gpgcheck=1
sslverify=1

Les mises a jour de GitLab passent donc par la chaine : packages.gitlab.comNexus (cache)yum install gitlab-ce sur le serveur.


Integrations avec l'infrastructure

GitLab est au centre de l'infrastructure et s'integre avec plusieurs composants :

graph TB
    VAULT["Vault<br/>10.15.100.74"] -->|"Certificat TLS<br/>PKI Intermediate"| GL["GitLab<br/>10.15.100.71"]
    VAULT -->|"Secrets CI/CD<br/>KV secrets engine"| GL
    NEXUS["Nexus<br/>10.15.100.65"] -->|"Packages gitlab-ce<br/>Images Docker base"| GL
    GL -->|"Code source"| ANSIBLE["Playbooks Ansible"]
    GL -->|"Code source"| TF["Configurations Terraform"]
    GL -->|"Code source"| DOCS["Documentation MkDocs"]
    GL -->|"Container Registry"| DOCKER["Images Docker custom"]

    style GL fill:#e67e22,color:#fff
    style VAULT fill:#7b68ee,color:#fff
    style NEXUS fill:#27ae60,color:#fff
Integration Detail
Vault Certificat TLS emis par la PKI Intermediate ; secrets CI/CD stockes dans le KV engine
Nexus Packages GitLab CE via le proxy YUM ; images Docker de base via le proxy Docker
Ansible Tous les playbooks d'infrastructure sont versionnes dans GitLab
MkDocs La documentation du projet (ce site) est hebergee dans un depot GitLab
FreeIPA Authentification LDAP des utilisateurs GitLab via FreeIPA

Configuration principale

Le fichier de configuration principal est /etc/gitlab/gitlab.rb. Apres toute modification, executer gitlab-ctl reconfigure pour appliquer les changements. Pour un simple rechargement de certificat, gitlab-ctl hup nginx suffit.