Zeek Community ID#
The communityid
module is designed to implement the Zeek Community ID spec, a cross-platform identifier that can uniquely identify a given network connection between two systems. The communityid
module can therefore be used to link network flows across disparate data types. Additional information about the Zeek Community ID specification can be found on the Zeek webpage and the Zeek Github Repository.
The module takes two IP:port pairs plus a protocol identifier and computes a hash that represents the network flow. The ports are optional and ignored for non-TCP and non-UDP protocols. If ports are not provided and the community ID algorithm expects them for the calculation, zero values are inserted.
tag=netflow netflow Src SrcPort Dst DstPort Protocol
| communityid Src Dst SrcPort DstPort Protocol
| table
The ordering of source and destination ip port pairs is computed inside the algorithm, so you do not need to resolve the source or destination beforehand. However, it is critical that the order of ports match the source and destination IP addresses.
Community id parameters are orderd as <IP A> <IP B> <Port A> <Port B> <Protocol Number>
where the two port specifications are optional.
It is valid to exclude both port numbers: <IP A> <IP B> <Protocol Number>
. Note that including one port but not the other is invalid.
Note
The communityid
module requires the protocol number, it will not resolve a protocol name.
Examples#
Zeek Conn Logs#
In this example we show how to get a community ID value from traditional Zeek conn logs. These logs include the protocol by name rather than number, which means we need to use the network_services
resource from the Gravwell Network Enrichment kit to resolve the name back to a number. In this example we are also using the autoextractors provided in the Gravwell Zeek Kit to process the TSV Zeek logs.
tag=zeekconn ax
| lookup -r network_services proto proto_name proto_number
| communityid orig resp orig_port resp_port proto_number
| table orig resp orig_port resp_port proto proto_number cid
IPFIX#
In this example we generate a community ID value from IPFIX data. This example uses the native IP, port, and protocol values from within the IPFIX datatypes. No lookups are needed.
tag=ipfix ipfix src dst srcPort dstPort protocolIdentifier
| communityid src dst srcPort dstPort protocolIdentifier
| table
ICMP Example#
In this example we generate a community ID value from a data source that may not have ports. We are using Zeek Conn logs and ICMP traffic for this example, but if you had text records of ICMP traffic they would work too. Note that rather than using a lookup, we simply set proto_number
manually
tag=zeekconn ax proto==icmp
| enrich proto_number 1
| communityid orig resp proto_number
| table orig resp proto proto_number cid