Nejjednodušší způsob, jak najít zranitelnosti v obrázcích Docker pomocí Snyk

Photo of author

By etechblogcz

Snyk je nástroj zaměřený na analyzování slabých míst v kódu a konfiguračních souborech infrastruktur, včetně těch, které se objevují v kontejnerech a aplikačních balíčcích.

Snyk primárně funguje jako cloudová platforma, avšak nabízí i další rozmanité produkty.

Snyk OpenSource se integruje do Git workflow prostřednictvím rozhraní příkazové řádky (CLI). Po aktivaci software detekuje potenciální zranitelnosti, kategorizuje je podle stupně závažnosti a automaticky řeší známé bezpečnostní nedostatky. Tato funkce je implementovatelná do procesu pull request, což umožňuje kontrolu kódu před jeho nahráním do repozitáře.

Snyk Infrastructure as Code se naopak zaměřuje na analýzu a opravu zranitelností v konfiguračních souborech JSON a YAML pro Kubernetes. Zde modul pravidel umožňuje nastavit citlivost detekcí v rámci Git repozitářů na základě parametrů definovaných administrátory.

Snyk Container umožňuje prověřovat dockerové obrazy a související registry během jejich vytváření i následně. Program je možné integrovat do CLI, SCM, CI nástrojů, registrů kontejnerů a Kubernetes.

Nyní si ukážeme, jak lze využít Snyk Container, který je součástí Dockeru, k odhalování zranitelností.

Ukázkový Dockerfile

Pro využití Snyku k detekci zranitelností potřebujete nejdříve dockerový obraz. V našem příkladu použijeme následující Dockerfile:

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
EXPOSE 8000 CMD
[“python”, “app.py”]

Nejprve si musíme lokálně vygenerovat obraz pomocí následujícího příkazu:

docker build -t 0xyz0/python-app .

Nyní máme obraz připravený k analýze.

Skenování obrazu z Docker klienta

Integrace Snyku s Dockerem tento proces značně usnadňuje. Pro zahájení skenování stačí spustit tento příkaz:

docker scan 0***0/python-app

Následně proběhne analýza, která vrátí více či méně obsáhlý výstup, dle počtu nalezených zranitelností, a závěrečné shrnutí:

Docker scan zobrazí všechny zranitelnosti v obraze.

Jak vidíte, nástroj nejenže informuje o počtu nalezených zranitelností, ale také, při prozkoumání výstupu, o jejich povaze a stupni kritičnosti, a navíc poskytuje doporučení ohledně základního obrazu, který byste měli použít.

Podrobnosti o zranitelnostech můžete rovněž ověřit v databázi zranitelností Snyk.

V mém případě mi systém nabízí několik alternativ, takže upravím svůj Dockerfile dle první možnosti:

FROM python:3.7.11-slim

ADD . /code

WORKDIR /code

RUN pip install -r requirements.txt

EXPOSE 8000

CMD ["python", "app.py"]

Pokud obraz znovu sestavím a naskenuji:

docker build -t 0***0/python-app . && docker scan 0***0/python-app

Uvidíte, že výstup nyní vykazuje méně zranitelností a upozorní vás, že v současné době používáte bezpečnější základní obraz:

Docker scan ověřuje, že používáte nejbezpečnější základní bitovou kopii

Podrobnější report lze získat i přidáním Dockerfile, ze kterého obraz vznikl, do příkazu:

docker scan -f Dockerfile 0***0/python-app

Dokonce je možné vyloučit základní obraz z analýzy, pokud se chcete zaměřit na potenciální chyby ve vlastním kódu:

docker scan -f Dockerfile --exclude-base 0***0/python-app

Tuto službu lze také integrovat s repozitáři Docker Hub:

Nicméně, pro tuto integraci je nutné mít jedno z placených předplatných. S bezplatnou verzí lze Snyk spouštět lokálně, stačí se pouze přihlásit do Docker Hub (s jasnými limity pro skenování). To je užitečné zejména při vývoji nebo ověřování bezpečnosti obrazu třetí strany před jeho použitím.

Využití Snyku s Github Actions

Nejprve je potřeba vytvořit repozitář a uvnitř něj adresář:

.github / worflows /

Pro použití Snyk Container v Github Actions je nutné buď vytvořit nový obraz, nebo použít existující obraz z Docker Hub. Pro integraci se Snykem je třeba vytvořit nové tajemství s názvem SNYK_TOKEN. Pro získání tokenu je nutné si založit účet u Snyku. Token lze rychle vygenerovat v obecných nastaveních API Token.

S pomocí tokenu je možné vytvořit tajemství na Githubu a použít ho v akci. Dále je třeba definovat název repozitáře, který byl vytvořen v Docker Hub, a zprávu, která má být odeslána. Je možné přistupovat k výstupům kroků, které lze následně použít jako proměnné ve zprávě.

with:
args: 'A new commit has been pushed. Please verify github action:
| worflow $ {{fromJson (steps.repo.outputs.result) .html_url}} / actions
| Exec: $ {{steps.prep.outputs.created}}
| Version: $ {{steps.prep.outputs.version}} '

Jak spustit celý workflow? Jednoduše – pouhým odesláním (pushem) do masteru. Github Action automaticky detekuje soubor uvnitř .github / workflows /.

Závěrem 👈

S nárůstem popularity kontejnerů se stále častěji objevují případy bezpečnostních incidentů, přičemž většina je způsobena chybami v konfiguraci při nasazování kontejnerů. Snyk poskytuje efektivní a srozumitelný nástroj, který nám pomůže vyhnout se chybám v konfiguraci a odhalit nejběžnější zranitelnosti v dockerových obrazech.