Çünkü aylardır makinemde ne döndüğünü tam olarak bilmiyordum
Bir akşam, uzun bir günün sonunda docker ps yazdım ve çıktıya bir süre öylece baktım. Yirmi altı konteyner. Bir kısmının ne için ayakta olduğunu hatırlıyordum; geri kalanı, aylar önce “bir dakika, şunu bir deneyeyim” deyip unuttuğum şeylerdi. Sonra docker images yazdım: on üç gigabayt. Kimsenin çekmediği katmanlar, çoktan gereksizleşmiş imajlar.
O an rahatsız edici bir şeyi kabul ettim: Docker’ı her gün kullanıyordum ama içinde tam olarak ne döndüğünü bilmiyordum.
Docker bu konuda tuhaf bir araç. Bir şeyi çalıştırmayı olağanüstü kolaylaştırıyor, ne çalıştırdığını fark etmeyi ise aynı ölçüde zorlaştırıyor. Altı ay süren bir projenin sonunda ortalama bir geliştiricinin makinesinde şunlar birikiyor: Docker soketini içine bağlamış bir konteyner, 0.0.0.0 üzerinde herkese açık birkaç veritabanı, root olarak çalışan bir düzine servis ve kimsenin referans vermediği gigabaytlarca imaj. Hiçbiri o an alarm çalmıyor; ta ki bir şey bozulana ya da biri seni taramaya karar verene kadar.

Var olan araçlar bu boşluğu doldurmuyor
Yanlış anlaşılmasın, iyi araçlar var. Trivy ve Grype imajlardaki CVE’leri gayet iyi buluyor. Ama onlar bir zafiyet veritabanına, dolayısıyla ağ bağlantısına ihtiyaç duyuyor ve baktıkları şey imajın içindeki paketler. Benim sorunum orada değildi. Benim sorunum yapılandırma katmanındaydı: o konteyneri nasıl çalıştırdığım. docker system df disk kullanımını söylüyor ama hiçbir yorum yapmıyor; “şu volume’a artık kimse dokunmuyor” demiyor.
Aradığım şey tek bir soruya cevap veren bir araçtı: Bu Docker ortamında şu an neyin yanlış olduğu ve ne yapmam gerektiği. Bulamayınca yazdım.
DoctorDock
DoctorDock, yerel Docker ortamını tarayan küçük bir komut satırı aracı; yanında bir de native macOS menubar uygulaması var. Güvenlik problemlerini, hatalı yapılandırmaları ve geri kazanılabilir diski bulup önüne koyuyor, sonuna da 100 üzerinden bir sağlık puanı bırakıyor. Go ile yazdım; tek binary, hesap yok, MIT lisansı.
Hız konusunda somut olayım: bende yaklaşık 26 konteyner, 29 imaj, 29 volume ve 12 ağdan oluşan bir ortamın tam taraması ~550 ms sürüyor. docker ps yazıp çıktısını okuma sürenden kısa.
Verdiğim üç karar
Bu aracı yazarken üç şeye baştan karar verdim. Üçü de “eksik özellik” gibi görünebilir; bence tam tersi.
Yapay zeka yok
Bunu bir “AI destekli güvenlik ürünü” yapabilirdim. Yapmadım. Her bulgu, okuyabileceğin deterministik Go kodu; aynı ortam her zaman aynı çıktıyı üretiyor. Bir kuralın neyi neden işaretlediğini merak edersen kaynağına bakabilirsin. Bir güvenlik aracının bana “sanırım burada bir sorun olabilir” demesini istemiyorum; ya vardır ya yoktur.
Çevrimdışı
Sıfır ağ çağrısı. Telemetri yok, hesap yok, güncelleme kontrolü yok. DoctorDock yalnızca tek bir yerel soketi açıyor: Docker’ınkini, başka hiçbir şeyi. Air-gapped bir makinede de, kapalı bir CI ortamında da aynı şekilde çalışıyor. Ne taradığın sende kalıyor.
Sırlar yerinde kalır
Konteyner ortam değişkenlerini yalnızca anahtar adı olarak okuyorum; değerleri bir rapora ulaşabilecek hiçbir biçimde belleğe girmiyor. DATABASE_PASSWORD diye bir anahtarın olduğunu görürsün, değerini asla. Bu da aracı production’a karşı çalıştırmayı güvenli kılıyor. Oysa bir güvenlik aracında bunun pazarlanacak bir özellik değil, varsayılan olması gerekir.
Nasıl görünüyor
Kurup taramak dışında bir şey yapman gerekmiyor:
brew install iamcanturk/tap/doctordock
doctordock scan
Çıktı ortama bir puan veriyor ve bulguları önem sırasına diziyor:
HEALTH SCORE 37/100 poor
1 CRITICAL · 17 HIGH · 6 MEDIUM · 22 LOW
DD005 CRITICAL Docker socket bir konteynere mount edilmis
DD001 HIGH Konteyner root olarak calisiyor
DD006 MEDIUM Veritabani portu 0.0.0.0 uzerinde yayinlanmis
37/100 gördüğünde paniğe gerek yok; çoğu geliştirici makinesi ilk taramada buralardan başlıyor. Önemli olan artık listenin görünür olması. Ve her kural kendini anlatıyor:
doctordock explain DD005
Bu komut sana kuralın ne aradığını, neden önemli olduğunu, somut bir saldırı senaryosunu, kopyalayıp yapıştırabileceğin bir çözümü ve ne zaman güvenle görmezden gelinebileceğini veriyor. “Burada bir sorun var” demekle yetinmiyor, o sorunu kapatmayı da öğretiyor.

En çok üzerinde durduğum kısım: temizlik
Açıkçası bu aracı yazarken en çok temizlik kısmından çekindim. Çünkü yanlış bir komut, birinin aylık verisini uçurabilir. O yüzden DoctorDock varsayılan olarak hiçbir şey silmiyor:
doctordock cleanup # kuru calisma: sadece ne silinecegini gosterir
doctordock cleanup --apply # gercekten uygular
Ve --volumes dışında hiçbir flag bir volume’u seçemiyor, --all bile. Bir imajı yeniden çekebilir, bir ağı yeniden kurabilirsin; ama bir volume’daki veri gittiğinde geri gelmiyor. Bu yüzden volume’lar ancak açıkça ve tek başına istediğinde işin içine giriyor. Kazara hiçbir şey silinmiyor.
Kapanış
DoctorDock büyük bir ürün değil; küçük ve dürüst bir araç. Docker ortamının aylar içinde sessizce biriktirdiği şeyleri saniyenin altında, hiçbir veriyi dışarı sızdırmadan önüne koyuyor. Bir doktor gibi: bakıyor, teşhis koyuyor, ne yapman gerektiğini söylüyor ve kararı sana bırakıyor.
Merak ettiysen bir tarama çalıştır ve makinenin gerçekte kaç aldığını gör. Muhtemelen sandığından düşük çıkacak, ama ilk kez tam olarak ne yapacağını bileceksin.
Projenin özetini, ekran görüntülerini ve tek bakışta neye yaradığını proje sayfasında bulabilirsin.
- Kod: github.com/iamcanturk/DoctorDock
- İndir ve detaylar: doctordock.iamcanturk.dev