İçeriğe geç
Sedat Özdemir
Yazılar

devsecops

Trivy: Konteyner Güvenliğinde İsviçre Çakısı Kullanmak

Konteyner güvenliğini sadece imaj taramak sanıyorsanız çok yanılıyorsunuz. Trivy ile CI/CD süreçlerinde gerçek güvenliği nasıl sağlarız?

Sedat Özdemir
· 3 dk okuma

Sektörde herkesin üzerinde uzlaştığı, hatta sorgulamadan kabul ettiği bir 'güvenlik illüzyonu' var: Eğer konteyner (container) imajınızı bir zafiyet tarayıcıdan (vulnerability scanner) geçirdiyseniz ve sonuçlar yeşil yanıyorsa, o imaj güvenlidir. Buna gerçekten inanıyor muyuz? Ben inanmıyorum. Çünkü çoğu ekip güvenliği sadece 'CVE avcılığı' olarak görüyor. Oysa gerçek sızma testi (penetration testing) deneyimlerim bana şunu öğretti: En büyük açıklar kodun içinde değil, o kodu çevreleyen yapılandırma hatalarında ve dikkatsizce bırakılan sırların (secrets) arasında gizlidir. Bugün size bu illüzyonu kırmak için elimizdeki en keskin araçlardan birinden, Trivy'den bahsedeceğim. Gerçekten heyecanlıyım çünkü bu araç, 'DevSecOps nedir?' sorusunun ete kemiğe bürünmüş hali gibi.

Trivy, Aqua Security tarafından geliştirilen açık kaynaklı bir güvenlik tarayıcısı. Onu sadece bir konteyner tarayıcısı olarak tanımlamak haksızlık olur. Statik analiz (SAST), altyapı kodu taraması (IaC scanning), yazılım envanter listesi (SBOM) oluşturma ve hatta sır ifşası (secret detection) tespiti yapabiliyor. Yani bir sızma testi uzmanı (penetration tester) olarak benim manuel yapmaya çalıştığım pek çok sıkıcı işi, CI/CD pipeline'larına (iş hattı) saniyeler içinde entegre edebiliyor. Hızı beni benden alıyor; Go diliyle yazılmış olmasının verdiği o çeviklik, devasa imajları bile göz kırpma süresinde analiz etmesini sağlıyor.

Kurulumu ve kullanımı o kadar basit ki, bazen 'bu kadar kolay olmamalı' diye düşünüyorum. Terminalinizde şu komutu çalıştırdığınızda neler yapabildiğini görünce bana hak vereceksiniz:

# Bir Docker imajını yüksek ve kritik zafiyetler için tarayalım
trivy image --severity HIGH,CRITICAL --ignore-unfixed python:3.9-slim

# Mevcut dizindeki IaC (Terraform, Helm) dosyalarındaki yanlış yapılandırmaları bulalım
trivy config .

# Dosya sisteminde unutulmuş API anahtarları veya şifreleri avlayalım
trivy fs --security-checks secret /path/to/project

Yukarıdaki python:3.9-slim örneğinde olduğu gibi, --ignore-unfixed parametresi benim favorim. Düzeltilemeyecek açıklarla (unfixed vulnerabilities) vakit kaybetmek yerine, gerçekten aksiyon alabileceğimiz konulara odaklanmamızı sağlıyor. Hacker zihniyeti tam olarak budur: Gürültüyü temizle, hedefe odaklan.

Bir dönem TrustLayer (kurgusal şirket) ile bir fintech projesinde çalışıyorduk. Ekip, Kubernetes ortamına geçiş yapıyordu ve her şeyin mükemmel olduğunu düşünüyorlardı. İmajlarını standart bir bulut sağlayıcı aracılığıyla tarıyorlardı ve sonuçlar temiz geliyordu. Ben sürece dahil olduğumda Trivy'nin 'misconfiguration' (yanlış yapılandırma) tarama modülünü devreye aldım. Ortaya çıkan manzara inanılmazdı; konteynerlerin yarısı 'privileged' (ayrıcalıklı) modda çalışmaya ayarlanmıştı ve kök dizin (root filesystem) yazılabilir durumdaydı. Bu, bir saldırganın konteynerden kaçıp (container escape) ana sunucuya sızması için açık bir davetiye demekti. Şirketteki arkadaşlar 'ama imajda açık yoktu' dediler. İşte Trivy'nin o an gösterdiği o 'config' hataları, projenin tüm güvenlik mimarisini baştan aşağı değiştirmemize neden oldu. O anki şaşkınlıklarını ve sonrasındaki 'iyi ki yakaladık' heyecanlarını unutamıyorum.

Her neyse, Trivy'nin her şeyi çözdüğünü iddia etmiyorum. En büyük artısı kuşkusuz hızı ve çok yönlülüğü. Eskiden sırları bulmak için ayrı, Dockerfile hataları için ayrı, kütüphane zafiyetleri için ayrı araçlar kullanırdık. Trivy bunları tek bir çatı altında topluyor. Ayrıca JSON formatında çıktı vermesi, bu çıktıları bir ELK stack (Elasticsearch, Logstash, Kibana) içine basıp dashboard oluşturmamızı inanılmaz kolaylaştırıyor. Eksilerine gelirsek; bazen 'false positive' (yanlış pozitif) dediğimiz, aslında tehlike arz etmeyen bulguları çok fazla öne çıkarabiliyor. Özellikle eski işletim sistemi kütüphanelerinde bazen çok gürültü yapabiliyor. Bir de sır tarama (secret detection) konusunda 'truffleHog' kadar derinlere inemediği noktalar oluyor ama genel bir tarama için fazlasıyla yeterli.

Alternatif olarak Snyk veya Grype gibi araçlar da var. Snyk, özellikle geliştirici dostu arayüzü ve düzeltme önerileriyle (fix suggestions) çok başarılıdır ama ticari tarafı biraz daha ağır basar. Grype ise sadece zafiyet taramaya odaklanan, hafif bir araçtır. Eğer amacınız tamamen CI/CD pipeline içine entegre olan, 'her şeyi tek komutla tarasın' dediğiniz bir çözümse, Trivy rakipsiz. Ben şahsen pipeline içinde Trivy'yi bir güvenlik bariyeri (quality gate) olarak kullanmayı, daha derinlemesine kod analizi için ise Snyk'i tercih ediyorum.

İlk sızma testimde bir web sunucusunun versiyon numarasından exploit ararken saatler harcamıştım. Şimdi Trivy gibi araçlar sayesinde o versiyonun barındırdığı 50 tane açığı 3 saniyede görebiliyoruz. Bu bizi tembelleştiriyor mu yoksa daha stratejik düşünmeye mi zorluyor, hala emin değilim. Ama bildiğim bir şey var; bu aracı kullanmaya başladığımdan beri, manuel işlerle uğraşmak yerine daha karmaşık saldırı vektörlerine (attack vectors) odaklanabiliyorum.

Sizin DevSecOps süreçlerinizde vazgeçemediğiniz, 'bu olmadan pipeline eksik kalır' dediğiniz o araç hangisi? Trivy'nin bulamadığı ama sizin manuel olarak yakaladığınız o 'oops' anlarını merak ediyorum. Tartışalım mı?

İlgili yazılar