Elastic critical stable kql
Newly Observed FortiGate Alert
This rule detects FortiGate alerts that are observed for the first time in the previous 5 days of alert history. Analysts can use this to prioritize triage and response.
Detection Logic
FROM logs-fortinet_fortigate.*, filebeat-* metadata _id
| WHERE event.module == "fortinet_fortigate" and event.action in ("signature", "ssl-anomaly") and
message is not null and event.category != "authentication" and
message != "Connection Failed" and not message like "Web.Client: *" and
not message like "Network.Service: *" and not message like "General.Interest*" and not message like "Update: *" and
not message like "tcp_reassembler*" and not message like "a-ipdf*" and not message like "Video*" and not message like "nbss_decode*" and
not message like "name_server*" and not message like "misc*" and not message like "Collaboration*" and not message like "Business*" and
not message like "Cloud.IT*" and not message like "Mobile*"
| STATS Esql.alerts_count = count(*),
Esql.first_time_seen = MIN(@timestamp),
Esql.distinct_count_src_ip = COUNT_DISTINCT(source.ip),
Esql.distinct_count_dst_ip = COUNT_DISTINCT(destination.ip),
src_ip = VALUES(source.ip),
dst_ip = VALUES(destination.ip),
url_domain = VALUES(url.domain),
url_path = VALUES(url.path) by message, event.category, event.outcome
// first time seen is within 10m of the rule execution time
| eval Esql.recent = DATE_DIFF("minute", Esql.first_time_seen, now())
| where Esql.recent <= 10 and Esql.alerts_count <= 5 and Esql.distinct_count_src_ip <= 2 and Esql.distinct_count_dst_ip <= 2
// move dynamic fields to ECS equivalent for rule exceptions
| eval source.ip = MV_FIRST(src_ip),
destination.ip = MV_FIRST(dst_ip),
url.domain = MV_FIRST(url_domain),
url.path = MV_FIRST(url_path)
| keep message, event.category, event.outcome, Esql.*, source.ip, destination.ip, url.domain, url.path Field Validations
Loading…
Comments (0)
Loading comments...