0deps Hareketi: Yerel Bağımlılıklar ve Güvenlik
Yazılım geliştiriciler hemen hemen her projeye yüzlerce harici kütüphane yükler. Modern framework'ler genellikle binlerce gizli bağımlılığa dayanır. Bu durum, yazılım tedarik zinciri için devasa bir risk oluşturur.
0deps hareketi basit bir soru sorar: Ya uygulamanız yalnızca sizin kontrol ettiğiniz kodları çalıştırsaydı?
Her bağımlılık saldırı yüzeyinizi artırır. Bağımlılıklar şunları yapabilir:
- Güvenlik açıkları oluşturabilir.
- Saldırıların hedefi haline gelebilir.
- Güncelleme almayı durdurabilir.
- Kodlarını değiştirerek uygulamanızı bozabilir.
- Yeni gizli bağımlılıklar ekleyebilir.
0deps modelinde, her bağımlılığı doğrudan proje deponuza (repository) koyarsınız. Onları bir derleme (build) sırasında indirmezsiniz. Her şey en başından itibaren deponuzun içinde kalır.
Bu yöntem şunları sağlar:
- Tekrar üretilebilir derlemeler (reproducible builds).
- Harici kayıt defterlerine (registries) daha az bağımlılık.
- Daha kolay güvenlik denetimleri.
- Daha öngörülebilir kod.
Temel fikir kodun değişmesini engellemek değildir. Algoritmalar ve güvenlik yamaları değişmelidir. Değişmeden kalan şey, genel sözleşmedir (public contract).
Bir kütüphane belirli bir fonksiyon setini sunar. Bu fonksiyonlar bir sözleşme oluşturur.
- authenticate()
- createSession()
- verifyPasskey()
Kütüphane içindeki gerçekleştirme (implementation) tamamen değişebilir. Algoritmaları veya veri yapılarını değiştirebilirsiniz. Uygulamanızın geri kalanı bunu önemsemez çünkü arayüz (interface) aynı kalır.
Bir güvenlik açığı ortaya çıktığında iki sorunla karşılaşırsınız:
- Açığı düzeltmek.
- Güncellemenin uygulamanızı bozmadığından emin olmak.
0deps mimarisi ikinci sorunu çözer. Arayüzün arkasındaki kodu güncellersiniz. Genel API aynı kalır. Uygulamanız hiçbir değişiklik yapmadan çalışmaya devam eder.
Harici araçları dahili bir adaptörün arkasına izole edersiniz: Uygulama ↓ Genel Arayüz ↓ Adaptör ↓ Gerçekleştirme
Eğer bir kütüphane ölürse, sadece adaptörü değiştirirsiniz. Uygulamanızın geri kalanı güvende kalır. Kütüphane sürümleri, büyük bir baş ağrısı olmaktan çıkıp küçük bir ayrıntı haline gelir.
Amaç yazılımı mükemmel hale getirmek değildir. Amaç tedarik zinciri riskini azaltmaktır. Dinamik kurulumları kaldırarak şunları durdurursunuz:
- Kötü amaçlı paket sürümleri.
- Ele geçirilmiş kayıt defterleri (compromised registries).
- Bağımlılık karmaşası saldırıları (dependency confusion attacks).
Her kod satırı projenizin bir parçası haline gelir. Bu, tam kontrol ve inceleme imkanı sağlar.
Projeler yıllarca sürer. Kütüphaneler ve framework'ler yok olur. 0deps ile uygulamanız, ekosistem değişse bile aynı sözleşmeleri kullanmaya devam eder.
