Repository's migreren met secrets in de geschiedenis
fremforge voert bij elke push een gitleaks-pre-receive-hook uit, ook bij de eerste mirror-push die de geschiedenis van een klant naar een fremforge-organisatie brengt. Staan er in een historische commit van de bronrepository secrets (een oud .env-bestand, een gelekte API-sleutel, een private SSL-sleutel enzovoort), dan mislukt de importpush en loopt de migratie vast.
Deze pagina beschrijft de twee ondersteunde opties. Optie A is voor de meeste teams de aanbevolen route; optie B is een laatste redmiddel.
Optie A: roteer het secret en herschrijf de geschiedenis (aanbevolen)
Het meest geschikt als:
- Het gelekte secret echt is (API-sleutel, private SSH-sleutel, certificaat, wachtwoord). Het moet hoe dan ook ongeldig worden gemaakt, waar de repository ook staat: het in de git-geschiedenis van welke host dan ook laten staan, is een blijvende blootstelling.
- Het team ongeveer een uur kan besteden aan het herschrijven van de geschiedenis en een force-push naar de bron.
Procedure:
- Roteer eerst het gelekte secret. Voordat je git aanraakt: wijzig de API-sleutel, trek de SSH-sleutel in, roteer het certificaat. De gelekte waarde moet ongeldig zijn voordat de geschiedenis wordt herschreven; dan is de waarde onschadelijk, zelfs als het herschrijven onvolledig is.
- Zoek de commit(s). De gitleaks-uitvoer van de importpoging in fremforge noemt de regel en de commit-SHA. Zorg dat je begrijpt om welk secret en welke commits het gaat.
- Herschrijf de geschiedenis met
git filter-repo. (upstreamdocumentatie)# Install: brew install git-filter-repo (or pip install git-filter-repo) # Verify upstream is clean: git clone --mirror <source-url> repo.git cd repo.git # Replace the secret value across history (string-replace shape): echo 'literal:AKIAEXAMPLE12345===>REDACTED' > replace.txt git filter-repo --replace-text replace.txt # OR: drop the file containing the secret across history: git filter-repo --invert-paths --path path/to/leaky/file - Force-push de herschreven geschiedenis eerst naar de bronrepository.
- Het herschrijven van de geschiedenis aan de bronkant maakt de oplossing blijvend. Push je de herschreven geschiedenis alleen naar fremforge, dan heeft een aanvaller die de bron vóór het herschrijven heeft gekloond de gelekte waarde nog steeds.
- GitHub:
git push --force-with-lease --mirror - GitLab en ADO: hetzelfde. Beide weigeren standaard een force-push naar beschermde branches; versoepel dat tijdelijk, push en zet de bescherming terug.
- Voer de migratie uit volgens de standaardprocedure, zie github / gitlab / azure-devops.
- Controleer na de import dat het gitleaks-log van fremforge voor de migratiepush nul blokkades toont.
Kanttekeningen:
- Forks en clones bevatten nog de oorspronkelijke geschiedenis. Je kunt niet elke clone terughalen; daarom is stap 1 (eerst het secret roteren) de stap waar alles om draait.
- Het herschrijven van de geschiedenis breekt elke open PR/MR/branch op de bron. Stem het af met het team voordat je op enter drukt; sommige hosts ronden PR’s netjes af bij een rebase, andere tonen ze als “merged in N+1 commits”.
- De integriteit van tags en handtekeningen gaat verloren: een ondertekende tag die naar een herschreven commit wijst, is niet langer geldig. Maak de tags na het herschrijven opnieuw aan.
Optie B: begin met een lege repository en push alleen de laatste commit (laatste redmiddel)
Het meest geschikt als:
- De geschiedenis van de bron te verward is om netjes te herschrijven.
- Het team bereid is af te zien van alle blame- en loggeschiedenis; alleen de huidige toestand telt.
- Gebruikelijk bij gearchiveerde projecten die “ter bewaring” worden gespiegeld, zonder actieve ontwikkeling.
Procedure:
- Kloon de laatste tree van de bronrepository (elke branch volstaat) naar een werkmap.
rm -rf .git && git init && git add . && git commit -m "Initial import: <source-url>@<commit-sha>".- Push de nieuwe repository met één commit volgens de standaardprocedure naar fremforge.
- Voeg een NOTES.md of een link in de CHANGELOG toe die terugverwijst naar de bron, voor teamleden die de volledige geschiedenis nodig hebben.
Wat je hiermee verliest:
- Alle geschiedenis van
git blame/git log. - Alle historische diffs van PR’s en MR’s (die blijven op de bronhost staan totdat je die verwijdert).
- Alle historische commithandtekeningen.
Kiezen tussen de twee
| Vraag | Optie A | Optie B |
|---|---|---|
| Is het secret nog geldig? | eerst roteren | n.v.t. |
| Moet de geschiedenis behouden blijven? | herschreven | weggegooid |
| Eenmalige push? | ja | ja |
| Gaat nieuw werk door in dezelfde repository? | ja | ja |
| Zijn er nog forks/clones met het lek in omloop? | alleen een restrisico als het niet is geroteerd | n.v.t. (geschiedenis niet in fremforge) |
| Is een handeling van een operator nodig? | nee | nee |
Kies standaard voor A, tenzij er een sterke reden is om dat niet te doen.
Gerelateerd
- GitHub-migratie · GitLab-migratie · Azure DevOps-migratie
- pre-migration-check.sh: bladert door de repository’s van de bron, vergelijkt de compatibiliteit van Marketplace-actions en brengt configuraties van webhooks, branchbescherming en pipelines in kaart. Scant de geschiedenis NIET op secrets (dat is de taak van gitleaks, lokaal uit te voeren zoals op de pagina hierboven beschreven)
- Beveiliging en supply chain: de gitleaks-hook waar deze pagina over gaat