Sommaire
Contexte : pourquoi les identités fuient
Un même utilisateur macOS peut exécuter plusieurs agents CI, des scripts de synchronisation et des sessions interactives. Dès qu’un remote HTTPS pointe vers github.com sans chemin fin, le credential helper peut réutiliser le premier jeton valide — parfois celui d’un autre mandat. Symétriquement, ssh git@github.com sans IdentitiesOnly risque de proposer la mauvaise clé. Les bonnes pratiques de rotation de jetons et droits minimaux sur les canaux d’alerte s’appliquent aussi au dépôt : périmètre étroit, durée courte, preuve de contrôle après rotation.
Objectif opérationnel : une relation (compte forge × mandat client) → une chaîne d’outils prévisible (fichier ~/.gitconfig inclus, hôte SSH dédié, ou PAT stocké avec granularité par URL). Les tableaux suivants aident à trancher sans dogme.
Matrice : SSH, HTTPS, Trousseau, concurrence
Utilisez ce tableau pour choisir la première brique d’identité sur un nœud mutualisé (équipes 5–30 personnes, un ou plusieurs dépôts actifs par siège).
| Critère | Certificats / clés SSH (hôtes alias) | HTTPS + credential helper | Trousseau macOS (osxkeychain) | Concurrence & conflits |
|---|---|---|---|---|
| Granularité par compte | Excellente : une entrée Host github.com-projetA force IdentityFile et IdentitiesOnly yes. | Bonne si credential.useHttpPath true et URLs avec chemins distincts ; sinon fuite entre orgs sur le même hôte. | Stockage sûr, mais clé = hôte + chemin ; sans chemin précis, collisions possibles. | SSH : peu de contention si clés fichiers séparées. HTTPS : rares races sur écriture Trousseau si grosses salves de premier fetch. |
| Rotation | Certificats émis par CA interne : TTL court, renouvellement automatique (cf. matrice jump host). | Révocation PAT côté forge + remplacement ; scripts doivent viser l’URL exacte utilisée par le clone. | Après rotation, invalider l’entrée obsolète (suppression ou nouveau jeton) pour éviter les allers-retours silencieux. | Éviter deux jobs qui réécrivent le même secret en parallèle ; sérialiser ou isoler par GIT_CONFIG_GLOBAL / include. |
| Audit & conformité | Empreintes publiques déposées par dépôt ; traçabilité forte. | Scopes du PAT visibles côté GitHub/GitLab ; journaux d’accès API. | Peu d’audit local fin ; s’appuyer sur la forge pour les journaux. | Exiger des remotes explicites dans les logs CI pour corréler « quel jeton » avec « quel job ». |
| Coût cognitif équipe | Modéré : bien documenter les alias dans le README machine. | Faible pour équipes habituées aux PAT ; attention aux mots de passe expirés dans le Trousseau. | Transparent une fois osxkeychain activé. | Prévoir un runbook : « fetch parallèles autorisés si … » pour réduire les tickets « mauvais compte ». |
Synthèse : mélangez volontairement SSH pour les dépôts à forte exigence d’audit machine et HTTPS+PAT pour les pipelines où la rotation API est déjà industrialisée — mais ne mélangez pas les identités au même hôte sans alias ni chemin.
Concurrence : pulls parallèles sans mélange
Les worktrees et jobs CI déclenchent souvent plusieurs git fetch simultanés. Risques observés : (1) un script écrit ~/.git-credentials en mode concurrent ; (2) un helper universel répond avec le mauvais utilisateur parce que l’URL ne discrimine pas l’organisation ; (3) surcharge du Trousseau sur toutes premières authentifications. Remèdes : fichiers d’inclusion par racine de travail, pas de credential glob mutable par des jobs anonymes, et timeouts alignés sur la matrice worktree pour ne pas multiplier les retries aveugles.
- Préférer
git config credential.useHttpPath truepour les remotes HTTPS. - Isoler les essais destructifs dans un clone jetable avec
GIT_CONFIG_SYSTEM=/dev/nullsi besoin de reproduire sans toucher la config globale. - Sérialiser les rotations de jeton (fenêtre de maintenance) quand plusieurs pipelines partagent encore une entrée unique.
Checklist d’acceptation — rotation & moindre privilège
Avant de valider un poste ou un nœud build, cochez mentalement les points suivants (revue trimestrielle recommandée).
| Contrôle | Statut attendu |
|---|---|
| Périmètre PAT / token | Lecture seule sur les dépôts nécessaires ; pas de scopes admin « au cas où ». |
| Durée de vie | Jetons courts ; calendrier de rotation documenté (owner + date). |
| Preuve après rotation | git ls-remote et un build sec sur dépôt témoin. |
| Secrets hors dépôt | Aucun jeton dans l’historique Git ; fichiers locaux en 0600 si non-Trousseau. |
| Traçabilité | Les remotes affichées dans les logs CI correspondent au mandat (nom d’org visible dans l’URL ou l’alias SSH). |
Extraits configurables & validation
1. Découper Git par mandat (fichier ~/.gitconfig) :
[includeIf "gitdir:~/clients/acme/"]
path = ~/.gitconfig-acme
[credential]
helper = osxkeychain
useHttpPath = true
Dans ~/.gitconfig-acme, fixez utilisateur et éventuellement une stratégie supplémentaire ; gardez un dépôt témoin sous ce préfixe pour tester.
2. Alias SSH pour séparer les comptes GitHub/GitLab (~/.ssh/config) :
Host github.com-acme
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_acme
IdentitiesOnly yes
Adaptez les remotes en git@github.com-acme:org/repo.git. Pour les certificats émis par une CA d’équipe, reportez-vous aux paramètres de confiance et de renouvellement décrits dans la matrice jump host.
3. Vérifications rapides (à enchaîner après changement) :
git remote -vdans chaque clone critique : URL conforme au mandat.ssh -T git@github.com-acme(ou équivalent GitLab) : message de bienvenue du bon compte.git ls-remote origin HEADpuisgit fetchréel sur deux dépôts en parallèle : pas d’erreur d’authentification intermittente.- Après rotation : ancien jeton révoqué côté forge, nouveau fetch réussi, build pipeline vert sur branche témoin.
FAQ
- Faut-il préférer SSH ou HTTPS sur un Mac partagé ?
- Les deux conviennent si vous séparez explicitement les identités : SSH avec alias et
IdentitiesOnly; HTTPS avecuseHttpPathet jetons distincts. SSH facilite l’audit des clés ; HTTPS simplifie les rotations API très fréquentes. - Pourquoi le Trousseau semble « mélanger » les comptes ?
- Sans granularité de chemin d’URL, Git peut réutiliser la première entrée valide pour l’hôte. Activez
credential.useHttpPathet veillez à ce que chaque remote HTTPS porte le chemin complet du dépôt. - Les pulls parallèles sont-ils fiables avec un seul utilisateur macOS ?
- Oui pour des dépôts et identités déjà résolues ; méfiance si un script réécrit des fichiers credential partagés ou si plusieurs rotations simultanées touchent la même entrée Trousseau — dans ce cas, sérialisez ou isolez par configuration.
En résumé : traitez les identités Git comme des contrats par mandat — pas comme un réglage par défaut du système. Documentez alias SSH, chemins HTTPS et fenêtres de rotation ; validez avec des fetch parallèles contrôlés avant d’élargir la charge CI.
Déployez un pool Mac prêt pour SSH, worktrees et CI multi-identités
Les forfaits MeshMac orientés équipe mettent plusieurs nœuds Apple Silicon à disposition pour séparer environnements, clients et pipelines — idéal pour appliquer les matrices Git et SSH sans saturer un poste unique. Consultez la page publique forfaits et options multi-nœuds pour comparer les offres sans créer de compte, le centre d’aide pour le démarrage collaboratif, et le blog pour les autres playbooks mesh.