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.com → Nexus (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.