Motivace
V návaznosti na zákon o kybernetické bezpečnosti a s cílem zlepšit bezpečnost aplikací, je potřeba ve firmách zavádět principy DevSecOps. Přičemž, jednou z klíčových aktivit DevSecOps je skenování kontejnerových image na známé zranitelnosti a chyby (CVE – Common Vulnerabilities and Exposures).
Největší výzvou v tomto procesu je práce se závislostmi třetích stran, které jsou často achillovou patou bezpečnosti aplikací. Tyto závislosti jsou obtížně udržovatelné a jejich aktualizace či nahrazení může být technicky náročné. To je zvláště problematické u legacy aplikací, které nejsou aktivně vyvíjené, případně mohou být infiltrovány škodlivým kódem, jak se již několikrát v minulosti stalo.
Problém skenování a řešení
Automatizované skenování obsahu image repozitáře a pravidelné reporty pro maintainery repozitářů jsou jen jedním krokem (Software Bill of Materials – SBOM). Hlavním problémem je, že reporty často obsahují velké množství záznamů o zranitelnostech, jejichž manuální řešení je pro vývojáře nereálné. Počet CVE v čase narůstá, nebo se jejich charakter mění, což situaci dále komplikuje.
Protože práce v oblasti DevSecOps je svou povahou nikdy nekončící – tzv. Sisyfovská práce, jejíž konec je závislý na poklesu zájmu kyberbezpečnostních útočníků o danou technologii – je jediným efektivním přístupem maximální automatizace. Tato automatizace zahrnuje testování, nasazení principů DevSecOps a implementaci technologií strojového učení (AI).
Automatizace testování
Základem prevence a mitigace zranitelností je kvalitní psaní unit testů, případně i integračních, smoke, regresních a dalších testů. Tyto testy zajišťují, že po aktualizaci nebo nahrazení závislostí nedojde k narušení funkčnosti aplikace. Pokud k narušení funkčnosti dojde, musí být vývojáři včas upozorněni, aby mohli provést potřebné úpravy.
Z hlediska mitigace CVE se jeví jako velmi účinný přístup Test-Driven Development (TDD). Tento přístup spočívá v tom, že nejprve vytvoříte testy pro požadovanou funkcionalitu a teprve následně implementujete samotný kód. Nicméně ne vždy je TDD použitelné a tak je potřeba případ od případu zvolit způsob vývoje a testování software.
Využití AI při testování
Strojové učení (AI) může být významným pomocníkem při psaní testů. Například nástroje jako GitHub Copilot mohou generovat testy i v kontextu TDD. Pokud vývojáři smysluplně pojmenovávají funkce a používají jasné komentáře, mohou tyto nástroje výrazně zrychlit práci. Přestože se nejedná o plnohodnotnou náhradu lidské kontroly, AI může výrazně usnadnit řešení opakujících se problémů, které již někdo v minulosti vyřešil a zdokumentoval.
Integrace do CI/CD procesů
Aby bylo možné zajistit konzistentní kvalitu kódu, měli by vývojáři používat nástroje, které analyzují kód již při jeho tvorbě. Příkladem jsou pre-commit hooks, které provádějí základní analýzy ještě před samotným odesláním změn do verzovacího systému. V poslední fázi je však nutné tyto nástroje začlenit do CI/CD pipeline, kdy například v samostatné stage dojde ke spuštění skenovacího nástroje, jako je třeba Trivy, které umí nejen vytvořit report s CVE, ale i SBOM. Následné parsování výstupů může spustit další kroky, jako založení tiketu pro řešení kritických problémů v podnikovém systému a data následně uložit třeba do ElasticSearch.
Pipeline by měla obsahovat:
- Skenování CVE
- Vytvoření SBOM
- Skenování secretů
- V separátní DEV větvi by mohl běžet proces pro automatické aktualizace závislostí, který by po jejich provedení spustil příslušné testy a po dokončení vývoje zajistil aktualizaci závislostí v již hotovém softwaru.
Tento přístup umožňuje kontinuální zabezpečení aplikací bez ohledu na rostoucí počet zranitelností.
Závěr
Zavedení DevSecOps spolu s automatizací a využitím AI je jedinou smysluplnou cestou, jak čelit výzvám spojeným s rostoucím počtem zranitelností. Kombinace kvalitního testování, principů TDD, moderních AI nástrojů a robustních CI/CD procesů nám pomůže udržet bezpečnost našich aplikací na vysoké úrovni, a to i při jejich dlouhodobém používání.