ELK-Stack: анализировать только IP / MAC из системного журнала с помощью Logstash - PullRequest
0 голосов
/ 10 апреля 2019

Я ищу способ анализа IP-адресов и MAC-адресов из записи системного журнала с помощью Logstash.В настоящее время я пытаюсь получить его с помощью GROK, но проблема в том, что мне может потребоваться сопоставить всю строку, а не только часть самого сообщения.

Например, мне нужно следующую строку:

9 апреля 12:41:01 cn1Label = идентификатор хоста dvchost = exch01 TrendMicroDsTenant = первичный TrendMicroDsTenantId = 0 dstMAC = 55: C0: A8: 55: FF: 41 srcMAC = CA: 36: 42: B1: 78: 3D TrendMicroDsFrameType = IP src = 10.0.251.84 dst = 56.19.41.128 out = 166 cs3 = cs3Label = Биты фрагментации прото = ICMP srcPort = 0 dstPort = 0cnt = 1 act = IDS: сброс cn3 = 0 cn3Label = позиция пакета DPI cs5 = 0 cs5Label = позиция потока DPI cs6 = 0 cs6Label = флаги DPI

Я хочу получить "src" и "dst"IPs и" srcMAC "и" dstMAC ", а также.Я хотел бы попробовать это в Logstash:

grok{
  match => { "message" => "src=%{IPV4:src_ip}" }
  match => { "message" => "dst=%{IPV4:dst_ip}" }
  match => { "message" => "srcMAC=%{MAC:src_mac}" }
  match => { "message" => "dstMAC=%{MAC:dst_mac}" }
}

Но это не работает, потому что он не соответствует всей строке.Я пытался использовать .* и другие методы сопоставления, но безуспешно.

Есть ли способ просто проанализировать IP-адреса, как показано, без разбора полной строки?

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 апреля 2019

Вы можете использовать kv filter для работы с парами ключ-значение, такими как те, что есть в вашем журнале.Чтобы сохранить только соответствующие пары, используйте опцию include_keys.

В вашем случае это будет выглядеть так:

kv{
    include_keys => [ "src", "dst", "srcMAC", "dstMAC" ]
}

Что приведет к:

{
  "dst": "56.19.41.128",
  "host": "frsred-0077",
  "srcMAC": "CA:36:42:B1:78:3D",
  "dstMAC": "55:C0:A8:55:FF:41"
}

Одним из преимуществ kv-фильтра является то, что вы не зависите от порядка пар, которые остаются неизменными, в отличие от фильтра Грока.

0 голосов
/ 11 апреля 2019

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

grok{match => {"message" => "SRC=%{IPV4:ip}"}}
0 голосов
/ 11 апреля 2019

Фильтр grok должен соответствовать целому сообщению, чтобы получить только пару полей, которые вам все равно должны соответствовать всем, следующий шаблон будет соответствовать вашему примеру.

%{GREEDYDATA}%{SPACE}dstMAC=%{MAC:dst_mac}%{SPACE}srcMAC=%{MAC:src_mac}%{SPACE}%{GREEDYDATA}%{SPACE}src=%{IP:src_ip}%{SPACE}dst=%{IP:dst_ip}%{SPACE}%{GREEDYDATA}

Результат будет:

{
  "src_ip": "10.0.251.84",
  "src_mac": "CA:36:42:B1:78:3D",
  "dst_mac": "55:C0:A8:55:FF:41",
  "dst_ip": "56.19.41.128"
}

Этот шаблон также будет соответствовать любому сообщению в следующем формате:

ANYTHING dstMAC=MACADDRESS srcMAC=MACADDRESS ANYTHING src=IPADDRESS dst=IPADRESS ANYTHING
...