Yazılara geri dön
Yazı

GitLab CI'de Trivy ile Runtime CVE Tarama ve Görüntü Engelleme

GitLab CI'de Trivy entegre ederek container görüntülerini runtime'da tarayın, yüksek ve kritik seviyedeki açıklar bulunduğunda derlemeyi otomatik olarak engelleyin.

DevopsTrivyGitLab CIcontainer securityCVE scanningDevSecOps

Runtime açığı taraması üretim iş yükleri için müzakere edilemez. Benim gibi birçok ekip sadece derleme zamanındaki kontrollera güvenip, sıfır gün açıkları veya yapılandırma hatası olan temel görüntülerden zarar görüyor. Ortamımda Trivy, container görüntülerindeki CVE'leri yakalamak için tercih ettiğim araç haline geldi — sadece derleme sırasında değil, riskin en yüksek olduğu noktada: dağıtımdan hemen önce. Trivy'yi GitLab CI'ye entegre etmek, tehlikeli görüntülerin hazırlama veya üretime ulaşmasını önleyen otomatik kapılar sağlar.

Runtime Taramanın Daha Da Önemli Olduğu Nedenler

Derleme zamanı taraması Dockerfile'ınız ve temel katmanlardaki bilinen sorunları yakalar, ancak görüntü çalıştığında neler olacağını hesaba katmaz. Yeni CVE'ler günlük ortaya çıkıyor ve temel görüntünüz CI işiniz bittikten sonra güvenli olmayan bir paket çekerse, açık hale gelersiniz. Runtime taraması, görüntüyü bir container'da çalışırken nasıl olacağını değerlendirir — geçici katmanlar, geçici dosyalar ve dinamik bağımlılıklar dahil. Bu, distroless veya Alpine gibi minimal temellerden veya sıfırdan oluşturulan görüntüler için özellikle kritiktir; çünkü paket yöneticileri her zaman açık olmaz.

Trivy'yi tercih ederim çünkü hızlı, hafif ve hem açıklık hem de yapılandırma taramasını destekler. daha önemli olanı, ek ajanlar veya karmaşık kurulumlara ihtiyaç duymadan GitLab CI'ye sorunsuz entegrasyonu. Hedef sadece taramak değil, kritik veya yüksek şiddetteki CVE'ler bulunduğunda hat işlemine düşmek.

GitLab CI'de Trivy Kurulumu

İlk olarak, .gitlab-ci.yml dosyanıza Trivy'yi ekleyin. Tutarlılık sağlamak ve sürüm sapmasını önlemek için resmi Aqua Security imajını kullanıyorum.

trivy-scan:
  image: aquasec/trivy:latest
  stage: test
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push"'

Bu iş, Trivy tarayıcısını çeker, daha önce pipeline'da oluşturulan görüntü üzerinde çalıştırır ve HIGH veya CRITICAL şiddetteki bir açık bulunduğunda çıkış kodu 1 ile sonlanır. --exit-code 1 bayrağı anahtarlık yapar — Trivy'nin çıktısını GitLab CI'nin saydığı bir sert başarısızlığa dönüştürür.

Bu işi derleme ve test aşamalarının ardından, herhangi bir dağıtım öncesine yerleştiririm. Böylece görüntü taramada başarısız olursa, hiçbir şey yükseltilmez. Ayrıca görüntünün oluşturulup kayıt defterine pushed olduktan sonra bu işin çalışmasını sağlaymak için needs: bölümü ekleyebilirsiniz.

Yanlış Pozitifler ve Temel Taramalarla Başa Çıkma

Her bayraklanan CVE eyleme dönüştürülebilir değildir. Bazıları uygulamanız tarafından asla kullanılmayan paketlerde olur veya maruz kalmadığınız spesifik koşullarda sadece istismar edilebilir. Trivy, bilinen yanlış pozitifleri bastırmak için .trivyignore dosyası oluşturmanıza izin verir.

Güvenilir bir görüntüde temel bir tarama yapar ve görmezden gelen açıkları şu şekilde kaydederim:

trivy image --ignore-unfixed --format template --template "@contrib/gitlab.tmpl" -o trivy-baseline.json myapp:stable

Ardından CI'de, yeni taramaları bu temele karşılaştırarak gürültüyü önlerim. Bu, taramayı tamamen devre dışı bırakmadan sinyali temiz tutar.

Kayıt Defteri Seviyesinde Görüntü Engellemeyi Otomatikleştirme

GitLab CI'de tarama harikadir, ancak biri elle bir görüntü iterse ne olur? Bu durumları yakalamak için, koruyu GitLab'ın Container Registry güvenlik politikalarıyla kayıt defteri seviyesine kadar genişletirim.

Projenizin Ayarları > Güvenlik & Uyumluluk > Container tarama sayfasına gidin, Trivy entegrasyonunu etkinleştirin ve başarısızlık eşiğini "Yüksek" veya "Kritik" olarak ayarlayın. Böylece bir geliştirici docker push ile doğrudan görüntü iterse bile, GitLab onu itme sırasında tarar ve politikayı karşılamadığında daha fazla yükseltmeyi engeller.

Bu iki katmanlı yaklaşım — CI kapısı + kayıt defteri zorunluluğu — benim için, görüntü bir pipeline'dan mı yoksa elle itişten mi gelsin, güvenli görüntünün geçmesini garanti eder.

İpucu: Trivy DB'yi Önbelleğe Alarak Tara Süresini Hızlandırma

Trivy her çalıştığında güvenlik veritabanını indirir, bu da gecikme oluşturur. CI'de, bu veritabanını işler arasında önbelleğe alarak tarama süresini %60 veya daha fazla azaltırım.

trivy-scan:
  image: aquasec/trivy:latest
  stage: test
  cache:
    key: "trivy-db"
    paths:
      - /home/trivy/.cache/trivy/db
  script:
    - trivy image --download-db-only
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

İlk çalıştırma veritabanını indirir ve önbelleğe alır; sonraki işler onu yeniden kullanır. Sadece çalıştırıcınızın yeterli disk alanına sahip olduğundan emin olun — veritabanı ~200MB ve zamanla büyür.

Uyarı: Tek Başına Tarayıcıya Güvenmeyin

Trivy mükemmel olsa da mükemmel bir çözüm değildir. Mantık hataları, birimlerdeki kodlanmış sırlar veya yanlış yapılandırılmış çalışma zamanı bayraklarını yakalayamaz. Bunu Kubernetes'te OPA/Gatekeeper gibi runtime kabul denetleyicileriyle ve düzenli temel görüntü yeniden temelleriyle birleştiririm. Trivy'yi ilk savunma hattınız olarak düşünün — temel ama daha büyük bir stratejinin bir parçası.

SBOM ve lisans kontrolümdeki yazımda (https://furkanikkan.com/urun/gitlab-ci-de-trivy-ile-otomatik-sbom-ve-lisans-uyumluluk-kontrolu-138) belirttiğim gibi, Trivy'nin gücü otomasyon ve politika zorunluluğunda yatar. Tarama işlemini CI akışınızda isteğe bağlı olmayan bir adım haline getirdiğinizde, takımları yavaşlatmadan güvenliği sola kaydırırsınız.

Son Düşünceler

GitLab CI'de Trivy ile runtime CVE taraması mükemmelliğe ulaşmakla ilgili değil, riski sistematik olarak azaltmaktır. Yüksek şiddetteki açıklar içeren görüntüleri CI sisteminizden çıkarmadan önce engelleyerek, bilinen istismarların üretime ulaşmasını önlersiniz. Bununla birlikte kayıt defteri seviyesinde zorunluluğu ve akıllı önbelleğe almayı birleştirirseniz, hem güvenli hem de verimli bir pipeline elde edersiniz.

Dağıtım riski noktasında görüntü taramıyorsanız, kör uçuyorsunuz. Trivy'yi CI'de başlatın, katı başarısızlık eşikleri ayarlayın ve kayıt defteri seviyesinde zorunlu kılın. Gelecekteki kendiniz — ve olay yanıt ekibiniz — size teşekkür edecektir.


Kapak görseli: Unknown · CC0 (Openverse / kamu malı) · https://www.rawpixel.com/image/6042704/photo-image-public-domain-free