Skip to content

Sécurité ​

Les mesures de sécurité de l'infrastructure, couche par couche. L'audit complet de l'application est dans la section Cybersécurité.

Les machines ​

MesureEffet
Shielded VM (démarrage sécurisé, vTPM, contrôle d'intégrité)Un système modifié au démarrage est détecté
Compte de service tm-nodes sans aucun rôle IAMMême si une VM était compromise, elle ne pourrait rien modifier dans le projet Google Cloud. Le compte par défaut, lui, a le rôle Éditeur sur tout le projet.
Deux VM séparéesLes builds, qui exécutent du code tiers avec le socket Docker, n'ont aucun accès à la production
Ubuntu 24.04 LTSCorrectifs de sécurité maintenus

Le réseau ​

MesureOùEffet
Pare-feu Google Clouddevant les VM80 et 443 ouverts uniquement sur tm-prod (tag web), règle RDP supprimée
UFW, « tout refuser » par défautsur chaque VMSeuls les ports autorisés sont joignables
Un seul conteneur publié sur tm-prodTraefikDocker contourne UFW : en ne publiant que Traefik, rien d'autre n'est exposé
Jenkins lié à l'IP internetm-toolingPas d'écoute sur l'IP publique, même si UFW était contourné
Réseau Docker internaltm-prodLa base n'a aucun accès à l'extérieur et n'est joignable que par l'API
Échanges entre machines par le réseau interneles deuxLe déploiement SSH ne passe pas par internet

Le chiffrement ​

MesureEffet
HTTPS partout, certificats Let's EncryptRien ne circule en clair entre les utilisateurs et les serveurs
Redirection automatique de 80 vers 443Impossible de rester en HTTP
Secrets chiffrés avec Ansible VaultRien de sensible en clair dans Git

Les accès ​

MesureEffet
SSH par clé uniquementPas de mot de passe à deviner
host_key_checking = True dans AnsibleRefuse une machine qui aurait été remplacée
Utilisateur deploy dédiéJenkins ne se connecte pas avec le compte d'administration
deploy n'accepte que la clé de JenkinsAucune autre clé ne peut l'utiliser
Jeton GHCR en lecture seule sur tm-prodLa production peut télécharger les images, pas en publier
Jenkins : un seul compte, pas d'inscriptionPersonne ne peut créer de compte

La chaîne de livraison ​

MesureEffet
Scan Trivy à chaque buildUne faille critique connue dans les paquets système bloque le déploiement
Code copié dans le conteneur de testLe code exécuté pendant les tests n'a jamais accès au socket Docker ni à la clé de déploiement
Images en plusieurs étapesNi code source, ni compilateur, ni dépendances de build en production
Frontend avec nginx-unprivilegednginx ne tourne pas en root
Backend avec l'utilisateur nobody et apt-get upgradeL'API ne tourne pas en root, avec les correctifs système à jour
server_tokens off dans nginxLa version de nginx n'est pas annoncée
Dashboard Traefik désactivé, pas d'accès à docker.sockUne faille dans Traefik ne donne pas la main sur Docker

Les secrets ​

MesureEffet
.env et clés en 0600Lisibles par leur seul propriétaire
no_log: trueAbsents des journaux d'Ansible
Clé SSH montée en secret DockerJamais dans une variable d'environnement visible par docker inspect
withCredentials et --password-stdinJetons masqués dans les journaux Jenkins, absents de la liste des processus
docker logout après chaque pushPas de session GHCR qui traîne sur tm-tooling

Le détail est dans Secrets et accès.

L'application ​

Ce qui relève de l'API (cookies HttpOnly, jeton CSRF, hachage des mots de passe, droits par rôle) est décrit dans les parties Backend et Cybersécurité. Côté infrastructure, CORS_ORIGINS limite les sites autorisés à appeler l'API avec des cookies à https://time.jostud.com.

Les limites connues ​

Elles sont listées et assumées dans Limites et améliorations : Jenkins exposé derrière sa seule page de connexion, deploy dans le groupe docker (équivalent root), Jenkins en root avec le socket Docker, jeton GitHub classique, SSH ouvert à tous sans fail2ban, entre autres.