44 #define MODULE_NAME "LogTlsStoreLog"
46 static char tls_logfile_base_dir[PATH_MAX] =
"/tmp";
48 static char logging_dir_not_writable;
50 #define LOGGING_WRITE_ISSUE_LIMIT 6
57 static int CreateFileName(
58 const Packet *p,
SSLState *state,
char *filename,
size_t filename_size,
const bool client)
62 const char *direction = client ?
"client-" :
"";
67 if (snprintf(file,
sizeof(file),
"%s%ld.%ld-%d.pem", direction, (
long int)
SCTIME_SECS(p->
ts),
71 if (
PathMerge(filename, filename_size, tls_logfile_base_dir, file) < 0)
76 static int TLSGetIPInformations(
const Packet *p,
char *srcip, socklen_t srcip_len,
Port *sp,
77 char *dstip, socklen_t dstip_len,
Port *dp,
int ipproto)
113 static inline char *CreateStringFromByteArray(uint8_t *arr, uint32_t
len)
115 uint32_t str_len =
len + 1;
116 char *
final =
SCCalloc(str_len,
sizeof(
char));
120 memcpy(
final, arr,
len);
121 final[str_len - 1] =
'\0';
129 #define PEMHEADER "-----BEGIN CERTIFICATE-----\n"
130 #define PEMFOOTER "-----END CERTIFICATE-----\n"
132 char filename[PATH_MAX] =
"";
135 unsigned long pemlen;
136 unsigned char* pembase64ptr = NULL;
146 CreateFileName(p, state, filename,
sizeof(filename), client);
147 if (strlen(filename) == 0) {
152 fp = fopen(filename,
"w");
156 "Can't create PEM file '%s' in '%s' directory", filename, tls_logfile_base_dir);
157 logging_dir_not_writable++;
163 pemlen = SCBase64EncodeBufferSize(cert->
cert_len);
170 SCLogWarning(
"Can't allocate data for base64 encoding");
179 ret = SCBase64Encode(
181 if (ret != SC_BASE64_OK) {
182 SCLogWarning(
"Invalid return of SCBase64Encode function");
191 size_t loffset = pemlen >= 64 ? 64 : pemlen;
192 if (fwrite(pembase64ptr, 1, loffset, fp) != loffset)
194 if (fwrite(
"\n", 1, 1, fp) != 1)
208 memcpy(filename + (strlen(filename) - 3),
"meta", 4);
209 fpmeta = fopen(filename,
"w");
210 if (fpmeta != NULL) {
211 #define PRINT_BUF_LEN 46
217 goto end_fwrite_fpmeta;
218 if (fprintf(fpmeta,
"TIME: %s\n", timebuf) < 0)
219 goto end_fwrite_fpmeta;
221 if (fprintf(fpmeta,
"PCAP PKT NUM: %"PRIu64
"\n", p->
pcap_cnt) < 0)
222 goto end_fwrite_fpmeta;
224 if (fprintf(fpmeta,
"SRC IP: %s\n", srcip) < 0)
225 goto end_fwrite_fpmeta;
226 if (fprintf(fpmeta,
"DST IP: %s\n", dstip) < 0)
227 goto end_fwrite_fpmeta;
228 if (fprintf(fpmeta,
"PROTO: %" PRIu32
"\n", p->
proto) < 0)
229 goto end_fwrite_fpmeta;
230 if (PacketIsTCP(p) || PacketIsUDP(p)) {
231 if (fprintf(fpmeta,
"SRC PORT: %" PRIu16
"\n", sp) < 0)
232 goto end_fwrite_fpmeta;
233 if (fprintf(fpmeta,
"DST PORT: %" PRIu16
"\n", dp) < 0)
234 goto end_fwrite_fpmeta;
240 int r = fprintf(fpmeta,
243 "TLS FINGERPRINT: %s\n",
244 subject ? subject :
"<ERROR>", issuerdn ? issuerdn :
"<ERROR>",
249 goto end_fwrite_fpmeta;
254 SCLogWarning(
"Can't create meta file '%s' in '%s' directory", filename,
255 tls_logfile_base_dir);
256 logging_dir_not_writable++;
269 logging_dir_not_writable++;
276 logging_dir_not_writable++;
289 static bool LogTlsStoreCondition(
292 if (p->
flow == NULL) {
296 if (!(PacketIsTCP(p))) {
301 if (ssl_state == NULL) {
302 SCLogDebug(
"no tls state, so no request logging");
320 static bool LogTlsStoreConditionClient(
323 if (p->
flow == NULL) {
327 if (!(PacketIsTCP(p))) {
332 if (ssl_state == NULL) {
333 SCLogDebug(
"no tls state, so no request logging");
352 void *state,
void *tx, uint64_t tx_id)
355 int ipproto = (PacketIsIPv4(p)) ? AF_INET : AF_INET6;
364 LogTlsLogPem(aft, p, ssl_state, connp, ipproto);
371 void *state,
void *tx, uint64_t tx_id)
374 int ipproto = (PacketIsIPv4(p)) ? AF_INET : AF_INET6;
383 LogTlsLogPem(aft, p, ssl_state, connp, ipproto);
389 static TmEcode LogTlsStoreLogThreadInit(
ThreadVars *t,
const void *initdata,
void **data)
395 if (initdata == NULL) {
396 SCLogDebug(
"Error getting context for LogTLSStore. \"initdata\" argument NULL");
401 struct stat stat_buf;
403 if (stat(tls_logfile_base_dir, &stat_buf) != 0) {
406 ret =
SCMkDir(tls_logfile_base_dir, S_IRWXU|S_IXGRP|S_IRGRP);
410 SCLogError(
"Cannot create certs drop directory %s: %s", tls_logfile_base_dir,
415 SCLogInfo(
"Created certs drop directory %s",
416 tls_logfile_base_dir);
449 static void LogTlsStoreLogDeInitCtx(
OutputCtx *output_ctx)
465 output_ctx->
data = NULL;
466 output_ctx->
DeInit = LogTlsStoreLogDeInitCtx;
470 if (s_base_dir == NULL || strlen(s_base_dir) == 0) {
472 s_default_log_dir,
sizeof(tls_logfile_base_dir));
476 s_base_dir,
sizeof(tls_logfile_base_dir));
478 if (
PathMerge(tls_logfile_base_dir,
sizeof(tls_logfile_base_dir), s_default_log_dir,
480 LogTlsStoreLogDeInitCtx(output_ctx);
486 SCLogInfo(
"storing certs in %s", tls_logfile_base_dir);
491 result.
ctx = output_ctx;
499 LogTlsStoreLogInitCtx,
ALPROTO_TLS, LogTlsStoreLogger, LogTlsStoreCondition,
500 LogTlsStoreLogThreadInit, LogTlsStoreLogThreadDeinit);
503 LogTlsStoreLogInitCtx,
ALPROTO_TLS, LogTlsStoreLoggerClient, LogTlsStoreConditionClient,
504 LogTlsStoreLogThreadInit, LogTlsStoreLogThreadDeinit);