|
|
|
|
@ -254,6 +254,89 @@ bool AlertJsonDns(void *txptr, JsonBuilder *js)
|
|
|
|
|
txptr, LOG_FORMAT_DETAILED | LOG_QUERIES | LOG_ANSWERS | LOG_ALL_RRTYPES, js);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool AlertJsonDoh2(void *txptr, JsonBuilder *js)
|
|
|
|
|
{
|
|
|
|
|
JsonBuilderMark mark = { 0, 0, 0 };
|
|
|
|
|
|
|
|
|
|
jb_get_mark(js, &mark);
|
|
|
|
|
// first log HTTP2 part
|
|
|
|
|
bool r = rs_http2_log_json(txptr, js);
|
|
|
|
|
if (!r) {
|
|
|
|
|
jb_restore_mark(js, &mark);
|
|
|
|
|
}
|
|
|
|
|
// then log one DNS tx if any, preferring the answer
|
|
|
|
|
void *tx_dns = DetectGetInnerTx(txptr, ALPROTO_DOH2, ALPROTO_DNS, STREAM_TOCLIENT);
|
|
|
|
|
if (tx_dns == NULL) {
|
|
|
|
|
tx_dns = DetectGetInnerTx(txptr, ALPROTO_DOH2, ALPROTO_DNS, STREAM_TOSERVER);
|
|
|
|
|
}
|
|
|
|
|
bool r2 = false;
|
|
|
|
|
if (tx_dns) {
|
|
|
|
|
jb_get_mark(js, &mark);
|
|
|
|
|
r2 = AlertJsonDns(tx_dns, js);
|
|
|
|
|
if (!r2) {
|
|
|
|
|
jb_restore_mark(js, &mark);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return r || r2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int JsonDoh2Logger(ThreadVars *tv, void *thread_data, const Packet *p, Flow *f,
|
|
|
|
|
void *alstate, void *txptr, uint64_t tx_id)
|
|
|
|
|
{
|
|
|
|
|
LogDnsLogThread *td = (LogDnsLogThread *)thread_data;
|
|
|
|
|
LogDnsFileCtx *dnslog_ctx = td->dnslog_ctx;
|
|
|
|
|
|
|
|
|
|
JsonBuilder *jb = CreateEveHeader(p, LOG_DIR_FLOW, "dns", NULL, dnslog_ctx->eve_ctx);
|
|
|
|
|
|
|
|
|
|
if (unlikely(jb == NULL)) {
|
|
|
|
|
return TM_ECODE_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JsonBuilderMark mark = { 0, 0, 0 };
|
|
|
|
|
|
|
|
|
|
jb_get_mark(jb, &mark);
|
|
|
|
|
// first log HTTP2 part
|
|
|
|
|
bool r = rs_http2_log_json(txptr, jb);
|
|
|
|
|
if (!r) {
|
|
|
|
|
jb_restore_mark(jb, &mark);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void *tx_dns = DetectGetInnerTx(txptr, ALPROTO_DOH2, ALPROTO_DNS, STREAM_TOCLIENT);
|
|
|
|
|
if (tx_dns == NULL) {
|
|
|
|
|
tx_dns = DetectGetInnerTx(txptr, ALPROTO_DOH2, ALPROTO_DNS, STREAM_TOSERVER);
|
|
|
|
|
}
|
|
|
|
|
bool r2 = false;
|
|
|
|
|
if (tx_dns) {
|
|
|
|
|
// mix of JsonDnsLogger
|
|
|
|
|
if (SCDnsTxIsRequest(tx_dns)) {
|
|
|
|
|
if (unlikely(dnslog_ctx->flags & LOG_QUERIES) == 0) {
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
} else if (SCDnsTxIsResponse(tx_dns)) {
|
|
|
|
|
if (unlikely(dnslog_ctx->flags & LOG_ANSWERS) == 0) {
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!SCDnsLogEnabled(tx_dns, td->dnslog_ctx->flags)) {
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jb_get_mark(jb, &mark);
|
|
|
|
|
// log DOH2 with DNS config
|
|
|
|
|
r2 = SCDnsLogJson(tx_dns, td->dnslog_ctx->flags, jb);
|
|
|
|
|
if (!r2) {
|
|
|
|
|
jb_restore_mark(jb, &mark);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
out:
|
|
|
|
|
if (r || r2) {
|
|
|
|
|
OutputJsonBuilderBuffer(jb, td->ctx);
|
|
|
|
|
}
|
|
|
|
|
jb_free(jb);
|
|
|
|
|
return TM_ECODE_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int JsonDnsLoggerToServer(ThreadVars *tv, void *thread_data,
|
|
|
|
|
const Packet *p, Flow *f, void *alstate, void *txptr, uint64_t tx_id)
|
|
|
|
|
{
|
|
|
|
|
@ -591,3 +674,10 @@ void JsonDnsLogRegister (void)
|
|
|
|
|
JsonDnsLogInitCtxSub, ALPROTO_DNS, JsonDnsLogger, LogDnsLogThreadInit,
|
|
|
|
|
LogDnsLogThreadDeinit, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void JsonDoh2LogRegister(void)
|
|
|
|
|
{
|
|
|
|
|
OutputRegisterTxSubModule(LOGGER_JSON_TX, "eve-log", "JsonDoH2Log", "eve-log.doh2",
|
|
|
|
|
JsonDnsLogInitCtxSub, ALPROTO_DOH2, JsonDoh2Logger, LogDnsLogThreadInit,
|
|
|
|
|
LogDnsLogThreadDeinit, NULL);
|
|
|
|
|
}
|
|
|
|
|
|