In this query I correlate 'Appliace Access' log entries logged by the Sophos Firewall to see if someone ran a port scan against my IP address / appliance.
-- VARIABLE $$Ports_Seen_Threshold$$ String -- Ignoring log entries with src_port 53 (DNS) due to Unity Media Connect Box reset issues WITH IP_Ports AS ( SELECT distinct device_serial_id AS Device_ID, src_ip AS Source_IP, dst_port, in_interface AS Interface, CAST(timestamp AS DATE) AS Scan_Date FROM xgfw_data WHERE log_type = 'Firewall' AND log_component = 'Appliance Access' AND src_port <> 53 ORDER BY dst_port ), IP_Port_Count AS ( SELECT Device_ID, Source_IP, COUNT(dst_port) AS Port_Count, array_join(array_agg(dst_port), ',') AS Port_List, Interface, Scan_Date FROM IP_Ports GROUP BY Source_IP, Interface, Scan_Date, Device_ID ) SELECT 'PORTSCAN DETECTED' AS Detection, Scan_Date, Source_IP, Port_Count, Port_List, Interface, Device_ID FROM IP_Port_Count WHERE Port_Count >= $$Ports_Seen_Threshold$$ ORDER BY Scan_Date DESC
Below you will find an example of the output generated. Note that ýou can use the pivot functions (the 3 dots behind the IP addresses listed) to get additional information about them.
Please note that I had to exclude source port 53 due to some strange behavior of my router. You can remove this part of the query ('AND src_port <> 53) if you want to include port 53 as source as well.