Secure CI/CD Pipeline with TRIVY (gitlab ci/cd)

H. Alperen Selcuk
4 min readFeb 5, 2024

--

bu yazımda trivy ile nasıl güvenli bir ci/cd pipelinenı yapabilceğinizi anlatacağım.

trivy open source bir security scanning toolu. eğer ci/cd pipelinenız varsa bu toolu 2 adımda kullanmanız daha güvenli bir build ve deployment yapmanıza yarayacaktır.

trivy file scan

trivy sizin mevcutta bulunan dosyalarınızı tarayarak herhangi bir vulnerability var mı onu söyler. file scan özelliğini ci/cd aşamasının başında dosyaları repodan çektiğinizde yapmalısınız.

yaptığınız pipeline türüne göre ister bir container içinde çalıştırın isterseniz agent a bir binary yükleyerek çalıştırın ikisi de sorunsuz çalışır.

ben gitlabci kullanacağım ve işlemleri docker container üzerinde yapacağım bu yüzden kullanacağım yaml bu formatta olacak.

filescan: 
stage: filescan
image:
name: aquasec/trivy:latest
entrypoint: [""]
script:
- trivy fs --exit-code 1 --severity CRITICAL .

bu işlem build almadan önce yapacağım. herhangi bir CRITICAL yakalarsam pipeline crash olacak.

pipeline çalıştırdığımda herhangi bir vulnerability bulmadığından sorunsuzca geçti.

trivy image scan

trivynin en çok kullanıldığı yerlerden biri de docker image scaning yani image halini almış bir container ı tarayabilir ve vulnerability bulabilir.

imagescan: 
stage: imagescan
image:
name: aquasec/trivy:latest
entrypoint: [""]
script:
- trivy image $DOCKER_REGISTRY_USER/$DOCKER_REGISTRY_REPO:$VERS --exit-code 1 --severity CRITICAL

kullanacağım yaml bu şekilde olacak. build image sonrası registrydeki image ı tarayacak eğer critical bulursa pipeline duracak.

pipeline çalıştırdığımda tekrar image scaning crash oldu. critical bir vulnerability buldu CVE code u ve detayını birlikte veriyor. sağda title sekmesinden nasıl düzeltileceğini de bulabilirsiniz.

gördüğünüz gibi pipeline durdu bu zaafiyetleri giderene kadar da geçmeyecek. eğer bu şekilde bir pipeline kurgularsanız developerlar codelarını sürekli ve güncel tutarlar çünkü pipeline zaafiyet bulmayana kadar deployment yapmayacak.

sizin burda yapmanız gereken bu pipelinein crash oldugunu vulnerabilitylerle birlikte notification olarak göndermek.

bu yüzden de çıktıyı bir formatta almanız gerek burda da json kullanabilirsiniz.

ekleyeceğiniz flag ise -o

trivy image -f json -o results.json $DOCKER_REGISTRY_USER/$DOCKER_REGISTRY_REPO:$VERS --exit-code 1 --severity CRITICAL

ama daha farklı bir görünüm istiyorsanız trivy nin templatelerini kullanabilirsiniz. html olarak bile güzel bir çıktı hazırlıyor size.

şimdi pipeline şöyle yapacağız.

imagescan: 
stage: imagescan
image:
name: aquasec/trivy:latest
entrypoint: [""]
script:
- trivy image --exit-code 1 --ignore-unfixed --format template --template "@/contrib/html.tpl" -o report.html --severity CRITICAL $DOCKER_REGISTRY_USER/$DOCKER_REGISTRY_REPO:$VERS
cache:
key: trivy-cache
paths:
- .cache
artifacts:
name: "Container Scan Report ${CI_COMMIT_SHA}"
paths:
- report.html
expire_in: 7 days

burda html tepmlate i kullandık ve bu çıktıyı alabilmek için cache ve artifacts kullandık. artifacts bizim html report umuzu jobdan dışarıya export etmemize yarıyor.

pipeline sorunsuz geçti bu demek oluyor ki imageda herhangi bir CRITICAL yok.

job un detayını açarsak artifactı görebiliriz, ister indirebilirsiniz isterseniz browse diyerek görebilirsiniz.

browse diyerek rapora baktığımızda.

burda herhangi bir vuln bulamamasına eklediğimiz flagler de sebep olabilir. eğer sert bir security uygulamak istiyorsanız ignore-unfixed flagini kaldırmanız gerek.

- trivy image --exit-code 1 --format template --template "@/contrib/html.tpl" -o report.html --severity CRITICAL $DOCKER_REGISTRY_USER/$DOCKER_REGISTRY_REPO:$VERS

bir de bu şekilde çalıştıralım;

buldugunu göreceksiniz. bu report u mailden ya da başka bir notification kanalından yollayabilirsiniz.

faydalı bir yazı olmuştur umarım. görüşmek üzere

h.a.s.

beni linkedinden takip etmek için: https://www.linkedin.com/in/hasanalperenselcuk/

--

--