Bu yazı, Trivy Container Scanner kullanarak Docker image’larınızı potansiyel güvenlik açıklarına karşı güvence altına almak için gerekli adımları kapsamaktadır.

Trivy Nedir?

Trivy, container’lar ve diğer artefact’lar için güvenlik açıklarını tarayan open-source bir güvenlik tarayıcısıdır. İçerisinde trivy-db adı verilen dahili bir veritabanı barındırır ve bu veritabanı farklı güvenlik açıkları hakkında bilgiler içerir. Trivy, AquaSecurity tarafından geliştirilmiştir ve bakımını AquaSecurity tarafından üstlenilmiştir.

Trivy’nin en dikkat çekici özelliklerinden biri, yalnızca güvenlik açıklarını taramakla kalmayıp, aynı zamanda bu sorunları çözmek için önerilerde bulunması ve daha fazla bilgi için güvenlik açıklarına yönelik bağlantılar sunmasıdır.

Trivy, farklı güvenlik açıkları veritabanlarından geniş bir yelpazede bilgiye erişebilir ve bu veritabanlarından elde edilen güvenlik açıkları verilerini kullanarak güvenlik sorunlarını tespit eder. Bu veritabanlarından bazıları, National Vulnerability Database (NVD), Red Hat Security Data ve Alpine SecDB‘dir.

Trivy tarama işlemi sırasında, dizin veya Docker image’larınızın yazılım paketlerini ve kütüphanelerini güvenlik açığı veritabanındaki bilgilerle karşılaştırır. Eğer bir eşleşme bulunursa, bu durumda container image’ınızdaki paket veya kütüphanede bir güvenlik açığı olduğu anlamına gelir. Trivy, bu güvenlik açıklarını tespit ettikten sonra, etkilenen sürümler, ciddiyet seviyesi ve çözüm önerileri gibi detaylı bilgilerle birlikte raporlar.

Trivy, veritabanını her 6 saatte bir günceller. Tarama başlatıldığında, Trivy veritabanlarını otomatik olarak günceller, böylece kullanıcıların veritabanı güncellemelerini takip etmeleri gerekmez.

Trivy’nin bir diğer önemli özelliği ise SBOM (Software Bill of Materials) oluşturabilmesidir. SBOM, yazılımda kullanılan tüm bileşenlerin detaylı bir envanterini sağlar; buna open-source ve üçüncü parti kütüphaneler de dahildir.

Daha fazla detay ve güvenlik açıkları hakkında kapsamlı bilgiye ulaşmak için Trivy’yi projelerinizde kullanmayı ihmal etmeyin. Özellikle Kubernetes, Docker ve container odaklı DevOps süreçlerinizde Trivy gibi güçlü araçlar, güvenlik standartlarınızı yükseltmek için büyük bir avantaj sağlar.

Trivy Kurulumu

Aşağıdaki adımları izleyerek Trivy’yi kurabilirsiniz.

Diğer platformlar için lütfen resmi kurulum sayfasını ziyaret edin.

Adım 1: Trivy için gerekli bağımlılıkları aşağıdaki komut ile yükleyin:

sudo apt-get install wget apt-transport-https gnupg lsb-release

Adım 2: Aşağıdaki komutları kullanarak public key ve Trivy reposunu indirin:

wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null

echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list

Adım 3: Repoyu güncellemek için aşağıdaki komutu çalıştırın:

sudo apt update -y

Adım 4: Trivy’yi aşağıdaki komut ile yükleyin:

sudo apt install trivy

Kurulumu doğrulamak ve mevcut tüm seçenekleri görmek için aşağıdaki trivy help komutunu çalıştırın:

trivy -h

Aşağıdaki gibi bir çıktı almanız gerekir:

trivy -h
Scanner for vulnerabilities in container images, file systems, and Git repositories, as well as for configuration issues and hard-coded secrets

Usage:
  trivy [global flags] command [flags] target
  trivy [command]

Examples:
  # Scan a container image
  $ trivy image python:3.4-alpine

  # Scan a container image from a tar archive
  $ trivy image --input ruby-3.1.tar

  # Scan local filesystem
  $ trivy fs .

  # Run in server mode
  $ trivy server

Scanning Commands
  aws         [EXPERIMENTAL] Scan AWS account
  config      Scan config files for misconfigurations
  filesystem  Scan local filesystem
  image       Scan a container image
  kubernetes  [EXPERIMENTAL] Scan kubernetes cluster
  repository  Scan a remote repository
  rootfs      Scan rootfs
  sbom        Scan SBOM for vulnerabilities
  vm          [EXPERIMENTAL] Scan a virtual machine image

Management Commands
  module      Manage modules
  plugin      Manage plugins

Utility Commands
  completion  Generate the autocompletion script for the specified shell
  convert     Convert Trivy JSON report into a different format
  help        Help about any command
  server      Server mode
  version     Print the version

Flags:
      --cache-dir string          cache directory (default "/Users/bibinwilson/Library/Caches/trivy")
  -c, --config string             config path (default "trivy.yaml")
  -d, --debug                     debug mode
  -f, --format string             version format (json)
      --generate-default-config   write the default config to trivy-default.yaml
  -h, --help                      help for trivy
      --insecure                  allow insecure server connections
  -q, --quiet                     suppress progress bar and log output
      --timeout duration          timeout (default 5m0s)
  -v, --version                   show version

Use "trivy [command] --help" for more information about a command.

Trivy Kullanarak Güvenlik Açıklarını Taramak

Trivy komutunu güvenlik açıklarını taramak için çalıştırdığınızda, Trivy öncelikle ilgili veritabanını indirir ve bu verileri mevcut veritabanındaki güvenlik açıkları ile karşılaştırır.

Trivy, güvenlik açığı risklerini critical, high, medium ve low olarak sınıflandırır:

  • Critical – En ciddi güvenlik açığıdır ve sistem üzerinde yönetimsel kontrol sağlanmasına olanak verebilir. En kısa sürede düzeltilmesi gerekir.
  • High – Veri sızıntısına neden olabilir.
  • Medium – Sistemin kullanıcılar için erişilemez hale gelmesine yol açabilir.
  • Low – Düzenli bakım sırasında çözülebilecek sorunlardır.

Trivy ile Tarama Yapılabilecek Hedefler:

  • Container image’ları
  • Dosya sistemi
  • Uzak Git Repoları

Aşağıdaki görsel, high level component’leri ve container tarama flow chart’ını göstermektedir.

trivy

Trivy Kullanarak Container Image’larını Taramak

Docker image’larını Trivy kullanarak taramak oldukça kolaydır. Sadece taramak istediğiniz image adını belirterek aşağıdaki Trivy komutunu çalıştırmanız yeterlidir:

trivy image <image-name>

Örnek Kullanım

Örneğin, workspace’imde techiescamp/pet-clinic-app adında bir image var. Bu, Java Spring Boot uygulaması içeren bir Docker image’ı.

Bu image’ı aşağıdaki komutla tarayabilirim. Trivy, image içindeki güvenlik açıklarının yanı sıra image’a dahil olan Java JAR dosyasındaki açıkları da tarar. Taramanın sonuçları, okunabilir bir formatta görüntülenir:

trivy image techiescamp/pet-clinic-app:1.0.0
image

Tarama, Docker image içindeki JAR dosyasında 2 adet yüksek güvenlik açığı olduğunu gösterdi.

image 1

Belirli Bir Seviyede Güvenlik Açığı Taraması

Trivy, çeşitli şekillerde kullanılabilir. İşte bazı gelişmiş kullanım örnekleri:

Trivy, belirli bir seviyedeki güvenlik açıklarını tarayabilir. Bunun için --severity <severity> flag’ini kullanarak taramak istediğiniz güvenlik açığı seviyesini belirtebilirsiniz.

trivy image --severity CRITICAL techiescamp/pet-clinic-app:1.0.0

JSON Formatında Çıktı Alma

Trivy, sonuçları JSON formatında da verebilir. Bunun için --format json flag’ini kullanarak tarama sonuçlarını JSON formatında görüntüleyebilirsiniz.

trivy image --format json techiescamp/pet-clinic-app:1.0.0

Düzeltilemeyen Güvenlik Açıklarını Yoksayma

Bazı güvenlik açıkları, paketler güncellense bile düzeltilemez (patch edilmemiş/açık kalmış). Trivy, bu tür güvenlik açıklarını yoksayarak image taraması yapabilir. Bunun için --ignore-unfixed flag’ini kullanabilirsiniz.

trivy image --ignore-unfixed java:0.1

Docker Tar Formatındaki Image’ları Tarama

Docker image’larını tar formatında da saklayabilirsiniz. Bu durumda Trivy’yi, tar formatındaki image’ları taramak için kullanabilirsiniz.

trivy image --input petclinic-app.tar

Trivy Scanner ile Build Docker Image Pipeline Oluşturma Süreçleri

Trivy, Docker image inşası açısından CI/CD pipeline’ında kritik bir rol oynamaktadır. Şirketler, production’da depoloy edilen image’ın güvenliğini sağlamak için CI/CD pipeline’larında güvenlik açıklarını taramak üzere Trivy kullanabilmektedir.

CI/CD pipeline’ında kullanıldığında, eğer image’da herhangi bir güvenlik açığı bulunursa pipeline job’ını başarısız olması gerekmektedir. Bu durum, şirketin güvenlik önemleri ile alakalıdır. Örneğin, bazı şirketler yüksek (HIGH) ve kritik (CRITICAL) seviyeler için derlemenin başarısız olması konusunda katı yönergelere sahip olabilir.

Açık Bulduğunda Build’in Başarısız Olmasını Sağlama

Build’in başarısız olmasını sağlamak için exit kodları kullanılmalıdır. Bunun için Trivy komutuyla --severity ve --exit-code 1 flag’lerini kullanabilirsiniz. Aşağıdaki örnekte olduğu gibi, belirlenen seviyeler için herhangi bir güvenlik açığı bulunursa Trivy’nin sıfır olmayan bir exit koduyla çıkmasını sağlayacaktır:

trivy image --severity HIGH,CRITICAL --exit-code 1 techiescamp/pet-clinic-app:1.0.0

Ayrıca, güvenlik açığı raporunu bir build başarısızlık bildirimi olarak developer’lara ve DevOps mühendislerine gönderebilirsiniz.

Trivy Konfigürasyon Dosyası Kullanma

Taramalar için varsayılan ayarları belirlemek üzere bir Trivy konfigürasyon dosyası kullanmanız önerilmektedir. Bu dosya, projenizin ihtiyaçlarına özel tarama gereksinimlerinizi karşılayacak şekilde kullanılabilir.

Örnek trivy.yaml Dosyası

Aşağıda, örnek bir trivy.yaml konfigürasyon dosyası verilmiştir:

timeout: 10m
format: json
dependency-tree: true
list-all-pkgs: true
exit-code: 1
output: result.json
severity:
  - HIGH
  - CRITICAL
scan:
  skip-dirs:
    - /lib64
    - /lib
    - /usr/lib
    - /usr/include

  security-checks:
    - vuln
    - secret
vulnerability:
  type:
    - os
    - library
  ignore-unfixed: true
db:
  skip-update: false

Konfigürasyon Dosyasını Kullanma Syntax’ı

Konfigürasyon dosyasını kullanmak için aşağıdaki gibi bir komut kullanabilirsiniz:

trivy image --config path/to/trivy.yaml your-image-name:tag

Git Repository Tarama

Git repository’lerini taramak için kullanılan komut örneği aşağıdaki gibidir:

trivy repo <repo URL>

Eğer özel (private) bir repository kullanıyorsanız, kimlik doğrulaması için git token’ınızı sağlamanız gerekmektedir. Bunu yapmak için aşağıdaki komutu kullanabilirsiniz:

export GITHUB_TOKEN=<git token>

Ardından, aşağıdaki komutla repository’yi tarayabilirsiniz:

trivy repo <repo URL>

Bu komut, repository’yi tarar ve içindeki güvenlik açıklarını aşağıda gösterildiği gibi listeleyecektir.

image 2

Trivy Neleri Taramaktadır?

Trivy, Docker image’larındaki güvenlik açıklarını taramak için aşağıdaki ana bileşenleri gözden geçirir:

  • Çeşitli Paket Yöneticileri: Trivy, apt, yum, apk ve npm gibi farklı paket yöneticilerindeki güvenlik açıklarını tarayabilir. Bu, Trivy’nin, çeşitli yazılım bağımlılıklarını kullanan image’larda güvenlik açıklarını tespit edebilmesini sağlar.
  • Linux ve Windows Image’ları: Trivy, hem Linux hem de Windows image’larındaki güvenlik açıklarını tarayabilir. Bu sayede, Trivy’yi Linux veya Windows host’lar üzerinde çalışacak image’lar için kullanabilirsiniz.
  • Farklı Formatlar: Trivy, Docker image’larının yanı sıra tar arşivleri ve dosya sistemleri gibi çeşitli formatlarda depolanan güvenlik açıklarını da tarar. Bu, Trivy’nin, farklı konumlarda saklanan image’ları tarayabilmesini sağlar.
  • Farklı Ortamlar: Trivy, plain Docker container’ları ve Kubernetes pod’ları gibi çeşitli ortamlarda çalışan Docker image’larındaki güvenlik açıklarını tarayabilir. Böylece, Trivy’yi kullandığınız herhangi bir ortamda çalışan image’lar için kullanabilirsiniz.

Trivy Scanner’ın Avantajları

Aşağıdaki grafik, CVE veritabanındaki toplam güvenlik açıklarını göstermektedir. Gördüğünüz gibi, her yıl artış göstermektedir.

image 3

Güvenlik açıklarındaki artış göz önüne alındığında, Docker image’larını Trivy ile taramanın birçok avantajı bulunmaktadır.

  • Güvenlik Açıklarını Belirleme: Trivy, Docker image’larınızda kullanılan paketlerdeki güvenlik açıklarını tespit edebilir. Bu, özellikle temel image’ların yamanması ve uygulama image’larının inşası sırasında faydalıdır.
  • Güvenlik Durumunu İyileştirme: Image’larınızı güvenlik açıkları için tarayarak, organizasyonunuzun güvenlik durumunu geliştirebilirsiniz.
  • Güvenlik Uyumluluğu: Birçok organizasyon, güvenlik uyumluluğu gereği Docker image’larını güvenlik açıkları açısından kontrol etmek zorundadır. Bu standartlara Trivy yardımıyla ulaşabilirsiniz.

Sonuç

Docker image güvenlik açığı taraması, hem geliştirme aşamasında hem de CI/CD sürecinde zorunludur. Bu, iyi DevSecOps ilkelerine uymanızı ve Docker tabanlı ortamlarınızda sağlam bir güvenlik sağlamak için en iyi uygulamaları hayata geçirmenizi garanti eder.

Ayrıca incelemek isterseniz nikto ile web zaafiyet taraması yazımı okuyabilirsiniz.