Salı gecesi saat 03:14. Ekranımın sol köşesinde OpsVault (kurgusal şirket) için hazırladığımız CI/CD hattının kırmızıya boyandığını gördüm. Bir geliştirici arkadaşım, sadece küçük bir CSS düzeltmesi için push yapmıştı ama bizim 'akıllı' statik analiz aracımız (SAST) ayağa kalkmış, ortalığı birbirine katıyordu. Geliştirici slack üzerinden 'Sedat, yine mi?' diye mesaj attığında haklıydı. Araç, bir değişken ismini tehlikeli bir anahtar kelimeyle karıştırmıştı. İşte o an bir şeyi bir kez daha anladım: Güvenliği sola çekmek (shift-left), sadece daha fazla aracı geliştiricinin kucağına atmak demek değildir. Bizim sektörde çok tehlikeli bir yanılgı var; otomasyonun bizi daha güvenli kılacağına inanıyoruz. Hayır, otomasyon sadece mevcut hatalarımızı daha hızlı ölçeklendirmemize yarıyor.
Siber güvenlikte aldığım en net pozisyon şudur: Kültürle desteklenmeyen her güvenlik aracı, teknik borçtan başka bir şey değildir. Bugün pek çok ekip, 'pipeline'a üç tane tarayıcı ekledik, artık güvenliyiz' diyerek arkasına yaslanıyor. Bu, kapısına son model bir kilit takıp anahtarı paspasın altına koymaya benziyor. Hatta daha kötüsü; o kilit her rüzgar estiğinde hırsız var diye alarm çalıyor ve bir süre sonra kimse alarmı ciddiye almamaya başlıyor. Geliştiricilerin güvenlik uyarılarını 'ignore' (görmezden gelme) listesine eklemesi, aslında bizim tasarım hatamızın bir sonucudur. Eğer bir araç geliştiricinin iş akışını sürekli kesiyor ve ona anlamlı bir bağlam (context) sunmuyorsa, o araç aslında bir güvenlik açığıdır.
Bunu bizzat NordPay (kurgusal şirket) projesinde deneyimledim. Finansal bir altyapı olduğu için her şeyi en ince ayrıntısına kadar otomatize etmiştik. Bağımlılık taramaları (SCA), konteyner zafiyet taramaları, IaC kontrolleri... Liste uzayıp gidiyordu. Bir gün fark ettik ki, bir mikroservisin dağıtıma (deployment) çıkması tam iki saat sürüyor. Geliştiriciler bu süreçten o kadar bıkmışlardı ki, kontrolleri atlatmak için 'bypass' yolları aramaya başlamışlardı. En sonunda birisi, kritik bir güvenlik kontrolünü lokalinde devre dışı bırakıp kodu öyle göndermişti. Neden? Çünkü işini bitirmesi gerekiyordu. Güvenlik, üretkenliğin düşmanı gibi konumlandığında, insanlar her zaman üretkenliği seçecektir. (Bu arada, Git geçmişinin asla silinmediğini, sadece gizlendiğini unutanlar için ufak bir hatırlatma: git push --force bir çözüm değil, sadece sorunu halının altına süpürmektir.)
Karşı argümanı biliyorum: 'Ama Sedat, binlerce mikroservisi manuel olarak nasıl kontrol edelim? Otomasyon şart!' Elbette şart. Benim itirazım otomasyonun kendisine değil, otomasyonun arkasındaki o 'sorumluluğu başkasına yıkma' kafasına. Güvenliği otomatize ettiğinizde, sorumluluğu bir yazılıma devrediyorsunuz. Ancak o yazılımın bulduğu 'Critical' (kritik) seviyesindeki bir açık, sizin iş mantığınız (business logic) içinde aslında hiçbir anlam ifade etmeyebilir. Bir 192.168[.]1[.]100 adresine bağlı, dış dünyaya kapalı bir test sunucusundaki zafiyetle, internete açık ana veritabanı bağlantısındaki zafiyeti aynı kefeye koyan bir otomasyon, zekadan yoksundur.
Gerçek DevSecOps, geliştiriciye 'Hata yaptın, düzelt!' diyen bir bot değil; 'Burada şöyle bir risk var, çünkü şu senaryoda bir saldırgan attacker[.]example[.]com üzerinden şu veriyi çekebilir' diyen bir rehber olmalı. Bizim işimiz sadece 'bulmak' değil, 'öğretmek' ve 'kolaylaştırmak'. (Buraya bir not düşmem lazım: İlk sızma testlerimde ben de bulduğum her şeyi 'kritik' diye raporlardım, sonra anladım ki bağlamı olmayan her bilgi sadece gürültüdür.)
Şimdi şunu düşünmeni istiyorum: En son ne zaman bir geliştiriciyle oturup, kullandığınız güvenlik aracının neden bu hatayı verdiğini teknik detaylarıyla, kodun başında tartıştın? Eğer sadece pipeline’daki kırmızı ışığa bakıp 'düzelt şunu' diyorsan, sen bir güvenlik uzmanı değil, bir trafik polisisin. Trafik polisi olmak sızma testi ruhuna aykırıdır; biz sistemi anlamak ve daha iyi hale getirmek için buradayız.
Bu arada, pek çok ekibin düştüğü bir tuzak daha var: IaC (Infrastructure as Code) güvenliği. Terraform veya Helm chart'larını tararken, default (varsayılan) değerleri kontrol etmeden 'güvenli' diyen araçlara çok güvenmeyin. Araç sadece sintaksı (syntax) kontrol eder, ama sizin o servisi yanlışlıkla public (açık) bir subnet'e koyup koymadığınızı her zaman anlamayabilir.
Gece 03:14'teki o kırmızı ekrana geri dönersek... O gece o arkadaşımı aradım. 'Hadi gel, şu kuralı beraber revize edelim' dedim. Aracı suçlamak yerine, aracın o kodu neden yanlış anladığını çözdük. Sonuçta kod yine geçti, ama bu sefer her ikimiz de sistemin nasıl daha iyi korunacağını biliyorduk. OpsVault (kurgusal şirket) o gece çökmedi, ama daha önemlisi, bir geliştirici güvenliği bir engel olarak değil, bir destek olarak görmeye başladı. Sabah kahvemi içerken düşündüğüm tek şey şuydu: O kırmızı ışık yanmasaydı, belki de bu kadar derin bir teknik sohbeti asla yapamayacaktık. Otomasyon sadece bir bahanedir; asıl olan o bahaneyi nasıl bir gelişim fırsatına dönüştürdüğündür.
