> ./OMNISIGHT
Kendi sunucunuzda çalışan, uç nokta ağ görünürlüğü ve SIEM yönelimli bir ürün: bir uç nokta ajanı, yerel bir sunucu, bir operatör konsolu, kurulum paketleri ve lisans ile güncelleme için bir bulut kontrol düzlemi. İlginç olan büyüklüğü değil. İlk satırı yazmadan önce taahhüt ettiğim sınırlar ve onları tutmanın maliyeti.
Ne yapıyor
Yönetilen uç noktalardaki ajanlar; bağlantı metadatasını, yazılım envanterini ve sistem metriklerini müşterinin kendi donanımında çalıştırdığı bir sunucuya bildiriyor. Sunucu bunları saklıyor, üzerinde tespit çalıştırıyor, kurulu yazılımları kamuya açık zafiyet verisiyle eşleştiriyor ve arama, alarm triyajı ile raporlama için bir operatör konsolunu besliyor.

Uç nokta ajanı
Go. Ağ metadatası, envanter, heartbeat, toplu metrikler.
Yerel sunucu
Python API, ilişkisel depo, RBAC, denetim kaydı, tespit, raporlama.
Operatör konsolu
React. Kontrol paneli, olay arama, alarm triyajı, zafiyetler.
Kontrol düzlemi
Lisanslama, güncelleme dağıtımı, yayılım durumu, toplu rapor aktarımı.
Zafiyet servisi
CVE akışı senkronizasyonu ve envantere karşı sürüm farkında eşleştirme.
Kurulum ve paketleme
macOS ve Linux kurulum, güncelleme ve kaldırma akışları.
Üç sınır
Bir izleme ürünü, yapısı gereği ağdaki en geniş erişime sahip şeydir. Bu onu bir araç olduğu kadar bir yükümlülük de yapar; cevaplanmaya değer tasarım soruları da onun bilerek neyi yapmayı reddettiğiyle ilgilidir.
Sözleşme olarak yalnızca metadata
Paket içeriği, istek gövdesi, başlık, çerez, çözülmüş TLS, komut satırı, uç nokta dosyası veya kimlik bilgisi yok. Bu yalnızca dokümanda değil, ürünün sözleşme metninde yazılı — dolayısıyla sonradan genişletmek bir özellik anahtarı değil, düzeltme sürecini gerektiren sözleşmesel bir değişiklik.
Yalnızca dışa doğru
Bulut hiçbir zaman müşteri ağına doğru bağlantı açmaz. Her alışverişi müşterinin sunucusu başlatır: lisans kontrolleri, güncelleme sorguları, aktarım gönderimleri. Benim altyapımın ele geçirilmesi, saldırgana içeri doğru hiçbir yol vermez.
Her yerde fail-closed
E-posta aktarımı, izin listesinde olmayan bir alıcıyı kuyruğa almak yerine reddeder. Zafiyet eşleştirmesi bir sürümü çözemediğinde tahmin yürütmeyi reddeder. Çalışma zamanı kapıları, eksik çalışmaktansa hiç başlamamayı seçer.

Veri gerçekte nereye gidiyor
Telemetri müşterinin sunucusunda kalır. Benim altyapıma geçen şey kısa ve bilinçli bir listedir; listedeki her madde, o özellik onsuz imkânsız olduğu için oradadır — zafiyet eşleştirmek için yazılım adları ve sürümleri, rapor iletmek için toplu özetler, lisans ve güncelleme istekleri. İki liste arasındaki asimetri, tasarımın kendisidir.
Savunulmaya değer iki karar
Kalıcı veri REST üzerinden gider, asla soket üzerinden
Konsol canlı güncellenir; bu genelde veriyi WebSocket üzerinden itmek demektir. Ben hiç içerik taşımayan bildirimler itiyorum — bir şeyin değiştiğine dair bir sinyal; ardından tarayıcı kimlik doğrulamalı REST yolundan yeniden çekiyor. Bu daha fazla iş ve fazladan bir gidiş-dönüş demek. Ama aynı zamanda soketin, veriyi okumanın daha az denetlenen ikinci bir yolu hâline gelmemesi ve yetkilendirmenin tam olarak tek bir yerde uygulanması demek.
Ayrıca yazdığım lab kesintisi bu kararın karşı ağırlığı: soket ve REST aynı arıza alanını paylaşmadığı için, REST ingest tamamen engellenmişken soket sağlıklı bildirmeye devam etti. İkisini ayırmak bana daha temiz bir yetkilendirme hikâyesi kazandırdı ve bir izleme kör noktasına mal oldu. İkisi de doğru.
Kendi sürümümü geri çektim
Kendi kurulum paketimin güvenlik incelemesinde, üzerinden geçip yayına devam etmenin savunulamayacağı kadar ciddi bir kusur buldum. Sessizce ileriye yama geçmek yerine yayımlanmış paketi geri çektim, sorunu kaynağında düzelttim ve düzgün şekilde yeniden derlenip incelenene kadar yayımlamadım. Eskisinin üzerini örtmek için yeni sürüm yayımlamak, eskisini makinelerde kurulu bırakır; geri çekmek bırakmaz.
Neyi farklı yapardım
Dokümantasyonun yapısız büyümesine izin verdim. Her zaman yüklenen küme sonunda on binlerce token'a ulaştı; çünkü üç ayrı doküman aynı sürüm geçmişinin kendi kopyasını biriktirmişti ve gerçekten kullanılamaz hâle geldi — hem başkaları hem benim için. Düzeltmek, bugünü anlatan dokümanları geçmişi anlatan bir changelog'dan ayırmak ve bu ayrımı bir gelenekle değil bir kontrolle zorunlu kılmak demekti.
Genel ders, tekrar tekrar öğrendiğim şey: kimsenin ölçmediği kural, zaten çiğnenmiş kuraldır. Bu sayfadaki her sınırın, aşıldığında bozulan bir karşılığı var — bir kapı, bir test, bir betik — çünkü yalnızca niyet olarak var olanlar tutmadı.
> Önce reddedeceklerini tasarla. Özellikler onların bıraktığı şekle uyar.
Ürünün asla neyi toplamayacağına erken karar vermek, sonraki kararların çoğunu kolaylaştırdı; çünkü içerik gerektiren hiçbir şey masada değildi.