Bezpečnost CI/CD
Jak zastavit exfiltraci z GitHub Actions pomocí egress policy
Job v CI má k dispozici tajné údaje a spouští kód, který před minutou stáhl: akce, balíčky a jejich instalační skripty. Pokud je cokoli z toho škodlivé, nejsnazší způsob, jak tajné údaje ukrást, je poslat je na server. Egress policy rozhoduje, na které servery job smí dosáhnout, a zbytek blokuje.
Aktualizováno
Jak tajné údaje unikají z jobu v CI
Job má přístup k tokenu repozitáře, k tajným údajům, které mu byly předány, a ke všem cloudovým přihlašovacím údajům, které převezme. Kód, který v jobu běží, je může přečíst. Ven je pak může dostat několika způsoby:
- Přes síť. Požadavkem na server, který ovládá útočník. To je kanál, který egress policy uzavírá.
- Přes logy. Vypsáním tajných údajů, často zakódovaných, do logu jobu. V březnu 2025 CISA uvedla, že kompromitovaná akce tj-actions/changed-files vyzradila tajné údaje právě takto.
- Přes výstupy. Artefakty, cache nebo commity pushnuté s tokenem jobu.
Nemusí jít o škodlivý balíček. AI agenta ve workflow může obrátit prompt injection skrytá v issue nebo pull requestu a ten pak použije stejné kanály.
Co egress policy dělá
Většina jobů potřebuje dosáhnout na krátký seznam cílů: registry balíčků, registry kontejnerů, hostitele zdrojového kódu a několik služeb. Egress policy tento seznam povolí a vše ostatní zablokuje. S politikou default deny požadavek na neznámého hostitele selže a tajné údaje zůstanou v jobu.
Nezavře ale všechny dveře:
- Nezabrání vypsání tajných údajů do logů. Udržujte logy soukromé a připínejte akce na SHA commitů.
- Cíl, který povolíte, může data stále vynášet, takže allowlist udržujte úzký.
- Neřekne vám, které balíčky byly škodlivé. To je úkol kontroly balíčků a SBOM.
Tři způsoby, jak ji vynutit
- Agent na runneru. StepSecurity Harden-Runner se přidává jako první krok jobu. Přiřadí každé spojení ke kroku, který ho navázal, v režimu auditu vytvoří výchozí stav a blokuje odchozí provoz ke všemu, co není na allowlistu.
- Runner s vestavěnou politikou. CRACI vynucuje politiku jako samotný runner. Síťové kontroly nabízejí i jiní poskytovatelé runnerů, například filtrování odchozího provozu na linuxových runnerech Depot a blokující nebo poradní egress policy na Namespace.
- Vaše vlastní síť. Vlastní (self-hosted) runnery za firewallem nebo proxy, které sami konfigurujete a udržujete.
Zavedení bez rozbitých buildů
- Sledujte. Během několika běhů zaznamenejte každé spojení, které job naváže.
- Povolte. Sestavte allowlist z toho, co job skutečně potřebuje.
- Blokujte. Přepněte na default deny a sledujte porušení.
- Vyhodnocujte. Každé nové porušení berte buď jako chybějící zdroj, nebo jako incident.
Jak to dělá CRACI
Na CRACI je egress policy součástí runneru. Ověřuje se před spuštěním jobu, neznámá pole jsou odmítnuta a při selhání vše zablokuje (fail-closed). Vestavěné předvolby pokrývají běžné zdroje balíčků, vlastní zdroje a spojení doplní zbytek. Záznam jobu uvádí každé spojení a každé zablokované jako porušení i s důvodem. Protože proxy rozumí balíčkům, stává se stejný záznam SBOM daného jobu. API vrací SBOM, síťové záznamy a údaje o původu.
CRACI zatím nemá samostatný režim auditu; je v plánu vývoje. Bez síťové politiky je provoz jobu povolen a zaznamenán v záznamu jobu, takže vidíte, co politika potřebuje, ještě než ji začnete vynucovat. CRACI spouští joby GitHub Actions na Linuxu. Viz srovnání nástrojů pro bezpečnost CI/CD a CRACI vs StepSecurity.
Egress policy v CI: časté dotazy
Co je politika odchozího provozu (egress policy) v CI?
Sada pravidel pro odchozí síťová spojení, která smí job v CI navázat. Job dosáhne na registry balíčků a služby, které potřebuje, a každý jiný cíl je zablokován.
Zastavila by egress policy kompromitaci tj-actions?
Sama o sobě ne. CISA v tomto případě uvedla, že tajné údaje unikly přes logy workflow, nikoli odesláním na externí server. Egress policy uzavírá síťový kanál; připnutí akcí na SHA commitů a soukromé logy řeší kanál logů.
Rozbije blokování odchozího provozu buildy?
Může, pokud politika vynechá zdroj, který build potřebuje. Začněte tím, že zaznamenáte, kam se job připojuje, z toho sestavte allowlist a teprve potom blokujte. Na CRACI pokrývají běžné zdroje balíčků vestavěné předvolby a zablokované spojení se v záznamu jobu zobrazí i s důvodem.
Mohu použít egress policy na runnerech hostovaných na GitHubu?
Ano, s agentem přidaným do jobu, například StepSecurity Harden-Runner. Nebo job přesuňte na runner, který politiku vynucuje sám, například CRACI.
Dejte jeden job za egress policy
Spusťte jedno workflow na CRACI a podívejte se na každé spojení, které navázalo, na hostitele, které by potřebovalo na allowlistu, a na SBOM toho, co stáhlo.
Rezervujte si demo