Comprendre la sécurité côté utilisateur

Ce que tu vas comprendre

  • Expliquer pourquoi la 2FA protège même si ton mot de passe est volé (Bloom 2)
  • Analyser les différences entre clé SSH, mot de passe et PAT en termes de surface d'attaque (Bloom 4)
  • Évaluer quelle combinaison de protections adopter selon ton niveau d'exposition (Bloom 5)

Le problème concret

Ton mot de passe a été compromis. Peut-être lors d'une fuite de données d'un autre service où tu utilisais le même mot de passe. L'attaquant se connecte à ton compte gitrust, clone tous tes dépôts privés, y dépose un backdoor et efface l'historique. Tu ne t'en aperçois que trois jours plus tard.

gitrust fournit quatre mécanismes de protection indépendants pour rendre ce scénario soit impossible, soit détectable immédiatement. Ce document explique comment ils s'articulent.


L'analogie

Imagine un coffre-fort bancaire avec plusieurs couches de sécurité :

  • La porte principale (mot de passe) : nécessaire mais insuffisante seule
  • Le code secret temporaire (2FA TOTP) : change toutes les 30 secondes, connu uniquement de toi
  • La clé physique nominative (clé SSH) : associée à une machine précise, inopérante sans la clé privée
  • Le badge d'accès limité (PAT) : n'ouvre que certaines salles, révocable instantanément

Chaque couche est indépendante. Compromettre l'une n'ouvre pas les autres.


Le modèle

graph TD
    subgraph "Vecteurs d'attaque"
        V1[Mot de passe volé
phishing / fuite DB] V2[Machine compromise
malware / vol] V3[Token exposé
commit accidentel / log] end subgraph "Protections gitrust" P1[2FA TOTP
code valide 30s] P2[Clé SSH + passphrase
liée à la machine] P3[PAT à durée limitée
scope minimal] P4[Audit log
connexions tracées] end V1 -->|bloqué par| P1 V2 -->|atténué par| P2 V3 -->|atténué par| P3 V1 & V2 & V3 -->|détectable via| P4

2FA — pourquoi le mot de passe seul ne suffit plus

Le mot de passe est un secret statique : une fois volé, il est valable indéfiniment jusqu'à ce que tu le changes. Un code TOTP (Time-based One-Time Password) est un secret dynamique : il expire en 30 secondes et ne peut être utilisé qu'une seule fois. Même si un attaquant intercepte ton code TOTP, il est déjà expiré au moment où il essaie de l'utiliser.

gitrust stocke uniquement le secret TOTP (une chaîne de 32 caractères) qui permet de générer des codes — jamais les codes eux-mêmes. Ce secret est chiffré en base.

Clés SSH — une identité par machine

Une clé SSH ed25519 est une paire mathématique (clé privée + clé publique) liée à une machine. gitrust ne stocke que la clé publique — celle-ci ne permet pas de reconstruire la clé privée. Pour s'authentifier, ta machine doit prouver qu'elle possède la clé privée en signant un challenge.

Ce que gitrust stocke : clé publique + empreinte SHA256 (pour identification) + date d'ajout.

Ce que gitrust ne stocke jamais : la clé privée (elle ne quitte jamais ta machine).

Si ta machine est volée, supprimer la clé dans /settings/keys révoque immédiatement l'accès — même si le voleur a copié les fichiers ~/.ssh/.

PAT — accès minimal et révocable

Un Personal Access Token est haché (SHA-256) dès sa création. gitrust ne stocke que le hash — si un attaquant accède à la base de données, les tokens en clair ne sont pas exposés. La valeur réelle du token (gr_pat_xxxx) n'est affichée qu'une seule fois à la création.

Le scope minimal (repo:read uniquement pour un script de lecture) limite les dégâts si un token est exposé. La date d'expiration garantit qu'un token oublié dans un vieux script ne reste pas valide indéfiniment.

Audit log — tout est tracé

Gitrust enregistre les connexions réussies et les tentatives échouées dans un journal d'audit accessible via /settings/activity. Si tu constates des connexions depuis des IP inconnues ou à des heures inhabituelles, c'est le signal d'une compromission.


Alternatives et compromis

Mot de passe fort sans 2FA

Un mot de passe long et unique (généré par un gestionnaire de mots de passe) réduit considérablement le risque de compromission par brute-force ou réutilisation. Mais il ne protège pas contre le phishing (tu es trompé pour le saisir sur un faux site) ni contre les fuites de base de données. La 2FA couvre ces deux vecteurs.

Clé SSH sans passphrase

Plus pratique (pas de saisie à chaque push), mais si ta machine est volée ou compromise par un malware, la clé privée est directement utilisable. Une passphrase chiffre la clé sur le disque — seule une combinaison vol physique + connaissance de la passphrase permet l'accès.

PAT sans expiration

Acceptable pour les outils personnels sur une machine de confiance. Inacceptable pour un token partagé dans un environnement CI, un script de serveur, ou un dépôt accessible à plusieurs personnes.


Vérifier ta compréhension

  1. Un collègue dit « je n'ai pas besoin de la 2FA, mon mot de passe fait 30 caractères aléatoires ». Quels scénarios d'attaque son mot de passe fort ne couvre-t-il pas ? (Bloom 2 — expliquer)

  2. Tu découvres que ton token PAT a été accidentellement commité dans un dépôt public il y a 6 heures. Quelles actions effectues-tu dans quel ordre, et pourquoi ? (Bloom 4 — analyser)


Pour aller plus loin