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

devsecops

Görünenin Arkasındaki Zafiyet: Trivy ile Konteyner Dehlizleri

Konteyner güvenliğinin vazgeçilmezi Trivy’nin derinliklerine iniyoruz. Nexoship senaryosuyla sahada neler değişiyor?

Sedat Özdemir
· 3 dk okuma

Açık kaynak dünyasının en karanlık köşelerinden bir gerçekle başlayalım: Yapılan araştırmalara göre, Docker Hub üzerindeki en popüler 1000 imajın %82'si, üzerinden bir yıldan fazla zaman geçmiş ve yaması yayınlanmış 'kritik' zafiyetler barındırıyor. Bu sadece bir istatistik değil; bu, aslında her gün üzerine uygulama inşa ettiğimiz temellerin ne kadar çürük olabileceğinin bir kanıtı. Gece saat 02:45, elimde soğumuş bir kahve ve terminalde sürekli kayan loglar varken, bu rakamın ne kadar can yakıcı olduğunu daha iyi anlıyorum.

Trivy, tam da bu noktada devreye giren, Aqua Security ekibinin geliştirdiği bir güvenlik tarayıcısı. Sadece konteyner imajlarını (container images) değil; dosya sistemlerini, Git depolarını ve hatta Terraform veya Kubernetes dosyalarındaki yanlış yapılandırmaları (misconfigurations) tarayabiliyor. Benim için Trivy'nin en çekici yanı hızı. Diğer ağır siklet tarayıcılar gibi ayağa kalkması dakikalar sürmüyor; 'statik analiz' (static analysis) mantığıyla saniyeler içinde zafiyet veritabanını güncelleyip sonucu önünüze döküyor. DevSecOps hattında (pipeline) 'engelleyici' (blocker) değil, 'hızlandırıcı' olması onu favorim yapıyor.

Kurulumu oldukça basit; terminale girip bir ikili dosyayı (binary) indirmek yetiyor. Ama asıl olay kullanımında. Şöyle bir senaryo düşünün: Bir uygulama paketliyorsunuz ve içinde ne olduğunu tam bilmediğiniz bir 'base image' kullanıyorsunuz. Şu komutu çalıştırdığınızda gerçekler yüzünüze çarpıyor:

trivy image --severity HIGH,CRITICAL --format table 192.168[.]1[.]100:5000/nexoship-api:v1.0.2

Burada --severity ile sadece canımızı gerçekten yakacak olanları listeliyoruz. nexoship-api (kurgusal şirket) projesinde bir lojistik yönetim sistemi üzerinde çalışırken bunu denemiştik. Ekipten bir arkadaşımız, 'Tertemiz Dockerfile yazdım' diyerek imajı pushlamıştı. Trivy ile taradığımızda, imajın içindeki eski bir OpenSSL kütüphanesinden dolayı 12 tane kritik zafiyet fırladı. O anki yüz ifadesini görmeliydiniz.

Sizin de başınıza geldi mi bilmiyorum ama bazen 'en güvenli' dediğiniz araçların bile aslında ne kadar çok şeyi gözden kaçırdığını fark ettiğiniz o an... Gerçekten merak ediyorum, en son ne zaman kullandığınız bir kütüphanenin bağımlılık ağacına (dependency tree) derinlemesine baktınız? Çoğu zaman 'npm install' veya 'pip install' diyip geçiyoruz ama o paketlerin altında yatan binlerce satırlık yabancı kodun sorumluluğunu kim alıyor?

Bir anlığına konudan sapayım; geçen gece terminalin renk şemasını 'Dracula'dan 'Catppuccin'e çevirdim. Sanki kodlar daha okunaklı, zafiyetler daha 'sevimli' görünüyor gibi (elbette öyle değil ama insan bazen küçük estetik değişikliklerle kendini kandırmayı seviyor). Neyse, terminale geri dönelim.

Trivy'nin en büyük artısı, zafiyet veritabanını (vulnerability database) sürekli ve çok hızlı güncellemesi. Ayrıca 'Secret Scanning' özelliği sayesinde imajın içine yanlışlıkla gömülmüş API anahtarlarını veya şifreleri de yakalayabiliyor. Ancak her araç gibi onun da eksileri var. Bazen 'yanlış pozitif' (false positive) sonuçlar üretebiliyor. Yani aslında orada olmayan veya sömürülemeyecek (unexploitable) bir açığı varmış gibi gösterebiliyor. Bu da özellikle CI/CD süreçlerinde gereksiz yere buildlerin patlamasına neden oluyor. Bu gibi durumlarda .trivyignore dosyasını kullanmak zorunda kalıyorsunuz ki bu da biraz 'riski elle yönetmek' (manual risk management) demek.

Alternatif olarak 'Clair' veya 'Anchore' gibi devasa araçlar var. Clair, özellikle büyük ölçekli registry entegrasyonlarında çok başarılı ama kurulumu ve yönetimi Trivy kadar 'tak-çalıştır' değil. Eğer bir Kubernetes cluster'ı içerisinde runtime'da (çalışma zamanında) ne olup bittiğini görmek istiyorsanız, Falco gibi araçlar Trivy'nin bittiği yerde başlar. Trivy daha çok 'kapıdan girmeden önceki kontrol' gibi.

Yazının başında bahsettiğim o %82'lik istatistiğe geri dönelim. İlk okuduğunuzda sadece 'kötü bir durum' gibi gelmiş olabilir. Ama şimdi, tek bir trivy image komutunun o %82'lik karanlık alandan sizi nasıl çekip çıkarabileceğini düşündüğünüzde, o rakam aslında bir ihmalin değil, bir fırsatın işareti. Güvenlik, mükemmel olmak değil; neyin yanlış olduğunu bilmek ve onu düzeltme iradesini göstermektir. Gece bitiyor, kahvem tamamen soğudu ve terminaldeki Trivy taraması '0 CRITICAL' sonucunu verdi. Sanırım şimdi biraz uyuyabilirim.

İlgili yazılar