Go to the documentation of this file.
92 #define MODULE_NAME "JsonAlertLog"
94 #define LOG_JSON_PAYLOAD BIT_U16(0)
95 #define LOG_JSON_PACKET BIT_U16(1)
96 #define LOG_JSON_PAYLOAD_BASE64 BIT_U16(2)
97 #define LOG_JSON_TAGGED_PACKETS BIT_U16(3)
98 #define LOG_JSON_APP_LAYER BIT_U16(4)
99 #define LOG_JSON_FLOW BIT_U16(5)
100 #define LOG_JSON_HTTP_BODY BIT_U16(6)
101 #define LOG_JSON_HTTP_BODY_BASE64 BIT_U16(7)
102 #define LOG_JSON_RULE_METADATA BIT_U16(8)
103 #define LOG_JSON_RULE BIT_U16(9)
104 #define LOG_JSON_VERDICT BIT_U16(10)
106 #define METADATA_DEFAULTS ( LOG_JSON_FLOW | \
107 LOG_JSON_APP_LAYER | \
108 LOG_JSON_RULE_METADATA)
110 #define JSON_BODY_LOGGING (LOG_JSON_HTTP_BODY | LOG_JSON_HTTP_BODY_BASE64)
112 #define JSON_STREAM_BUFFER_SIZE 4096
131 static int AlertJsonDumpStreamSegmentCallback(
132 const Packet *p,
TcpSegment *seg,
void *data,
const uint8_t *buf, uint32_t buflen)
140 static void AlertJsonTls(
const Flow *f, JsonBuilder *js)
144 jb_open_object(js,
"tls");
154 static void AlertJsonSsh(
const Flow *f, JsonBuilder *js)
156 void *ssh_state = FlowGetAppState(f);
158 JsonBuilderMark mark = { 0, 0, 0 };
159 void *tx_ptr = rs_ssh_state_get_tx(ssh_state, 0);
160 jb_get_mark(js, &mark);
161 jb_open_object(js,
"ssh");
162 if (rs_ssh_log_json(tx_ptr, js)) {
165 jb_restore_mark(js, &mark);
172 static void AlertJsonHttp2(
const Flow *f,
const uint64_t tx_id, JsonBuilder *js)
174 void *h2_state = FlowGetAppState(f);
176 void *tx_ptr = rs_http2_state_get_tx(h2_state, tx_id);
178 JsonBuilderMark mark = { 0, 0, 0 };
179 jb_get_mark(js, &mark);
180 jb_open_object(js,
"http");
181 if (rs_http2_log_json(tx_ptr, js)) {
184 jb_restore_mark(js, &mark);
192 static void AlertJsonDnp3(
const Flow *f,
const uint64_t tx_id, JsonBuilder *js)
199 JsonBuilderMark mark = { 0, 0, 0 };
200 jb_get_mark(js, &mark);
202 jb_open_object(js,
"dnp3");
204 jb_open_object(js,
"request");
210 jb_open_object(js,
"response");
219 jb_restore_mark(js, &mark);
225 static void AlertJsonDns(
const Flow *f,
const uint64_t tx_id, JsonBuilder *js)
227 void *dns_state = (
void *)FlowGetAppState(f);
232 jb_open_object(js,
"dns");
235 jb_set_object(js,
"query", qjs);
240 jb_set_object(js,
"answer", ajs);
249 static void AlertJsonSNMP(
const Flow *f,
const uint64_t tx_id, JsonBuilder *js)
251 void *snmp_state = (
void *)FlowGetAppState(f);
252 if (snmp_state != NULL) {
256 jb_open_object(js,
"snmp");
257 rs_snmp_log_json_response(js, tx);
263 static void AlertJsonRDP(
const Flow *f,
const uint64_t tx_id, JsonBuilder *js)
265 void *rdp_state = (
void *)FlowGetAppState(f);
266 if (rdp_state != NULL) {
270 JsonBuilderMark mark = { 0, 0, 0 };
271 jb_get_mark(js, &mark);
272 if (!rs_rdp_to_json(tx, js)) {
273 jb_restore_mark(js, &mark);
279 static void AlertJsonBitTorrentDHT(
const Flow *f,
const uint64_t tx_id, JsonBuilder *js)
281 void *bittorrent_dht_state = (
void *)FlowGetAppState(f);
282 if (bittorrent_dht_state != NULL) {
286 JsonBuilderMark mark = { 0, 0, 0 };
287 jb_get_mark(js, &mark);
288 jb_open_object(js,
"bittorrent_dht");
289 if (rs_bittorrent_dht_logger_log(tx, js)) {
292 jb_restore_mark(js, &mark);
301 jb_open_object(js,
"source");
303 jb_set_string(js,
"ip", addr->
src_ip);
311 jb_set_uint(js,
"port", addr->
sp);
315 jb_set_string(js,
"ip", addr->
dst_ip);
323 jb_set_uint(js,
"port", addr->
dp);
329 jb_open_object(js,
"target");
331 jb_set_string(js,
"ip", addr->
dst_ip);
339 jb_set_uint(js,
"port", addr->
dp);
343 jb_set_string(js,
"ip", addr->
src_ip);
351 jb_set_uint(js,
"port", addr->
sp);
370 const char *action =
"allowed";
387 jb_set_uint(js,
"tx_id", pa->
tx_id);
390 jb_open_object(js,
"alert");
392 jb_set_string(js,
"action", action);
393 jb_set_uint(js,
"gid", pa->
s->
gid);
394 jb_set_uint(js,
"signature_id", pa->
s->
id);
395 jb_set_uint(js,
"rev", pa->
s->
rev);
398 jb_set_string(js,
"signature", pa->
s->
msg ? pa->
s->
msg:
"");
400 jb_set_uint(js,
"severity", pa->
s->
prio);
403 jb_set_uint(js,
"tenant_id", p->
tenant_id);
407 AlertJsonSourceTarget(p, pa, js, addr);
411 AlertJsonMetadata(json_output_ctx, pa, js);
415 jb_set_string(js,
"rule", pa->
s->
sig_str);
417 if (xff_buffer && xff_buffer[0]) {
418 jb_set_string(js,
"xff", xff_buffer);
424 static void AlertJsonTunnel(
const Packet *p, JsonBuilder *js)
426 if (p->
root == NULL) {
430 jb_open_object(js,
"tunnel");
439 jb_set_string(js,
"src_ip", addr.
src_ip);
440 jb_set_uint(js,
"src_port", addr.
sp);
441 jb_set_string(js,
"dest_ip", addr.
dst_ip);
442 jb_set_uint(js,
"dest_port", addr.
dp);
443 jb_set_string(js,
"proto", addr.
proto);
447 jb_set_uint(js,
"pcap_cnt", pcap_cnt);
466 jb_set_string(js,
"payload_printable", (
char *)printable_buf);
470 static void AlertAddAppLayer(
const Packet *p, JsonBuilder *jb,
471 const uint64_t tx_id,
const uint16_t option_flags)
474 JsonBuilderMark mark = { 0, 0, 0 };
478 jb_open_object(jb,
"http");
490 AlertJsonTls(p->
flow, jb);
493 AlertJsonSsh(p->
flow, jb);
496 jb_get_mark(jb, &mark);
497 jb_open_object(jb,
"smtp");
501 jb_restore_mark(jb, &mark);
503 jb_get_mark(jb, &mark);
504 jb_open_object(jb,
"email");
508 jb_restore_mark(jb, &mark);
513 jb_get_mark(jb, &mark);
514 jb_open_object(jb,
"rpc");
518 jb_restore_mark(jb, &mark);
521 jb_get_mark(jb, &mark);
522 jb_open_object(jb,
"nfs");
526 jb_restore_mark(jb, &mark);
530 jb_get_mark(jb, &mark);
531 jb_open_object(jb,
"smb");
535 jb_restore_mark(jb, &mark);
542 jb_get_mark(jb, &mark);
544 jb_restore_mark(jb, &mark);
548 jb_get_mark(jb, &mark);
549 jb_open_object(jb,
"ftp_data");
554 AlertJsonDnp3(p->
flow, tx_id, jb);
557 AlertJsonHttp2(p->
flow, tx_id, jb);
560 AlertJsonDns(p->
flow, tx_id, jb);
563 jb_get_mark(jb, &mark);
565 jb_restore_mark(jb, &mark);
569 jb_get_mark(jb, &mark);
571 jb_restore_mark(jb, &mark);
575 jb_get_mark(jb, &mark);
577 jb_restore_mark(jb, &mark);
581 AlertJsonSNMP(p->
flow, tx_id, jb);
584 AlertJsonRDP(p->
flow, tx_id, jb);
587 jb_get_mark(jb, &mark);
589 jb_restore_mark(jb, &mark);
593 AlertJsonBitTorrentDHT(p->
flow, tx_id, jb);
600 static void AlertAddFiles(
const Packet *p, JsonBuilder *jb,
const uint64_t tx_id)
602 const uint8_t direction =
608 AppLayerGetFileState files =
619 jb_open_array(jb,
"files");
632 static void AlertAddFrame(
const Packet *p, JsonBuilder *jb,
const int64_t frame_id)
638 if (frames_container == NULL)
643 if (p->
proto == IPPROTO_TCP) {
647 frames = &frames_container->
toserver;
650 frames = &frames_container->
toclient;
656 }
else if (p->
proto == IPPROTO_UDP) {
658 frames = &frames_container->
toserver;
660 frames = &frames_container->
toclient;
677 jb_open_object(jb,
"verdict");
694 jb_open_array(jb,
"reject");
699 jb_append_string(jb,
"icmp-prohib");
702 jb_append_string(jb,
"tcp-reset");
728 for (
int i = 0; i < p->
alerts.
cnt; i++) {
781 AlertJsonTunnel(p, jb);
784 if (p->
flow != NULL) {
786 AlertAddAppLayer(p, jb, pa->
tx_id, json_output_ctx->
flags);
790 AlertAddFiles(p, jb, pa->
tx_id);
796 jb_set_string(jb,
"direction",
"to_server");
798 jb_set_string(jb,
"direction",
"to_client");
802 jb_open_object(jb,
"flow");
805 jb_set_string(jb,
"src_ip", addr.
dst_ip);
806 jb_set_string(jb,
"dest_ip", addr.
src_ip);
808 jb_set_uint(jb,
"src_port", addr.
dp);
809 jb_set_uint(jb,
"dest_port", addr.
sp);
812 jb_set_string(jb,
"src_ip", addr.
src_ip);
813 jb_set_string(jb,
"dest_ip", addr.
dst_ip);
815 jb_set_uint(jb,
"src_port", addr.
sp);
816 jb_set_uint(jb,
"dest_port", addr.
dp);
825 int stream = (p->
proto == IPPROTO_TCP) ?
842 AlertJsonDumpStreamSegmentCallback,
846 jb_set_base64(jb,
"payload", payload->
buffer, payload->
offset);
850 uint8_t printable_buf[payload->
offset + 1];
853 sizeof(printable_buf),
855 jb_set_string(jb,
"payload_printable", (
char *)printable_buf);
859 AlertAddPayload(json_output_ctx, jb, p);
863 AlertAddPayload(json_output_ctx, jb, p);
866 jb_set_uint(jb,
"stream", stream);
893 JsonBuilder *packetjs =
915 for (
int i = 0; i < p->
alerts.
cnt; i++) {
921 JsonBuilder *jb = jb_new_object();
927 jb_set_string(jb,
"timestamp", timebuf);
943 return AlertJson(
tv, aft, p);
945 return AlertJsonDecoderEvent(
tv, aft, p);
958 static TmEcode JsonAlertLogThreadInit(
ThreadVars *t,
const void *initdata,
void **data)
964 if (initdata == NULL)
966 SCLogDebug(
"Error getting context for EveLogAlert. \"initdata\" argument NULL");
1012 static void JsonAlertLogDeInitCtxSub(
OutputCtx *output_ctx)
1014 SCLogDebug(
"cleaning up sub output_ctx %p", output_ctx);
1018 if (json_output_ctx != NULL) {
1020 if (xff_cfg != NULL) {
1028 static void SetFlag(
const ConfNode *conf,
const char *name, uint16_t flag, uint16_t *out_flags)
1032 if (setting != NULL) {
1036 *out_flags &= ~flag;
1041 #define DEFAULT_LOG_FILENAME "alert.json"
1046 static bool warn_no_meta =
false;
1053 if (metadata != NULL) {
1058 if (rule_metadata) {
1078 static const char *deprecated_flags[] = {
"http",
"tls",
"ssh",
"smtp",
"dnp3",
"app-layer",
1080 for (
int i = 0; deprecated_flags[i] != NULL; i++) {
1082 SCLogWarning(
"Found deprecated eve-log.alert flag \"%s\", this flag has no effect",
1083 deprecated_flags[i]);
1089 if (payload_buffer_value != NULL) {
1093 "payload-buffer-size - %s. Killing engine",
1094 payload_buffer_value);
1097 payload_buffer_size = value;
1103 SCLogWarning(
"HTTP body logging has been configured, however, "
1104 "metadata logging has not been enabled. HTTP body logging will be "
1107 warn_no_meta =
true;
1126 if (
likely(xff_cfg != NULL)) {
1149 if (
unlikely(json_output_ctx == NULL)) {
1155 json_output_ctx->
eve_ctx = ajt;
1157 JsonAlertLogSetupMetadata(json_output_ctx, conf);
1158 json_output_ctx->
xff_cfg = JsonAlertLogGetXffCfg(conf);
1159 if (json_output_ctx->
xff_cfg == NULL) {
1163 output_ctx->
data = json_output_ctx;
1164 output_ctx->
DeInit = JsonAlertLogDeInitCtxSub;
1166 result.
ctx = output_ctx;
1171 if (json_output_ctx != NULL) {
1174 if (output_ctx != NULL) {
1184 "eve-log.alert", JsonAlertLogInitCtxSub, JsonAlertLogger,
1185 JsonAlertLogCondition, JsonAlertLogThreadInit, JsonAlertLogThreadDeinit,
bool PacketCheckAction(const Packet *p, const uint8_t a)
void FrameJsonLogOneFrame(const uint8_t ipproto, const Frame *frame, const Flow *f, const TcpStream *stream, const Packet *p, JsonBuilder *jb)
log a single frame
SSLv[2.0|3.[0|1|2|3]] state structure.
#define PACKET_ALERT_FLAG_STREAM_MATCH
bool EveSMTPAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js)
const struct Signature_ * s
void EveHttpLogJSONBodyPrintable(JsonBuilder *js, Flow *f, uint64_t tx_id)
#define STREAM_DUMP_TOSERVER
#define PACKET_ALERT_FLAG_TX
void CreateIsoTimeString(const SCTime_t ts, char *str, size_t size)
HttpXFFCfg * parent_xff_cfg
void FreeEveThreadCtx(OutputJsonThreadCtx *ctx)
int StreamSegmentForEach(const Packet *p, uint8_t flag, StreamSegmentCallback CallbackFunc, void *data)
#define SIG_FLAG_DEST_IS_TARGET
JsonBuilder * JsonDNSLogAnswer(void *txptr)
bool JsonModbusAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js)
bool JsonQuicAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js)
bool EveNFSAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *jb)
int OutputJsonBuilderBuffer(JsonBuilder *js, OutputJsonThreadCtx *ctx)
OutputJsonThreadCtx * CreateEveThreadCtx(ThreadVars *t, OutputJsonCtx *ctx)
const JsonAddrInfo json_addr_info_zero
#define FLOW_PKT_TOSERVER
#define ACTION_REJECT_ANY
void EveFileInfo(JsonBuilder *jb, const File *ff, const uint64_t tx_id, const uint16_t flags)
#define ACTION_DROP_REJECT
bool EveHttpAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js)
int ConfValIsTrue(const char *val)
Check if a value is true.
int HttpXFFGetIP(const Flow *f, HttpXFFCfg *xff_cfg, char *dstbuf, int dstbuflen)
Function to return XFF IP if any. The caller needs to lock the flow.
char * PcapLogGetFilename(void)
void PrintStringsToBuffer(uint8_t *dst_buf, uint32_t *dst_buf_offset_ptr, uint32_t dst_buf_size, const uint8_t *src_buf, const uint32_t src_buf_len)
size_t strlcpy(char *dst, const char *src, size_t siz)
#define JSON_BODY_LOGGING
JsonBuilder * JsonDNSLogQuery(void *txptr)
#define ACTION_REJECT_DST
OutputJsonThreadCtx * ctx
#define JB_SET_STRING(jb, key, val)
#define PKT_IS_TOSERVER(p)
bool JsonRFBAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js)
#define LOG_JSON_APP_LAYER
Frame * FrameGetById(Frames *frames, const int64_t id)
#define MemBufferWriteRaw(dst, raw_buffer, raw_buffer_len)
Write a raw buffer to the MemBuffer dst.
bool EveIKEAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js)
JsonBuilder * CreateEveHeader(const Packet *p, enum OutputJsonLogDirection dir, const char *event_type, JsonAddrInfo *addr, OutputJsonCtx *eve_ctx)
Per thread variable structure.
const char * PktSrcToString(enum PktSrcEnum pkt_src)
struct JsonAlertLogThread_ JsonAlertLogThread
#define SCLogWarning(...)
Macro used to log WARNING messages.
void JsonDNP3LogResponse(JsonBuilder *js, DNP3Transaction *dnp3tx)
void EveHttpLogJSONBodyBase64(JsonBuilder *js, Flow *f, uint64_t tx_id)
FramesContainer * AppLayerFramesGetContainer(Flow *f)
#define JSON_STREAM_BUFFER_SIZE
#define LOG_JSON_PAYLOAD_BASE64
#define SIG_FLAG_HAS_TARGET
#define SIG_FLAG_SRC_IS_TARGET
bool EveNFSAddMetadataRPC(const Flow *f, uint64_t tx_id, JsonBuilder *jb)
void AlertJsonHeader(void *ctx, const Packet *p, const PacketAlert *pa, JsonBuilder *js, uint16_t flags, JsonAddrInfo *addr, char *xff_buffer)
uint32_t payload_buffer_size
bool ConfNodeHasChildren(const ConfNode *node)
Check if a node has any children.
#define FLOW_PKT_TOCLIENT
#define LOG_JSON_TAGGED_PACKETS
void * AppLayerParserGetTx(uint8_t ipproto, AppProto alproto, void *alstate, uint64_t tx_id)
bool EveEmailAddMetadata(const Flow *f, uint32_t tx_id, JsonBuilder *js)
char proto[JSON_PROTO_LEN]
ConfNode * ConfNodeLookupChild(const ConfNode *node, const char *name)
Lookup a child configuration node by name.
#define ACTION_REJECT_BOTH
#define MemBufferReset(mem_buffer)
Reset the mem buffer.
#define PACKET_ALERT_RATE_FILTER_MODIFIED
void(* DeInit)(struct OutputCtx_ *)
void OutputRegisterPacketSubModule(LoggerId id, const char *parent_name, const char *name, const char *conf_name, OutputInitSubFunc InitFunc, PacketLogger PacketLogFunc, PacketLogCondition PacketConditionFunc, ThreadInitFunc ThreadInit, ThreadDeinitFunc ThreadDeinit, ThreadExitPrintStatsFunc ThreadExitPrintStats)
Register a packet output sub-module.
char pcap_filename[PATH_MAX]
AlertJsonOutputCtx * json_output_ctx
void EveAddVerdict(JsonBuilder *jb, const Packet *p)
Build verdict object.
void MemBufferFree(MemBuffer *buffer)
void EveAddAppProto(Flow *f, JsonBuilder *js)
void EvePacket(const Packet *p, JsonBuilder *js, unsigned long max_length)
Jsonify a packet.
int ParseSizeStringU32(const char *size, uint32_t *res)
char src_ip[JSON_ADDR_LEN]
DetectMetadataHead * metadata
#define PACKET_ALERT_FLAG_FRAME
#define SCLogError(...)
Macro used to log ERROR messages.
struct AlertJsonOutputCtx_ AlertJsonOutputCtx
MemBuffer * payload_buffer
#define STREAM_DUMP_TOCLIENT
#define LOG_JSON_HTTP_BODY_BASE64
int ConfValIsFalse(const char *val)
Check if a value is false.
char dst_ip[JSON_ADDR_LEN]
void EveFTPDataAddMetadata(const Flow *f, JsonBuilder *jb)
#define LOG_JSON_HTTP_BODY
#define METADATA_DEFAULTS
int EngineModeIsIPS(void)
void JsonDNP3LogRequest(JsonBuilder *js, DNP3Transaction *dnp3tx)
void JsonAddrInfoInit(const Packet *p, enum OutputJsonLogDirection dir, JsonAddrInfo *addr)
void HttpXFFGetCfg(ConfNode *conf, HttpXFFCfg *result)
Function to return XFF configuration from a configuration node.
AppLayerGetFileState AppLayerParserGetTxFiles(const Flow *f, void *state, void *tx, const uint8_t direction)
int HttpXFFGetIPFromTx(const Flow *f, uint64_t tx_id, HttpXFFCfg *xff_cfg, char *dstbuf, int dstbuflen)
Function to return XFF IP if any in the selected transaction. The caller needs to lock the flow.
void DetectEngineSetParseMetadata(void)
bool EveSMBAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *jb)
void JsonTlsLogJSONExtended(JsonBuilder *tjs, SSLState *state)
AppProto alproto
application level protocol
#define LOG_JSON_RULE_METADATA
#define PACKET_ALERT_FLAG_STATE_MATCH
void JsonSIPAddMetadata(JsonBuilder *js, const Flow *f, uint64_t tx_id)
bool JsonMQTTAddMetadata(const Flow *f, uint64_t tx_id, JsonBuilder *js)
#define DEBUG_VALIDATE_BUG_ON(exp)
MemBuffer * MemBufferCreateNew(uint32_t size)
void JsonAlertLogRegister(void)
void EveAddFlow(Flow *f, JsonBuilder *js)
const char * ConfNodeLookupChildValue(const ConfNode *node, const char *name)
Lookup the value of a child configuration node by name.