Hey Jordan,
There's almost certainly a better way to do this, but I had fun creating this search. It works (at least) for the sample data. You'll have to tell me if you run into problems on the live data.
I hope this is useful in some way to you! (copy and paste this search into Splunk)
| makeresults count=1
| eval _raw = "{ \"category\": \"AzureFirewallNetworkRule\", \"time\": \"2019-07-30T17:43:59.9812590Z\", \"resourceId\": \"/SUBSCRIPTIONS/XXXX1111-XX11-XX11-XX11-XXXXXX111111/RESOURCEGROUPS/NET-XXX1-XXX1-RG/PROVIDERS/MICROSOFT.NETWORK/AZUREFIREWALLS/NET-XXX1-XXX1-FW01\", \"operationName\": \"AzureFirewallNetworkRuleLog\", \"properties\": {\"msg\":\"TCP request from XXX.X.178.18:42132 to XXX.X.242.12:51113. Action: Allow\"}}~{ \"category\": \"AzureFirewallNetworkRule\", \"time\": \"2019-07-30T17:44:59.4538600Z\", \"resourceId\": \"/SUBSCRIPTIONS/XXXX1111-XX11-XX11-XX11-XXXXXX111111/RESOURCEGROUPS/NET-XXX1-XXX1-RG/PROVIDERS/MICROSOFT.NETWORK/AZUREFIREWALLS/NET-XXX1-XXX1-FW02\", \"operationName\": \"AzureFirewallNetworkRuleLog\", \"properties\": {\"msg\":\"ICMP request from XXX.X.10.1 to XXX.X.69.5. Action: Allow\"}}~{ \"category\": \"AzureFirewallNetworkRule\", \"time\": \"2019-07-30T16:13:54.9901410Z\", \"resourceId\": \"/SUBSCRIPTIONS/XXXX1111-XX11-XX11-XX11-XXXXXX111111/RESOURCEGROUPS/DMZ-XXX1-XXX1-RG/PROVIDERS/MICROSOFT.NETWORK/AZUREFIREWALLS/DMZ-XXX1-XXX1-FW01\", \"operationName\": \"AzureFirewallNatRuleLog\", \"properties\": {\"msg\":\"TCP request from XXX.X.131.34:3318 to XXX.X.224.170:3299 was DNAT'ed to XXX.X.80.5:3299\"}}~{ \"category\": \"AzureFirewallNetworkRule\", \"time\": \"2019-07-30T16:39:45.5354460Z\", \"resourceId\": \"/SUBSCRIPTIONS/XXXX1111-XX11-XX11-XX11-XXXXXX111111/RESOURCEGROUPS/DMZ-XXX1-XXX1-RG/PROVIDERS/MICROSOFT.NETWORK/AZUREFIREWALLS/DMZ-XXX1-XXX1-FW01\", \"operationName\": \"AzureFirewallThreatIntelLog\", \"properties\": {\"msg\":\"TCP request from XXX.X.231.199:33348 to XXX.X.224.170:443. Action: Alert. ThreatIntel: Port Scan\"}}~{ \"category\": \"AzureFirewallApplicationRule\", \"time\": \"2019-07-30T17:19:00.1880780Z\", \"resourceId\": \"/SUBSCRIPTIONS/XXXX1111-XX11-XX11-XX11-XXXXXX111111/RESOURCEGROUPS/DMZ-XXX1-XXX1-RG/PROVIDERS/MICROSOFT.NETWORK/AZUREFIREWALLS/DMZ-XXX1-XXX1-FW01\", \"operationName\": \"AzureFirewallApplicationRuleLog\", \"properties\": {\"msg\":\"HTTPS request from XXX.X.110.8:65486 to abcd.efghijk.com:443. Action: Deny. No rule matched. Proceeding with default action\"}}~{ \"category\": \"AzureFirewallApplicationRule\", \"time\": \"2019-07-30T12:00:04.0868100Z\", \"resourceId\": \"/SUBSCRIPTIONS/XXXX1111-XX11-XX11-XX11-XXXXXX111111/RESOURCEGROUPS/DMZ-XXX1-XXX1-RG/PROVIDERS/MICROSOFT.NETWORK/AZUREFIREWALLS/DMZ-XXX1-XXX1-FW01\", \"operationName\": \"AzureFirewallApplicationRuleLog\", \"properties\": {\"msg\":\"HTTPS request from XXX.X.66.64:30476. Action: Deny. Reason: SNI TLS extension was missing.\"}}"
| eval raw = split(_raw, "~")
| mvexpand raw
| rename raw AS _raw
`comment("Nothing above here matters, just recreating your dataset. You should be able to copy and paste everything below onto your real search.")`
| rex field=_raw max_match=0 "\"(?<field>[^\"]+)\"\:\s(?<value>.*?)(?:\,\s|\}$)"
| eval field = mvjoin(field,","), value = mvjoin(value,"~,")
| eval field = split(field, ","), value = split(value, ",")
| rename _raw as tempraw
| eval _raw = mvzip(field, value)
| rex field=_raw mode=sed "s/=/|||/g"
| extract kvdelim="," pairdelim="~" mv_add=t
| foreach *
[ rename <<FIELD>> AS <<FIELD>>_temp
| rex field=<<FIELD>>_temp mode=sed "s/\|\|\|/=/g"
| rename <<FIELD>>_temp AS <<FIELD>>]
| fields - field value test
| rex mode=sed field=properties "s/{//g"
| rex mode=sed field=properties "s/}//g"
| rex field=properties max_match=0 "(?<field>[^\:]+)\:(?<value>.*?)(?=\.?\s[A-Za-z]+\:|$)"
| rex field=field mode=sed "s/\.//g"
| rename properties AS _raw
| eval field = mvjoin(field,","), value = mvjoin(value,"~,")
| eval field = split(field, ","), value = split(value, ",")
| eval _raw = mvzip(field, value)
| rex field=_raw mode=sed "s/=/|||/g"
| extract kvdelim="," pairdelim="~" mv_add=t
| foreach *
[ rename <<FIELD>> AS <<FIELD>>_temp
| rex field=<<FIELD>>_temp mode=sed "s/\|\|\|/=/g"
| rename <<FIELD>>_temp AS <<FIELD>>]
| fields - field value
| rename tempraw AS _raw
| rex field=msg "(?<protocol>\S+) request from (?<src_ip>[^\:\s]+)\:?(?<src_port>\d+)? to (?<dest_ip>[^\:\s]+)\:?(?<dest_port>\d+)?"
| rex field=msg "(?<protocol>\S+) request from (?<src_ip>[^\:\s]+)\:?(?<src_port>\d+)?"
| table _time _raw category resourceId operationName src_ip src_port dest_ip dest_port protocol Action Reason ThreatIntel msg *
... View more