Перезапись журналов получена с помощью системного журнала от другой машины

У меня есть Машина A, который является pfsense установкой, которая отправляет журналы с помощью системного журнала к полю Ubuntu. Поле Ubuntu должно будет переписать журналы, для замены, например, имен хостов и формата изменения немного.

Формат обычно следующие

Mar  7 00:05:32 hostname service: field1 field2 field3 field4 field5 field6 field7

Я хотел бы возможность перезаписи имени хоста, сервиса и заявки на изменение полей, и отфильтровал бы сообщения с определенным значением в определенном поле, поскольку они не интересны.

После фильтрации и обработки, сообщения должны быть записаны в диск в файле журнала и отправлены на другую машину с помощью системного журнала.

Теперь, регистрирующаяся часть тривиальна - просто настраивает rsyslogd, чтобы принять входящие сообщения и передать им. Однако я немного застреваю на части перезаписи. Я не женат на rsyslogd; любой демон системного-журнала-esque сделает.

6
задан 13 March 2019 в 12:29

2 ответа

Вопрос немного неопределенен, но я попытаюсь предложить возможное решение. Переписать сообщения rsyslog обеспечивает много модулей, один из которых mmfields. Это разделяет входящее сообщение в определенном символе (всего один символ) в поля и затем позволяет получать доступ к этим полям. Для сообщения как

a=1 b=two c=3 d=four

разделитель был бы пробелом и поля затем доступны как $!f2, $!f3, $!f4, и $!f5. К сожалению, самое первое поле ($!f1) всегда пусто, потому что сообщению предшествует пространство, и это было бы первым полем. Таким образом для вышеупомянутого сообщения мы добираемся $!f1=="", $!f2=="a=1", $!f3=="b=two", $!f4=="c=3", и $!f5=="d=four".

rsyslog поставки с другими модулями модификации сообщения также, но в отсутствии более подробной информации я выбрал этого. Храните следующий файл как /etc/rsyslog.d/10-so.conf. Измените имя согласно желаемому порядку выполнения, но сохраните .conf расширение.

# Load the "Message Modification" module "mmfields" to split
# incoming messages into fields at a certain separator:
module(load="mmfields")

# Format used for messages that are forwarded to another host.
# The fields are re-ordered and field #3 is omitted.
template(name="rewrite_forward" type="list") {
    constant(value="<")
    property(name="pri")
    constant(value=">")
    property(name="timestamp" dateFormat="rfc3339")
    constant(value=" ")
    property(name="hostname")
    constant(value=" ")
    property(name="syslogtag")
    constant(value=" ")
    property(name="$!f4")
    constant(value=" ")
    property(name="$!f2")
    constant(value=" ")
    property(name="$!f5")
}

# Format used for messages that are written to a local logfile.
# The format is almost the same as above, but lacks the priority,
# uses a different timestamp format, and ends with a "\n" as this
# is suitable for messages printed to a logfile.
template(name="rewrite_file" type="list") {
    property(name="timestamp")
    constant(value=" ")
    property(name="hostname")
    constant(value=" ")
    property(name="syslogtag")
    constant(value=" ")
    property(name="$!f4")
    constant(value=" ")
    property(name="$!f2")
    constant(value=" ")
    property(name="$!f5")
    constant(value="\n")
}

if ( $programname == "so" ) then {

    # split message into fields at (exactly) one space character.
    # The "fields" can then be referred to as "$!f1", "$!f2", ..., "$!fN".
    # Note that "$!f1" will always be an empty string because the message
    # usually starts with a blank and that is considered to be the first
    # field. 
    action( type="mmfields" 
            separator=" " 
    )

    # If the second field is the string "b=2", then go ahead and log and
    # forward the message. Change the condition to your liking.
    if ($!f3 == "b=2") then {

        # write rewritten logmessage to local file
        action( type     = "omfile"
                file     = "/var/log/so-rewrite-fields.log"
                template = "rewrite_file"
        )

        # just for reference: write the unmodified message to the
        # very same logfile. Drop this for actual processing. It 
        # serves just as a debugging aid.
        action( type = "omfile"
                file = "/var/log/so-rewrite-fields.log"
        )

        # forward rewritten message to another host
        action( type = "omfwd"  
                target   = "127.0.0.1"  # change to actual destination
                port     = "514"        # change to actual destination
                protocol = "udp"        # change to actual destination
                template = "rewrite_forward"
        )

    }

    # no further processing:
    stop
}

Перезапуск rsyslog (через sudo systemctl restart rsyslog.service) и испытайте его:

# A message that won't be logged because `$!f3 != "b=2"`:
logger -t so --id=$$ "a=1 b=3 txt=Hello number=$RANDOM"

# A message that will be logged because `$!f3 == "b=2"`:
logger -t so --id=$$ "a=1 b=2 txt=Hello number=$RANDOM"

Вывод второго logger оператор будет:

Mar 14 21:40:34 stratum9 so[3533]: txt=Hello a=1 number=6484        # rewritten msg
Mar 14 21:40:34 stratum9 so[3533]: a=1 b=2 txt=Hello number=6484    # original msg

Для изменения имени хоста просто замените

constant(value=" ")
property(name="hostname")
constant(value=" ")

в шаблонах с

constant(value=" fromElsewhere ")

Изменить syslogtag (что Вы назвали сервисом), замена

    constant(value=" ")
    property(name="syslogtag")
    constant(value=" ")

с

constant(value=" otherService: ")

Вывод затем будет:

Mar 14 22:05:51 fromElsewhere otherService: txt=Hello a=1 number=11763   # rewritten
Mar 14 22:05:51 stratum9 so[3533]: a=1 b=2 txt=Hello number=11763       # original

Посмотрите здесь для дальнейших свойств сообщения.

Обратите внимание что мой подход (с mmfields) полагается на поля, чтобы всегда иметь тот же порядок и легко не допускает перезапись сообщений как a=1 b=2 кому: b=1 a=2 (переупорядочьте и измените пар значения ключа). Для этого другой модуль мог бы быть более соответствующим.

6
ответ дан 23 November 2019 в 07:42

Насколько я знаю, что это могло быть достигнуто при помощи logstash elasticsearch и Kibana. Я пытаюсь сделать то же и был более или менее успешен путем установки стопки лося. Затем использование grok просачивается logstash, чтобы повредить сообщение системного журнала в различные поля и использовать их, чтобы соответствовать шаблону и отослать предупреждения. Смотрите на это руководство, это могло бы дать Вам некоторые ответы на том, где начать.

Этот вид установки уже создал в фильтрах для вещей как журналы mysql или апач или журналы nginx для начала. Вот хороший обзор функций стопки лося и архитектуры. Я надеюсь, что это помогает.

1
ответ дан 23 November 2019 в 07:42

Другие вопросы по тегам:

Похожие вопросы: