2. Elastic stack: анализ на security логовете. Logstash

2. Elastic stack: анализ на security логовете. Logstash

В миналото статии запознахме се с ELK стека, от какви софтуерни продукти се състои. Първата задача, с която се сблъсква инженерът при работа с ELK стека, е изпращането на логовете за съхранение в Elasticsearch за последващ анализ. Въпреки че на пръв поглед изглежда просто, Elasticsearch съхранява логовете под формата на документи с определени полета и стойности, което означава, че инженерът трябва да използва различни инструменти, за да парсне съобщението, което се изпраща от крайни системи. Това може да се направи по няколко начина — да напише програма, която чрез API добавя документи в базата, или да използва вече готови решения. В рамките на този курс ще разгледаме решение Logstash, което е част от ELK стека. Ще видим как можем да изпратим логовете от крайни системи в Logstash и след това ще настроим конфигурационния файл за парсване и пренасочване в базата данни Elasticsearch. За целта ще вземем логовете от защитната стена Check Point като входна система.

В рамките на курса не разглеждаме инсталирането на ELK стека, тъй като съществува огромно количество статии по тази тема; ще разгледаме конфигурационната част.

Създаваме план за действие по конфигурация на Logstash:

  1. Проверка дали Elasticsearch ще приема логовете (проверка за работоспособност и отвореност на порта).
  2. Разглеждаме по какъв начин можем да изпратим събития в Logstash, избираме метод и го реализираме.
  3. Настройваме Input в конфигурационния файл на Logstash.
  4. Настройваме Output в конфигурационния файл на Logstash в режим на дебъг, за да разбера как изглежда лог съобщението.
  5. Настройваме Filter.
  6. Настройваме коректен Output в Elasticsearch.
  7. Стартираме Logstash.
  8. Проверяваме логовете в Kibana.

Ще разгледаме по-подробно всяка точка:

Проверка дали Elasticsearch ще приема логовете

За това можете да проверите с команда curl достъпа до Elasticsearch от системата, на която е разположен Logstash. Ако имате настроена аутентификация, също така чрез curl предаваме потребител/парола, указваме порт 9200, ако не сте го променяли. Ако получавате отговор, подобен на посочения по-долу, всичко е наред.

[elastic@elasticsearch ~]$ curl -u <> : <> -sS -XGET "<>:9200"
{
  "name" : "elastic-1",
  "cluster_name" : "project",
  "cluster_uuid" : "sQzjTTuCR8q4ZO6DrEis0A",
  "version" : {
    "number" : "7.4.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "fc0eeb6e2c25915d63d871d344e3d0b45ea0ea1e",
    "build_date" : "2019-10-22T17:16:35.176724Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
[elastic@elasticsearch ~]$

Ако отговорът не дойде, може да има няколко вида грешки: elasticsearch процесът не работи, неправилен порт е указан или портът е блокиран от фаервола на сървъра, на който е инсталиран elasticsearch.

Нека разгледаме как можем да изпратим логовете в Logstash с помощта на Check Point.

С Check Point management server можем да изпратим логовете в Logstash чрез syslog, използвайки утилитата log_exporter; можете да научите повече за нея на... статии, тук ще оставим само командата, която създава потока:

cp_log_export add name check_point_syslog target-server <> target-port 5555 protocol tcp format generic read-mode semi-unified

<> — адрес на сървъра, на който работи Logstash, target-port 5555 — портът, на който ще изпращаме логовете; изпращането на логове по tcp може да натовари сървъра, затова в някои случаи е по-разумно да използвате udp.

Настройваме INPUT в конфигурационния файл на Logstash.

2. Elastic stack: анализ на security логовете. Logstash

По подразбиране конфигурационният файл се намира в директорията /etc/logstash/conf.d/. Конфигурационният файл се състои от 3 смислени части: INPUT, FILTER, OUTPUT. В INPUT указваме откъде системата ще взема логовете, в FILTER парсим логовете — настройваме как да разделим съобщението на полета и стойности; в OUTPUT настройваме изходящия поток — къде ще бъдат изпратени парсираните логове.

Първо ще настроим INPUT и ще разгледаме някои типове, които могат да бъдат — file, tcp и exe.

Tcp:

input {
tcp {
    port => 5555
    host => "10.10.1.205"
    type => "checkpoint"
    mode => "server"
}
}

mode => "server"
Показва, че Logstash приема свързвания.

port => 5555
host => "10.10.1.205"
Приемаме свързвания по IP адрес 10.10.1.205 (Logstash), порт 5555 — портът трябва да бъде разрешен от политиката на фаервола.

type => "checkpoint"
Маркираме документа, което е много удобно в случай, че имате няколко входящи свързвания. Впоследствие може да напишете собствен филтър за всяко свързване, използвайки логическата конструкция if.

File:

input {
  file {
    path => "/var/log/openvas_report/*"
    type => "openvas"
    start_position => "beginning"
    }
}

Описание на настройките:
path => "/var/log/openvas_report/*"
Посочете директорията, в която файловете трябва да бъдат прочетени.

type => "openvas"
Тип на събитието.

start_position => "beginning"
При промяна на файла, той се чете изцяло; ако зададете "end", системата ще изчака появата на нови записи в края на файла.

Exec:

input {
  exec {
    command => "ls -alh"
    interval => 30
  }
}

По този вход се стартира (само!) shell команда и нейният изход се обвива в лог съобщение.

command => "ls -alh"
Команда, чието извеждане ни интересува.

interval => 30
Интервалът за извикване на командата в секунди.

За да получавате логове от защитната стена, задайте филтър tcp или udp, в зависимост от начина на изпращане на логовете в Logstash.

Настройваме изхода в конфигурационния файл на Logstash в режим на отстраняване на грешки, за да разберем как изглежда лог съобщението.

След като конфигурираме входа, трябва да разберем как ще изглежда лог съобщението и какви методи е необходимо да използваме за настройване на филтъра (парсера) за логовете.

За целта ще използваме филтър, който извежда резултата в stdout, за да прегледаме оригиналното съобщение; актуалният конфигурационен файл ще изглежда така:

input 
{
         tcp 
         {
                port => 5555
  	  	type => "checkpoint"
    		mode => "server"
                host => “10.10.1.205"
   	 }
}

output 
{
	if [type] == "checkpoint" 
       {
		stdout { codec=> json }
	}
}

Изпълняваме командата за проверка:
sudo /usr/share/logstash/bin//logstash -f /etc/logstash/conf.d/checkpoint.conf
Виждаме резултата, изображението е кликабелно:

2. Elastic stack: анализ на security логовете. Logstash

Ако го копираме, ще изглежда така:

action="Accept" conn_direction="Internal" contextnum="1" ifdir="outbound" ifname="bond1.101" logid="0" loguid="{0x5dfb8c13,0x5,0xfe0a0a0a,0xc0000000}" origin="10.10.10.254" originsicname="CN=ts-spb-cpgw-01,O=cp-spb-mgmt-01.tssolution.local.kncafb" sequencenum="8" time="1576766483" version="5" context_num="1" dst="10.10.10.10" dst_machine_name="ts-spb-dc-01@tssolution.local" layer_name="TSS-Standard Security" layer_name="TSS-Standard Application" layer_uuid="dae7f01c-4c98-4c3a-a643-bfbb8fcf40f0" layer_uuid="dbee3718-cf2f-4de0-8681-529cb75be9a6" match_id="8" match_id="33554431" parent_rule="0" parent_rule="0" rule_action="Accept" rule_action="Accept" rule_name="Implicit Cleanup" rule_uid="6dc2396f-9644-4546-8f32-95d98a3344e6" product="VPN-1 & FireWall-1" proto="17" s_port="37317" service="53" service_id="domain-udp" src="10.10.1.180" ","type":"qqqqq","host":"10.10.10.250","@version":"1","port":50620}{"@timestamp":"2019-12-19T14:50:12.153Z","message":"time="1576766483" action="Accept" conn_direction="Internal" contextnum="1" ifdir="outbound" ifname="bond1.101" logid="0" loguid="{0x5dfb8c13,

Гледайки на данните съобщения, разбираем, че логовете имат вид: поле = стойност или ключ = стойност, следователно подходящият филтър се нарича kv. За да изберем правилния филтър за всеки конкретен случай, би било полезно да се запознаем с тях в техническата документация или да попитаме приятел.

Настройваме Филтри.

На предишния етап избрахме kv, по-долу е представена конфигурацията на този филтър:

filter {
if [type] == "checkpoint"{
	kv {
		value_split => "="
		allow_duplicate_values => false
	}
}
}

Избираме символа, по който ще разделяме полето и стойността — “=”. Ако в логовете имаме идентични записи, запазваме в базата само един екземпляр, в противен случай ще получите масив от идентични стойности, тоест, ако имаме съобщение “foo = some foo=some”, записваме само foo = some.

Настройваме коректен Output в ElasticSearch.

След като филтърът е настроен, можем да изнесем логовете в базата. elasticsearch:

output 
{
if [type] == "checkpoint"
{
 	elasticsearch 
        {
		hosts => ["10.10.1.200:9200"]
		index => "checkpoint-%{+YYYY.MM.dd}"
    		user => "tssolution"
    		password => "cool"
  	}
}
}

Ако документът е подписан с типа checkpoint, запазваме събитието в базата elasticsearch, която по подразбиране приема връзки на 10.10.1.200 на порт 9200. Всеки документ се запазва в определен индекс, в този случай запазваме в индекс „checkpoint-” + текущата времева дата. Всеки индекс може да има определен набор от полета, или се създава автоматично при появата на ново поле в съобщението; настройките на полетата и техния тип могат да се видят в mappings.

Ако имате настроена аутентификация (ще разгледаме по-късно), задължително трябва да се посочат кредите за запис в конкретен индекс, в този пример това е „tssolution“ с паролата „cool“. Можете да ограничите правата на потребителите да записват логове само в определен индекс и никой друг.

Стартираме Logstash.

Конфигурационен файл на Logstash:

input 
{
         tcp 
         {
                port => 5555
  	  	type => "checkpoint"
    		mode => "server"
                host => “10.10.1.205”
   	 }
}

filter {
        if [type] == "checkpoint"{
	kv {
		value_split => "="
		allow_duplicate_values => false
	}
        }
}

output 
{
if [type] == "checkpoint"
{
 	elasticsearch 
        {
		hosts => ["10.10.1.200:9200"]
		index => "checkpoint-%{+YYYY.MM.dd}"
    		user => "tssolution"
    		password => "cool"
  	}
}
}

Проверяваме конфигурационния файл за правилност на съставянето:
/usr/share/logstash/bin//logstash -f checkpoint.conf
2. Elastic stack: анализ на security логовете. Logstash

Стартираме процеса Logstash:
sudo systemctl start logstash

Проверяваме дали процесът е стартиран:
sudo systemctl status logstash

2. Elastic stack: анализ на security логовете. Logstash

Проверяваме дали сокетът е активен:
netstat -nat |grep 5555

2. Elastic stack: анализ на security логовете. Logstash

Проверяваме логовете в Kibana.

След като всичко е стартирано, влизаме в Kibana — Discover и се уверяваме, че всичко е настроено правилно, изображението е кликаемо!

2. Elastic stack: анализ на security логовете. Logstash

Всички логове са налице и можем да видим всички полета и техните стойности!

Заключение

Разгледахме как да напишем конфигурационен файл за Logstash и в резултат получихме парсер за всички полета и стойности. Сега можем да работим с търсене и съставяне на графики по определени полета. В следващите материали ще разгледаме визуализацията в Kibana и ще създадем прост дашборд. Трябва да спомена, че конфигурационният файл на Logstash трябва постоянно да се дописва в определени ситуации, например, когато искаме да заменим стойността на поле от число на дума. В последващи статии ще го правим постоянно.

Така че следете обновленията (Телеграм, Facebook, VK, TS Solution Blog), Яндекс.Дзен.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster