Ağ trafiği izleme tarafında imza tabanlı sistemler algılamayı üstlenirken, Zeek tüm trafiğin üstüne kapsamlı bir metadata katmanı bırakır. Bir zamanlar Bro adıyla anılan bu araç, 1990'larda Lawrence Berkeley Ulusal Laboratuvarında Vern Paxson tarafından başlatılan bir araştırma projesiydi. 2018 sonbaharında proje Zeek ismini aldı, 2019'da çıkan 3.0 sürümüyle birlikte binary, script ve log adları da yeni isme geçti, script motoru ve log mimarisi büyük ölçüde korundu. Bugün SOC ekiplerinin elindeki en zengin bağlantı kaynağı olarak kabul edilir.
Tasarım felsefesi
Zeek klasik anlamda bir IPS değildir. Trafik üzerinden geçen her bağlantıyı, protokolü, dosyayı ve sertifikayı ayrıştıran pasif bir analiz çerçevesidir. Yakaladığı paketleri bir olay akışına çevirir, script katmanı bu olayları dinler. Bu yüzden "imza yazmak" yerine "davranış tanımlamak" mümkün olur. Varsayılan kurulumda dinleme portu açmaz, ürettiği tek şey log dizinidir.
Kurulum yolları
İki yol var. Resmî dokümantasyon Ubuntu, Debian ve RHEL ailesi için hazır paket depoları sunar; paket yöneticisiyle kurulur ve güncellemeler sorunsuz geçer. Kaynaktan derleme ise cmake, make, bir C/C++ derleyicisi, flex, bison, libpcap geliştirme kütüphanesi, OpenSSL, zlib, SWIG ve Python 3 bağımlılıklarını ister. Derleme bittikten sonra binaryler kurulum önekine göre /usr/local/zeek/bin gibi bir dizine düşer, PATH değişkenine bu dizini eklemek gerekir.
Hangi yöntem seçilirse seçilsin, dağıtımın sürümüne ve Zeek major sürümüne göre dizin yapıları değişebiliyor. Dokümandaki kurulum sayfası o anki hedef sürüm için doğru yolu verir, oradan ilerlemek en güvenlisi.
zeekctl ve düğüm yapısı
Zeek, ZeekControl adlı yönetim aracıyla çalışır. Tek sensörlü kurulumda bile roller aynıdır: manager kümenin beyni, proxy konfigürasyon dağıtımını hafifletir, worker ise arayüzden paket okuyan asıl işçidir. Güncel sürümlerde logger adlı dördüncü bir rol daha vardır ve kümeye ait logları tek noktada toplar. Roller node.cfg dosyasında tanımlanır:
[logger-1]
type=logger
host=localhost
[manager]
type=manager
host=localhost
[proxy-1]
type=proxy
host=localhost
[worker-1]
type=worker
host=localhost
interface=eth0 Konfigürasyon sonrası zeekctl deploy tüm düğümlere kurulum yapar ve süreci başlatır. zeekctl status düğüm durumunu, zeekctl diag sorun çıkan worker için tanı bilgisini verir. Trafik yükseldiğinde aynı makineye ek worker tanımlayıp arayüzü paylaştırmak yerine, donanım izin veriyorsa birden fazla sensörü bir manager altında toplamak ölçeklenen yapıdır.
Log yığını
Üretilen loglar gün bazında dizinlenir ve varsayılan olarak sekmeyle ayrılmış düz metindir. Belli başlı dosyalar:
conn.log: her bağlantı için kaynak ve hedef adres, port, süre, iki yönlü bayt sayısı, tespit edilen servisdns.log: sorgu, cevap, kayıt tipihttp.log: metot, host, uri, user_agent, durum kodussl.logvex509.log: SNI bilgisi, sertifika detayları, geçerlilikfiles.log: aktarılan dosyalar ve hesaplanan özetlernotice.log: scriptlerin ürettiği uyarılarweird.log: protokol davranışındaki anormallikler
Her kayda kısa bir uid değeri yazılır; aynı bağlantının http, ssl ve files kayıtları bu uid üzerinden birbirine bağlanır. Kolay bir başlangıç soruşturması bu yüzden tek grep zinciriyle yürür. Logları JSON formatına çevirmek için local.zeek içine bir satır yeterlidir:
@load policy/tuning/json-logs.zeek Pcap analizi ve script dili
Canlı trafiğin yanında eldeki pcap dosyaları da işlenebilir: zeek -r kayit.pcap komutu logları bulunduğunuz dizine yazar. Aynı scriptler canlı sensörle pcap analizi arasında değişiklik gerektirmeden çalışır, olay tabanlı yapı sayesinde:
event ssh_auth_failed(c: connection)
{
print fmt("SSH kimlik doğrulama hatası: %s -> %s",
c$id$orig_h, c$id$resp_h);
} Bu örnek her başarısız SSH denemesini basar. Aynı olayı bir sayaçla izleyip eşiği aşan kaynak adresi Notice çerçevesiyle notice.log kaydına düşürmek, brute force tarzı senaryoların klasik Zeek karşılığıdır. Özel scriptler site/local.zeek içinden @load ile devreye alınır.
zkg, intel ve dosya çıkarma
Ek yetenekler Zeek Package Manager ile kurulur; zkg install komutu topluluk deposundaki script paketlerini çeker. Eldeki göstergeleri beslemek için intel çerçevesi hazır gelir:
@load policy/frameworks/intel/seen
@load policy/frameworks/intel/do_notice Sekmeyle ayrılmış IOC listesi tanımlandığında, trafiğe düşen bir eşleşme otomatik uyarıya dönüşür. Aktarılan dosyaları diske çıkarmak isteyenler için de tek bir satırlık hazır script vardır: @load policy/frameworks/files/extract-all-files. Çıkan dosyalar hash değerleriyle birlikte files.log kaydına bağlanır.
Suricata ile yan yana
Zeek ile Suricata rakip değil, tamamlayıcı iki araçtır. Aynı SPAN veya TAP üzerinden ikisine trafik verildiğinde Suricata imzalarla hızlı vuruş yapar, Zeek olay zincirini ve metadata zenginliğini sağlar. Çıktılar Filebeat üzerindeki Zeek modülüyle Elasticsearch gibi bir arama katmanına taşınır; soruşturma ekranında conn, dns ve http kayıtları uid ile birleştirilir.
Başlangıç için tek arayüzlü bir sensör, varsayılan policy seti ve JSON log çıktısı yeterli. Logları okumaya başladıktan sonra hangi scriptin yazılacağı kendiliğinden ortaya çıkar.
