Eszközök/Biztonság és megfelelés
detect-secrets: titkos kulcsok vizsgálata becommitolt baseline-nal
Mit csinál a detect-secrets, miben különbözik a becommitolt baseline a gitleakstól és a TruffleHogtól, miért számít az ellenőrző hívás a CI-ban, és hol ér véget a tool.
- Típus
- Secret detection
- Ár
- Apache-2.0
Balázs Csorba··10 perc olvasás
- Secret scanning
- Pre-commit
- Git
- DevSecOps

A lényeg röviden
- A detect-secrets elfogadja, hogy a repóban már lehetnek titkok. A becommitolt .secrets.baseline rögzíti a találatokat, és a hook csak az újat blokkolja, tehát a bevezetéshez nem kell előbb rendrakási projekt.
- A pontosság nem jobb regexekből, hanem jelölésekből jön: a detect-secrets audit a --stats kapcsolóval a mérés, a --exclude-files, --exclude-lines, --word-list és a két entrópia-küszöb pedig a tekerők.
- Az ellenőrzés alapból be van kapcsolva, és hálózaton keresztül szólítja meg a kibocsátó szolgáltatást. Ez erősen csökkenti a zajt, és elszigetelt CI-futónál határozott döntést kíván.
- Az 2024. május 6-i 1.5.0 verzió még mindig a legfrissebb kiadás, a Python 3.13 támogatás pedig kiadás nélkül ütközik a masteren. Pineld a verziót, és ne építs új automatizálást új detektorokra.
- Új repóhoz a gitleaks az egyszerűbb választás, a TruffleHog pedig az, amely megerősíti, hogy él-e még egy kulcs. A detect-secrets birtokolja az audit- és rotálási munkafolyamatot, amelyet a másik kettő nem kínál.
A detect-secrets a Yelp Apache-2.0 licenceű titkos kulcsfigyelője Git-repókhoz, és az, ami megkülönbözteti minden mástól, a baseline. Elfogadod, hogy a repóban már lehetnek titkok, rögzíted, mi van benne, és onnantól csak az újat blokkolja. Ez szándékosan lehangolt tervezés, és egy olyan kódbázisnál, amelyre senkinek nincs ideje rendrakni, továbbra is ez a jó forma. A probléma a karbantartottság: az 1.5.0-s verzió 2024. május 6-áról származik és még mindig a legfrissebb kiadás, a masteren landoló utolsó commit pedig 2026 áprilisában volt.
Ugyanoda tartozik, mint a gitleaks és a TruffleHog: a commit vagy a pipeline elé. Nem secret manager, hanem keres, blokkol, és átad egy listát a rotáláshoz. A GitHub saját secret scanningje csak a GitHubon tárolt repókat fedi le, a privát repókhoz GitHub Secret Protection kell, GitLabhez, Bitbuckethez vagy saját szerverhez pedig semmi. Hogy illeszkedik egy szkenner az ügynökök sandboxolásának történetébe, arról a coding agentek sandboxolása a CI-ban cikk szól.
Mi ez
A csomag három parancsot ad, és a README szokatlanul egyértelmű arról, melyik mikor kell. A detect-secrets scan létrehozza vagy frissíti a baseline-t, a detect-secrets-hook egy fájllistát ellenőriz vele, és nem nulla kilépési kóddal tér vissza, ha bármi új jelenik meg, a detect-secrets audit pedig egy interaktív menet, amely valódi titkosnak vagy zajnak jelöli a találatokat, és ezeket a jelöléseket visszaírja a baseline-ba.
- Python, Apache-2.0, 1.5.0 verzió, 2024. május 6-án jelent meg, 4.649 csillaggal és 573 forkkal. A PyPI-osztályozó production/stable értéket ír, ami inkább az API-ra vonatkozik, mint az ütemtervre.
- 27 detektor listáz a
--list-all-pluginskapcsolóval, három családban: regex szabályok az AWS, GitHub, GitLab, Slack, Stripe, OpenAI, npm, PyPI, Telegram, Twilio és privát kulcsok számára; entrópia-detektorok Base64 és hex stringekre; és egy kulcsszó-detektor, amely az értéket figyelmen kívül hagyja, és apasswordjellegű nevekre való hozzárendeléseket jelöli. - A szűrők a pluginek után futnak, és döntik el, mi marad:
--exclude-files,--exclude-lines,--exclude-secrets, a saját azonosítóidból álló szólista és a soron belüli pragmák. - Az ellenőrzés alapból be van kapcsolva. A felismert mintáknál a tool rákérdez a kibocsátó szolgáltatásnál, hogy valódi-e a titok. A
-n(--no-verify) kikapcsolja, a--only-verifiedpedig csak a megerősítetteket hagyja meg. - A baseline maga az egész állapot. Egy JSON-fájl a repóban, amely a plugin- és szűrőbeállításokat meg minden találat lenyomtatott ujjlenyomatát tartalmazza.
- Az audit a mérés. A jelölések miatt a
detect-secrets audit --statsmegmondja, hogy egy-egy detektor mennyire teljesít a te kódodban, és ez az egyetlen becsületes hangolási út. - Három felhasználási mód: pre-commit hook, CI-feladat a stage-elt vagy verziózott fájlokra, vagy könyvtárként a
SecretsCollectionosztályon keresztül, ha a saját eszközláncodba kell.
Hogyan működik
A motor két lépcsős. A pluginek potenciális titkokat állítanak elő, majd a szűrők és az ellenőrzési szabály dönti el, mi kerül ténylegesen a jelentésbe. A transformerek előbb normalizálják a bemenetet, ezért az INI-, YAML-, XML- és Markdown-fájlok formányonkénti külön esetek nélkül vizsgálhatók soronként. A két felet összekötő, szerializálható settings-objektum a baseline-ban utazik, így a CI-futón futó vizsgálat pontosan azt a konfigurációt használja, amelyik a fájlt a gépeden létrehozta.
Az ellenőrzés az a mechanizmus, amely eldönti, hogy használható-e a tool a gyakorlatban. A 0.12.4 óta egy plugin implementálhat verify függvényt, amely rákérdez a kibocsátó szolgáltatásnál, hogy él-e még a titok, a keyhacks projektben összegyűjtött technikákat használva. Az ellenőrzés öt sor kontextust is kap a találat előtt és után, mert az ezt alátámasztó kutatás szerint 80 százalék eséllyel megtalálható a többfaktoros titok második fele a közelben. A pontosságnövekedés nagy; az ár az egy kimenő hálózati kérés minden olyan commitnál, amely érint egy megfelelő sort.
A baseline utána elvégzi a belügyek szétválasztását. A detect-secrets scan --baseline .secrets.baseline újra átvizsgálja a fát, a fájlt a jelenlegi formátumra migrálja, hozzáadja az új találatokat, eldobja az eltűnteket, és megőrzi az audit jelöléseit, így a diff átnézhető marad. A --slim kapcsoló tovább megy, és minimalizálja a commitok közötti diffet, de ez az audit funkció ára: a karcsú baseline-okat később már nem lehet auditálni, újra kell őket gyártani.
Első lépések
A telepítés a pip install detect-secrets vagy a brew install detect-secrets. Az 1.5.0 a Python 3.8 és 3.12 közötti verziókat támogatja, a 3.6-ot és 3.7-et eldobta; a masteren már ott a Python 3.13 támogatás is, de ez egy kiadásban sincs bent, ezért 3.13 környezetben gitből kell telepíteni. A dokumentált beállítás egy pre-commit hook, aminek a baseline az argumentuma.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/Yelp/detect-secrets
rev: v1.5.0
hooks:
- id: detect-secrets
args: ['--baseline', '.secrets.baseline']
exclude: package.lock.jsonEzután egyszer hozd létre a baseline-t a repó gyökerében, és commitold be. Attól kezdve a hook minden commitnál fut, és csak azoknál a soroknál bukik el, amelyek nincsenek a fájlban. Egy régi repó első vizsgálata több ezer találatot is visszaadhat, és pontosan erre való a baseline.
pip install detect-secrets
# once, from the repository root: record what is already there
detect-secrets scan > .secrets.baseline
# after real leaks are rotated, or the repo legitimately grew
detect-secrets scan --baseline .secrets.baseline
# label findings once, then keep the labels
detect-secrets audit .secrets.baseline
# CI: fail the build on anything the baseline does not list
git diff --staged --name-only -z | xargs -0 \
detect-secrets-hook --baseline .secrets.baselineA soron belüli engedélyezés a munkafolyamat másik fele. Az a sor, amely # pragma: allowlist secret végződéssel zárul, vagy amely fölött // pragma: allowlist nextline secret áll, kimarad anélkül, hogy hozzáérne a baseline-hoz, és ez a jó eszköz egy tesztfixture-höz vagy egy dokumentációs példához. A detect-secrets scan --only-allowlisted megfordítja az ellenőrzést, és pont azokat a sorokat jelenti, így a pragma nem válhat csendben a valódi titkok búvóhelyévé.
Jel és zaj
Alapállapotban a detektorok egy általános repóra vannak hangolva, és a következő munka az, hogy a tieidre hangoljuk őket. Az audit lépés nem Formság: ez az egyetlen elérhető mérés, és kézzel végzik.
- Generáld a baseline-t, majd jelölj egy reprezentatív mintát a
detect-secrets auditparanccsal. A lista többi pontja enélkül nem működik. - Olvasd el a statisztikát. Azokat a detektorokat, amelyek nagyrészt zajt termelnek, kapcsold ki a
--disable-pluginkapcsolóval, vagy szűkítsd a--exclude-filesés--exclude-linesszabályokkal. - Ne detektorokat törölj, hanem az entrópia-küszöböket told: a
--base64-limitalapértéke 4.5, a--hex-limitértéke 3.0, és ez a két tekerő, amit a tool ad. - Adj hozzá saját azonosítólistát a
--word-listkapcsolóval, ehhez adetect-secrets[word_list]extra kell. - Érdemes megfontolni az opcionális gibberish modellt azokhoz a titkokhoz, amelyek szónak látszanak. Alapból nincs bekapcsolva, mert a
passwordjellegű értékeket is átugorja. - Minden változtatás után futtasd újra a vizsgálatot a
--baselinekapcsolóval, és olvasd el a baseline-fájl diffjét. A kisebb diff kevesebb zajt jelent, nem kevesebb titkot.
A rotálási munkafolyamat
A harmadik parancs fizeti meg a hangolást, és nem új dolgot keres. Az audit jelölések is_secret értéket írnak a baseline-ba; a --report kapcsolóval együtt ebből jön ki az a lista, amelyen a repóban még meglepő titkok vannak, és amelyeket cserélni kell. Ez a lista alakítja a vizsgálatot tulajdonossal és határidővel rendelkező biztonsági feladattá.
- Előbb jelölj, aztán riportálj. A baseline-ban valódi titkosként megjelölt találat egy migrációs lista bejegyzése.
- A szolgáltatónál rotálj, ne a repóban. A fájl törlése nem változtat semmit azon, hogy a kulcs működik-e.
- Utána futtasd újra a
--baselinekapcsolóval. A találat eltűnik a fájliból, és ez a diff bizonyítja, hogy a migráció kész van. - A history vizsgálatát tartsd külön. A tool soha nem néz bele régi commitokba, az átírás vagy az egyszeri history-scan más feladat.
Ez az a belügyek szétválasztása, amit a README leír, és még mindig a legjobb érv a tool mellett. Nem követeli meg, hogy rendrakd a repót, mielőtt hasznossá válik, és pont ezt követelik meg azok a szkennerek, amelyeket utólag tesznek egy megnövekedett kódbázisra.
Hol csúszik el
A gyengeségek strukturálisak, nem kosmetikaiak. Több soros titkot nem talál, és olyan alapértelmezett jelszót sem, amelyet a kulcsszó-detektor nem ismer, és ezt a README a Caveats szakaszban ki is mondja. A git-históriát szándékosan nem vizsgálja, így egy évekkel ezelőtt commitolt, majd törölt titok láthatatlanok számára. Az egyedi plugineket egy tetszőleges fájl importálásával tölti be, amit a plugin-dokumentáció maga is biztonsági feltételezésként jelöl. A projekt pedig karbantartási módban van: az 1.5.0 a 2024. május 6-áról még mindig a legfrissebb tag, a Python 3.13 támogatás 2025 januárja óta a masteren ütközik, és a hibajegyben 184 nyitott tétel várakozik.
| Jellemző | detect-secrets | gitleaks | TruffleHog |
|---|---|---|---|
| Licenc | Apache-2.0 | MIT | AGPL-3.0 |
| Nyelv | Python | Go | Go |
| Felismerési modell | 27 detektor: regex, entrópia, kulcsszónevek | TOML szabálykészlet, regex és entrópia, szabályonként bővíthető | Több mint 800 osztályozott hitelesítő adattípus |
| Ellenőrzés | Igen, felismert mintánként hálózati hívás | Nem | Igen, bejelentkezik, hogy ellenőrizze, él-e a titok |
| Mit olvas | A munkafában verziózott git-fájlok, plusz a könyvtár API-ja | git log -p patchek, könyvtárak, stdin | Git, GitHub, GitLab, S3, GCS, Docker, Jenkins, Elasticsearch és mások |
| Ismert állapot | Elfogadott találatok: egy becommitolt, auditált baseline | Találatok egy riportfájlból baseline útként | Eredményszűrés, baseline fogalom nélkül |
A lényeges összehasonlítás az, hová megy a munka. A gitleaks egyetlen Go bináris, kiváló TOML szabályformátummal, gyorsabban bevezethető, és a szerzője ma már nyíltan kimondja, hogy a projekt feature complete, csak biztonsági javításokat kap, az új munka pedig másik projektbe költözött. A TruffleHog a másik irány: valós API-k ellen ellenőrizi a hitelesítő adatokat, és ez az egyetlen módja biztosan megmondani, hogy egy találat sürgős, ezt pedig körülbelül 800 adattípussal és AGPL-3.0 licencsel fizeti meg, amelyet egyes jogi osztályok nem írnak alá. A detect-secrets cserébe a szélességet adja fel az egyetlen munkafolyamat kedvéért, amely másoknál nincs: egy auditált, becommitolt lista arról, mi ismert már, és a kivezetés róla.
Foglalat
Vedd fel, de infrastruktúraként, nem projektként. A baseline modell a helyes válasz egy több éves előzményekkel rendelkező repóhoz, ahol nincs keret a rendrakásra, és azt az artefaktumot állítja elő, amit egy biztonsági átnézés valójában kér: egy listát a rotálandó kulcsokról. Nem ez a tool az új repóhoz, ahol a gitleaks egyszerűbb, és nem az a csapaté, amelynek tudnia kell, hogy egy kiszivárgott kulcs még működik-e, az a TruffleHog dolga.
- Akkor válaszd, ha a repóban már vannak titkok, a history nem írható újra, és a cél a vérzés leállítása egy migrációs projekt indítása nélkül.
- Tartsd a baseline-t a repóban, és a diffjét vidd be a review-ba. A magyarázat nélkül változó baseline az a hibaforma, amit figyelni kell.
- Egy napot szánj a hangolásra. A tool pontosan olyan jó, mint a jelölt baseline, és a jelölés kézi munka.
- Egészítsd ki szerveroldali vizsgálattal, ne helyettesítsd. A detect-secrets egy fejlesztő gépén blokkol; valaminek a már becommolt dolgokat is át kell néznie.
- Ne építs új automatizálást arra a feltételezésre, hogy a detektorok még szaporodnak. Pineld az 1.5.0-ot, olvasd a mastert, ha Python 3.13 kell, és tervezz utódot, ha a projekt csendes marad.
Források
- Yelp/detect-secrets: README and usage
- Yelp/detect-secrets: CHANGELOG (v1.5.0, 6 May 2024)
- Yelp/detect-secrets: plugin and verification documentation
- detect-secrets 1.5.0 on PyPI
- Yelp/detect-secrets: releases
- Gitleaks README (MIT, Go)
- TruffleHog README (AGPL-3.0, credential verification)
- GitHub Docs: About secret scanning
- betterleaks/betterleaks
Gyakori kérdések
Mi az a .secrets.baseline, és miért commitolják be?
Egy JSON-fájl, amely felsorolja az összes aktuálisan talált titkot, a plugin- és szűrőbeállításokkal, valamint találatonként egy lenyomattal együtt. A becommitolás stabil hivatkozást ad a pre-commit hooknak: ami már szerepel a listán, azt figyelmen kívül hagyja, ami új, az megbuktatja a commitot. Ugyanakkor ez a migrációs lista is, mert a detect-secrets audit megjelöli, mely bejegyzések valódi titkok.
A detect-secrets megtalálja a titkokat a git historyban?
Nem, és ez szándékos: a munkafában verziózott fájlokat vizsgálja, így egy évekkel ezelőtt commitolt, majd eltávolított hitelesítő adatot nem lát. A README ezt azzal indokolja, hogy nem kell minden futáskor végigmenni a historyn. A historyhoz külön, egyszeri gitleaks- vagy TruffleHog-scan kell, majd egy átírás, ha a titok valaha érvényes volt.
Mit csinál a --only-verified és a --no-verify?
Alapértelmezés szerint a tool minden találatot ellenőrizni próbál úgy, hogy rákérdez a kibocsátó szolgáltatásnál, a keyhacks projekt technikáit használva. A --only-verified csak a szolgáltatás által megerősített hitelesítő adatokat jelenti, ami pontos, de kimenő hálózati hozzáférést kíván; a -n (--no-verify) teljesen kikapcsolja az ellenőrzést, és ezt kell elszigetelt CI-futónál.
Még karbantartják a detect-secrets-et?
Stabil, de csendes: az 2024. május 6-i 1.5.0 egyszerre a legfrissebb kiadás a PyPI-n és a legújabb GitHub-tag. A commitok ritkán érkeznek, a masteren legutóbbi 2026. áprilisi, a Python 3.13 támogatás pedig 2025 januárjában került be kiadás nélkül. Kezeld karbantartottként, ne fejlesztettként, pineld az 1.5.0-ot, és olvasd a masteret, ha az újabb Python kell.