Event Logs'ta AND/OR, NOT, regex ve JSONata ifadeleriyle gelişmiş filtre yazabilir miyim?
Kısa cevap
Evet. Sunucu filtresindeki Log Filter koşul oluşturucusu bunların hepsini destekler. AND/OR: koşullar gruplar hâlinde kurulur; grup içinde Add Condition ile koşul, ilk grubun yanındaki + ikonuyla yeni grup eklenir (en fazla 10 grup) ve grup içi bağlantı (varsayılan and) ile gruplar arası bağlantı (varsayılan or) ayrı anahtarlarla seçilir. NOT: ayrı bir "değil" anahtarı yoktur; her operatörün olumsuzu kendi seçeneğidir (Not equal to, None of, Includes None of, Does not contain, Does not start with, Does not end with, Does not match regex). Regex: Matches Regex ve Does not match regex JavaScript düzenli ifadesi alır. Metin karşılaştırmaları ve regex büyük/küçük harf ayrımı gözetmez. Sayısal alanlarda Greater than ve Less than türevleri, Client IP alanında IP/cidr match, Global WAF Event Log'daki vService alanı dışında her alanda Exists bulunur. JSONata: alan listesinden ⚡ Expression (JSONata) seçilir ve ifade yazılır (ör. "veryHigh" in $severity()). Filtre Save & Get Logs ile uygulanır ve sunucuda çalışır; aynı oluşturucu WAF Report'taki Report Filter alanında da kullanılır.
Söz Dizimi
| Gereksinim | Karşılığı |
|---|---|
| VE / VEYA | Grup içinde ve gruplar arasında and / or anahtarı |
| DEĞİL | Operatörün olumsuz seçeneği |
| Eşitlik ve liste | Equals to / Not equal to · Any of / None of |
| Metin | Contains, Starts with, Ends with ve olumsuzları |
| Regex | Matches Regex / Does not match regex |
| Sayı (WAF score, ASN) | Greater than, Greater than or Equal to, Less than, Less than or Equal to |
| IP bloğu (Client IP) | IP/cidr match |
| Sınıflandırma (Taxonomy grubu, Severity) | Includes Any of / Includes None of |
| Varlık | Exists |
| Serbest ifade | ⚡ Expression (JSONata) |
Hangi operatörün sunulduğunu alanın türü belirler; ör. Country yalnızca eşitlik, liste ve Exists operatörlerini, Monitor Only ve Blacklist gibi evet/hayır alanları Equals to ve Exists operatörlerini sunar.
Çözüm
Log Filter ile Koşul Grubu
- Nasıl çalışırLog Filter sunucu tarafında, okunan her kayda uygulanır; Line Limit kadar uyan kayıt bulunana ya da tarih aralığı bitene kadar okuma geriye doğru sürer. Saldırı bazlı alanlar (Taxonomy grubu, Severity) ya da JSONata ifadesi içeren filtrelerde, koşula uymayan saldırılar kayıttan çıkarılır.
- Nerede açılırEvent Logs ya da Global WAF Event Log → filtre şeridinin başındaki sunucu filtresi sekmesi → Log Filter
- Gereksinim WAF yetkisi
- vService tipi HTTP
Adım adım yapılandırma
Örnek: Rusya ya da Çin'den gelen ve SQL Injection kategorisinde engellenen istekler.
Event Logs ekranında filtre şeridinin başındaki sabit sekmeye tıklanır (sunucu filtresi).
Log Filter satırındaki Add Advanced Filter butonuna tıklanır; ilk grup ve ilk koşul açılır.
Alan Network · Country, operatör Any of, değer olarak iki ülke seçilir.
Grubun altındaki Add Condition tıklanır; yeni koşulda Taxonomy · Category → Includes Any of → SQL Injection seçilir. Grup içi bağlantı anahtarı and konumunda bırakılır.
Add Condition ile WAF · Action → Equals to → Blocking eklenir.
Başka bir koşul kümesi veya ile eklenecekse ilk grubun yanındaki yeşil + ikonuna tıklanır; gruplar arası anahtar varsayılan olarak or gelir, gerekirse and yapılır.
Save & Get Logs tıklanır; filtre kullanıcı bazında saklanır.
Regex örneği: Request · Path → Matches Regex → ^/api/v[0-9]+/ değeri /api/v1/users ve /API/V2/x yollarını yakalar, /apiv1/ yolunu yakalamaz. Desen JavaScript düzenli ifadesi olarak derlenir; geçersiz desen kaydedildiğinde filtre çalıştırılamaz ve hata döner.
JSONata örneği: Alan listesinden ⚡ Expression (JSONata) seçilip JSONata ifadesi yazılır. İfade şu hazır fonksiyonları kullanabilir: $categories(), $cwes(), $mitres(), $capecs(), $owaspWebs(), $owaspApis(), $targets(), $attackIds(), $scopes(), $severity(), $action(), $learned(), $blacklisted().
"veryHigh" in $severity()
$action() = "blocking" and "sqlInjection" in $categories()İlk ifade en az bir Very High saldırısı olan kayıtları, ikincisi engellenmiş ve SQL Injection kategorisinde saldırı taşıyan kayıtları seçer. $action() değeri blocking, monitor ya da teacher; $severity() değerleri blacklist, structural, veryHigh, high, medium, low, veryLow olur; $categories() kategori kimliklerini (ör. sqlInjection, xss) döndürür. JSONata ifadesi içeren bir filtre kayıttaki her saldırı için ayrı ayrı değerlendirilir: ifadeye uyan saldırılar kayıtta kalır, uymayanlar kayıttan çıkarılır. Bu nedenle ifade içinde attacks her seferinde tek bir saldırı taşır; saldırı sayısına dayalı bir ifade ($count(attacks) > 2 gibi) beklenen kayıtları seçmez. Puan, IP, path gibi istek düzeyindeki koşullar aynı grupta WAF Score → Greater than gibi alan koşullarıyla kurulur.
Doğrulama
Sunucu filtresi sekmesinin başlığı tanımlı koşul sayısını gösterir; listedeki kayıtların Action ikonu ve önizlemedeki saldırılar koşulla karşılaştırılır.
Last 7 day(s) - 3 advanced filter(s)Sık Karıştırılan Noktalar
- "Regex büyük/küçük harfe duyarlıdır." Log Filter'daki metin karşılaştırmaları ve regex harf ayrımı gözetmez.
- "NOT için ayrı bir anahtar vardır." Olumsuzluk operatörün olumsuz seçeneğiyle kurulur.
- "Sekme başlığındaki sayı grup sayısıdır." Sayı, gruplardaki toplam koşul sayısıdır.
- "Filtre şeridindeki seçimler Log Filter'a eklenir." Şerit yalnızca çekilmiş kayıtları süzer; Log Filter hangi kayıtların çekileceğini belirler (Logları IP, ülke, ASN, path, imza, kategori, OWASP, CWE gibi alanlara göre nasıl filtrelerim?).
- "Request Unique ID gelişmiş filtrede bir alandır." Kimlik için sunucu filtresinde ayrı Request Unique ID kutusu vardır (Belirli bir isteği Request Unique ID ile nasıl bulurum?).
Dokümantasyonda nasıl yapılır
