JSON Serialization Support in nmsg
Introduction
We are pleased to announce that we have added support for
JSON serialization to
libnmsg in version 0.10.0
. This makes
it easier than ever for you to consume NMSG data from our Security Information Exchange (SIE).
Data can now be directly imported into your
Apache Hadoop, Splunk,
HP ArcSight, and
IBM Security QRadar
systems.
It is also easier for you to produce data for publication on SIE without the
need of integrating libnmsg
into your application. You only need to emit
compatible Line Delimited JSON objects that can then be imported by nmsgtool
.
The Format
There are four required fields in the JSON schema: time
, vname
, mname
,
and message
. time
is an ISO 8601 timestamp in UTC with nanosecond precision and no time zone designator. vname
is a string corresponding to the vendor, mname
is the msgtype name of the
msg module that should load the message
object. The message
object
contains presentation format fields specific to the msg module. Binary data is
encoded in base64 because JSON is a
unicode format and does not support the full range of binary characters.
Below is an example of a message from SIE channel 204: deduplicated domain
names.
{ "time": "2015-09-02 17:10:00.464105589", "vname": "SIE", "mname": "dnsdedupe", "source": "a1ba02cf", "message": { "type": "EXPIRATION", "count": 1, "time_first": "2015-09-02 11:29:14", "time_last": "2015-09-02 11:29:14", "bailiwick": "191.54.in-addr.arpa.", "rrname": "84.152.191.54.in-addr.arpa.", "rrclass": "IN", "rrtype": "PTR", "rrttl": 300, "rdata": ["server2.mometrix.com."] } }
Installation
Follow the SIE Installation
instructions. You will need to install wdns 0.8.0
or newer, nmsg 0.10.0
or
newer, and pynmsg 0.4.0
or newer.
You will also need to install a patched version of yajl
until this
pull request is incorporated (there
exists a memory leak in the yajl
tree parser library that occurs whenever
you try to parse invalid JSON strings that has nested objects or arrays. See
the linked pull request for the 3-line fix. This can also, of course, be
worked around by not parsing any invalid JSON strings).
Command line Usage via nmsgtool
We have added two command line options to nmsgtool: -j
for input and -J
for output. Use it just as you would the -r
and -w
options for binary
format.
[-j file] or --readjson read json format data from file [-J file] or --writejson write json format data to file
Read a message from channel 204 and emit to stdout as JSON
$ nmsgtool -C ch204 -c 1 -J -
Read a JSON-formatted file and emit to stdout as presentation format
$ nmsgtool -j input.json
API Usage in C
You can encode and decode messages using the nmsg_message_from_json()
and
nmsg_message_to_json()
functions. Both functions set the pointer in their
second argument on success (return code of nmsg_res_success
) to a block of
memory that the caller is responsible for deallocating after use.
nmsg_res nmsg_message_from_json(const char *json, nmsg_message_t *msg);
nmsg_res nmsg_message_to_json(nmsg_message_t msg, char **json);
You may also instantiate input and output objects that may be used via API
or by attaching to a nmsg_io
object. Simply pass an open file descriptor
and then call using the normal nmsg_input
and nmsg_output
APIs.
nmsg_input_t nmsg_input_open_json(int fd);
nmsg_output_t nmsg_output_open_json(int fd);
msgmod API Changes
We have added two new functions to the msgmod field structure: format and
parse. You will need to implement them in your custom nmsg
msgmods if you
want presentation formatting in the message
object. Without them, libnmsg
will fall back on the standard formatting for the field’s data type.
typedef nmsg_res (*nmsg_msgmod_field_format_fp)(nmsg_message_t m, struct nmsg_msgmod_field *field, void *ptr, struct nmsg_strbuf *sb, const char *endline);
typedef nmsg_res (*nmsg_msgmod_field_parse_fp)(nmsg_message_t m, struct nmsg_msgmod_field *field, const char *value, void **ptr, size_t *len, const char *endline);
struct nmsg_msgmod_field { ..., nmsg_msgmod_field_format_fp format; nmsg_msgmod_field_parse_fp parse; ... }
Python
Usage of these new features within the Python API is similar to that of the
C API. You will need to use pynmsg 0.4.0
or later.
nmsg.message.from_json(str)
m.to_json()
The nmsg.message.from_json
function takes a JSON object as a parameter and
return a nmsg.message object. Correspondingly, each message object has a
to_json
function that returns the JSON reperesentation of that object.
You can instantiate input and output objects using the nmsg.input.open_json
and nmsg.output.open_json
functions. They are called with file names,
integer file descriptors or file objects. The returned object can be used
as-is or attached to a nmsg.io object.
nmsg.input.open_json(...)
nmsg.output.open_json(...)
Conclusion
We hope that this new addition to the NMSG suite will make it easier for you to integrate our data more tightly with your back-end analysis platform of choice as well as make it easier to share your data over SIE.
If you have a sales question, please contact the Farsight Security Sales department at [email protected]. If you have a technical question, please reach out to our technical team.
Henry Stern is a Senior Distributed System Engineer for Farsight Security, Inc.