rsyslog не избегает обратной косой черты в JSON - PullRequest
0 голосов
/ 28 января 2019

У меня запущен экземпляр rsyslogd, создающий следующий JSON из syslog:

{"timegenerated":"2019-01-28T09:24:37.033990+00:00","type":"syslog","host":"REDACTED_HOSTNAME","host-ip":"REDACTED_IP","message":"<190>Jan 28 2019 10:24:35: %ASA-X-XXXXXX: Teardown TCP connection 82257709 for outside:REDACTED_IP\/REDACTED_PORT(LOCAL\ususername) to inside:REDACTED_IP\/REDACTED_PORT duration 0:01:52 bytes XXXX TCP FINs from outside (ususername)"}

Это недопустимый JSON, поскольку \ususe интерпретируется как шестнадцатеричное представление символа юникода.Он должен был быть экранирован как \\ususe.

. Я заметил на GitHub, что существует открытая проблема (https://github.com/rsyslog/rsyslog/issues/1235),, хотя упоминается еще одна проблема, которая привела к объединенному исправлению.

Вот некоторая системная информация:

:~# rsyslogd -version
rsyslogd 8.24.0, compiled with:
PLATFORM:               x86_64-pc-linux-gnu
PLATFORM (lsb_release -d):
FEATURE_REGEXP:             Yes
GSSAPI Kerberos 5 support:      Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported:  Yes
64bit Atomic operations supported:  Yes
memory allocator:           system default
Runtime Instrumentation (slow code):    No
uuid support:               Yes
Number of Bits in RainerScript integers: 64

:~# lsb_release  -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.4 (stretch)
Release:    9.4
Codename:   stretch

Шаблон, используемый для создания документа JSON:

template(name="json_syslog"
  type="list") {
  constant(value="{")
    constant(value="\"timegenerated\":\"") property(name="timegenerated"    dateFormat="rfc3339")
    constant(value="\",\"type\":\"syslograw")
    constant(value="\",\"host\":\"") property(name="fromhost")
    constant(value="\",\"host-ip\":\"") property(name="fromhost-ip")
    constant(value="\",\"message\":\"") property(name="rawmsg" format="jsonr")
  constant(value="\"}\n")

Есть ли в rsyslog какие-либо функциональные возможности, которые позволили бы мне это исправить, или он это делает?похоже на вышестоящую ошибку?

1 Ответ

0 голосов
/ 28 января 2019

Я заметил, что вы используете format="jsonr" в шаблоне для сообщения.Существует разница, если вы используете json вместо jsonr, что очень кратко описано в документации, так как позволяет избежать двойного экранирования значения .Использование шаблона с

constant(value="\",\n\"json\":\"") property(name="rawmsg" format="json")
constant(value="\",\n\"jsonr\":\"") property(name="rawmsg" format="jsonr")

и предоставление ввода, содержащего

LOCAL\ususer "abc" 

, приводит к получению 2 строк

"json":"LOCAL\\ususer \"abc\",
"jsonr":"LOCAL\ususer \"abc\",

, в которых формат json вышел за пределы \u в \\u (протестировано с rsyslog-8.27.0).Если вам это не подходит, вы всегда можете манипулировать сообщением, например, следующим образом, добавив перед действием:

set $.msg2 = replace($rawmsg, "\\u", "\\\\u");

и в своем шаблоне используйте

constant(value="\",\"message\":\"") property(name="$.msg2" format="jsonr")

ЗаменитьФункция выполняет глобальную замену, поэтому вы можете захотеть ограничить ее, например,

set $.msg2 = replace($rawmsg, "LOCAL\\u", "LOCAL\\\\u");
...