Gå til hovedindhold

Migrering af repos med secrets i historikken

fremforge kører en gitleaks-pre-receive-hook på hvert push, også det første spejl-push, der bringer en kundes historik ind i en fremforge-organisation. Hvis kilderepoet har secrets i en hvilken som helst gammel commit (en gammel .env, en lækket API-nøgle, en privat SSL-nøgle osv.), fejler import-pushet, og migreringen går i stå.

Denne side beskriver de to understøttede muligheder. Mulighed A er den anbefalede vej for de fleste teams; mulighed B er en sidste udvej.

Mulighed A: rotér secretet og omskriv historikken (anbefales)

Bedst når:

  • Det lækkede secret er ægte (API-nøgle, privat SSH-nøgle, certifikat, adgangskode). Det skal gøres ugyldigt, uanset hvor repoet ligger: så længe det ligger i Git-historikken hos en hvilken som helst vært, er det eksponeret.
  • Teamet kan bruge omkring en time på at omskrive historikken og force-pushe til kilden.

Fremgangsmåde:

  1. Rotér først det lækkede secret. Før du rører Git: skift API-nøglen, tilbagekald SSH-nøglen, rotér certifikatet. Det lækkede secret skal være ugyldigt, før historikken omskrives; så er værdien harmløs, selv hvis omskrivningen ikke fanger alt.
  2. Find den eller de berørte commits. gitleaks-outputtet fra fremforges importforsøg angiver reglen og commit-SHA’en. Sørg for, at du ved, hvilket secret og hvilke commits det drejer sig om.
  3. Omskriv historikken med git filter-repo. (upstream-dokumentation)
    # 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
  4. Force-push den omskrevne historik til kilderepoet først.
    • Det er omskrivningen hos kilden, der gør rettelsen varig. Hvis du kun pusher den omskrevne historik til fremforge, har en angriber, der klonede kilden før omskrivningen, stadig den lækkede værdi.
    • GitHub: git push --force-with-lease --mirror
    • GitLab og ADO: det samme. Begge afviser som standard force-push til beskyttede branches; slå beskyttelsen midlertidigt fra, push, og beskyt igen.
  5. Kør migreringen efter den almindelige fremgangsmåde, se GitHub / GitLab / Azure DevOps.
  6. Kontrollér efter importen, at fremforges gitleaks-log viser nul blokeringer for migrerings-pushet.

Forbehold:

  • Forks og kloner indeholder stadig den oprindelige historik. Der er ingen måde at få fat i alle kloner på, og det er derfor, trin 1 (rotér secretet først) er det trin, det hele hviler på.
  • En omskrivning af historikken ødelægger alle åbne PR’er, MR’er og branches i kilden. Aftal det med teamet, før du trykker enter; nogle værter lukker PR’er pænt ved rebase, andre viser dem som “merged in N+1 commits”.
  • Integriteten af tags og signaturer går tabt: et signeret tag, der peger på en omskrevet commit, er ikke længere gyldigt. Tag igen efter omskrivningen.

Mulighed B: start fra et tomt repo, og push kun den seneste commit (sidste udvej)

Bedst når:

  • Kildens historik er for indviklet til at blive omskrevet rent.
  • Teamet er villigt til at give afkald på al blame- og log-historik; kun den nuværende tilstand betyder noget.
  • Typisk for arkiverede projekter, der spejles “til opbevaring” og ikke udvikles aktivt.

Fremgangsmåde:

  1. Klon kilderepoets seneste træ (en hvilken som helst branch) til en arbejdsmappe.
  2. rm -rf .git && git init && git add . && git commit -m "Initial import: <source-url>@<commit-sha>".
  3. Push det nye repo med én commit til fremforge efter den almindelige fremgangsmåde.
  4. Tilføj en NOTES.md eller et link i CHANGELOG, der peger tilbage til kilden, til teammedlemmer, der har brug for hele historikken.

Hvad du mister:

  • Al historik i git blame / git log.
  • Alle gamle diffs fra PR’er og MR’er (de bliver hos kildeværten, indtil du sletter den).
  • Alle gamle commit-signaturer.

Valget mellem de to

SpørgsmålMulighed AMulighed B
Er secretet stadig gyldigt?rotér førstikke relevant
Skal historikken bevares?omskrevetkasseret
Ét push?jaja
Fortsætter nyt arbejde i samme repo?jaja
Findes der stadig forks/kloner med lækket?kun en restrisiko, hvis det ikke er roteretikke relevant (historikken er ikke i fremforge)
Kræver det en handling fra en operatør?nejnej

Vælg A, medmindre der er en tungtvejende grund imod.

Relateret