2. Elastični stek: analiza sigurnosnih dnevnika. Logstash

2. Elastični stek: analiza sigurnosnih dnevnika. Logstash

U poslednjem članak sreli smo se ELK stack, od kojih se softverskih proizvoda sastoji. I prvi zadatak sa kojim se inženjer suočava kada radi sa ELK stekom je slanje dnevnika za skladištenje u elasticsearch radi naknadne analize. Međutim, ovo je samo izjava, elasticsearch pohranjuje logove u obliku dokumenata sa određenim poljima i vrijednostima, što znači da inženjer mora koristiti različite alate da raščlani poruku koja se šalje sa krajnjeg sistema. To se može učiniti na nekoliko načina - sami napišite program koji će dodavati dokumente u bazu pomoću API-ja ili koristiti gotova rješenja. U ovom kursu ćemo razmotriti rješenje Logstash, koji je dio ELK steka. Pogledat ćemo kako možemo slati evidencije sa sistema krajnjih tačaka u Logstash, a zatim ćemo postaviti konfiguracijsku datoteku za raščlanjivanje i preusmjeravanje na bazu podataka Elasticsearch. Da bismo to uradili, uzimamo evidencije sa Check Point firewall-a kao dolazni sistem.

Kurs ne pokriva instalaciju ELK steka, jer postoji ogroman broj članaka na ovu temu; razmotrićemo komponentu konfiguracije.

Napravimo akcioni plan za Logstash konfiguraciju:

  1. Provjera da li će elasticsearch prihvatiti zapise (provjera funkcionalnosti i otvorenosti porta).
  2. Razmatramo kako možemo poslati događaje u Logstash, odabrati metodu i implementirati je.
  3. Konfigurišemo unos u logstash konfiguracionoj datoteci.
  4. Konfigurišemo izlaz u Logstash konfiguracionoj datoteci u režimu za otklanjanje grešaka da bismo razumeli kako izgleda poruka dnevnika.
  5. Postavljanje filtera.
  6. Postavljanje ispravnog izlaza u ElasticSearch-u.
  7. Pokreće se Logstash.
  8. Provjeravam dnevnike u Kibani.

Pogledajmo svaku tačku detaljnije:

Provjera da će elastična pretraga prihvatiti zapise

Da biste to učinili, možete koristiti naredbu curl da provjerite pristup Elasticsearchu iz sistema na kojem je Logstash raspoređen. Ako ste konfigurisali autentifikaciju, tada prenosimo i korisnika/lozinku putem curl-a, navodeći port 9200 ako ga niste promijenili. Ako dobijete odgovor sličan onom ispod, onda je sve u redu.

[elastic@elasticsearch ~]$ curl -u <<user_name>> : <<password>> -sS -XGET "<<ip_address_elasticsearch>>: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 ~]$

Ako se odgovor ne primi, može postojati nekoliko vrsta grešaka: proces elasticsearch ne radi, naveden je pogrešan port ili je port blokiran od strane firewall-a na serveru na kojem je elasticsearch instaliran.

Pogledajmo kako možete slati zapise u Logstash sa zaštitnog zida kontrolne tačke

Sa Check Point servera za upravljanje možete slati dnevnike u Logstash putem syslog-a koristeći uslužni program log_exporter, više o tome možete pročitati ovdje članak, ovdje ćemo ostaviti samo naredbu koja kreira stream:

cp_log_export add name check_point_syslog ciljni server < > ciljni port 5555 protokol tcp format generički način čitanja poluujednačen

< > - adresa servera na kojem radi Logstash, target-port 5555 - port na koji ćemo slati logove, slanje logova preko tcp-a može učitati server, pa je u nekim slučajevima ispravnije koristiti udp.

Podešavanje INPUT-a u logstash konfiguracijskoj datoteci

2. Elastični stek: analiza sigurnosnih dnevnika. Logstash

Podrazumevano, konfiguraciona datoteka se nalazi u /etc/logstash/conf.d/ direktorijumu. Konfiguracijski fajl se sastoji od 3 smislena dijela: INPUT, FILTER, OUTPUT. IN ULAZ naznačavamo odakle će sistem uzimati zapise, u FILTER raščlaniti dnevnik - podesite kako podijeliti poruku na polja i vrijednosti, u IZLAZ konfiguriramo izlazni tok - gdje će se poslati raščlanjeni zapisi.

Prvo, hajde da konfigurišemo INPUT, razmotrimo neke od tipova koji mogu biti - fajl, tcp i exe.

TCP:

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

mod => "server"
Označava da Logstash prihvata veze.

port => 5555
host => “10.10.1.205”
Prihvatamo veze preko IP adrese 10.10.1.205 (Logstash), port 5555 - port mora biti dozvoljen politikom zaštitnog zida.

tip => "kontrolna tačka"
Označavamo dokument, vrlo zgodno ako imate nekoliko dolaznih veza. Nakon toga, za svaku vezu možete napisati svoj vlastiti filter koristeći logičku if konstrukciju.

Datoteka:

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

Opis postavki:
put => "/var/log/openvas_report/*"
Označavamo direktorij u kojem se datoteke trebaju čitati.

tip => "openvas"
Vrsta događaja.

start_position => "početak"
Kada mijenjate datoteku, čita cijeli fajl; ako postavite “end”, sistem čeka da se novi zapisi pojave na kraju datoteke.

Exec:

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

Koristeći ovaj ulaz, pokreće se (samo!) naredba ljuske i njen izlaz se pretvara u poruku dnevnika.

komanda => "ls -alh"
Komanda čiji nas izlaz zanima.

interval => 30
Interval pozivanja naredbe u sekundama.

Da bismo primali zapise sa firewall-a, registrujemo filter tcp ili udp, ovisno o tome kako se dnevnici šalju u Logstash.

Konfigurišemo izlaz u Logstash konfiguracionoj datoteci u režimu za otklanjanje grešaka da bismo razumeli kako izgleda poruka dnevnika

Nakon što smo konfigurisali INPUT, moramo razumjeti kako će izgledati poruka dnevnika i koje metode treba koristiti za konfiguraciju filtera dnevnika (parser).

Da bismo to učinili, koristit ćemo filter koji ispisuje rezultat u stdout kako bismo vidjeli originalnu poruku; kompletna konfiguracijska datoteka u ovom trenutku će izgledati ovako:

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

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

Pokrenite naredbu da provjerite:
sudo /usr/share/logstash/bin//logstash -f /etc/logstash/conf.d/checkpoint.conf
Vidimo rezultat, sliku je moguće kliknuti:

2. Elastični stek: analiza sigurnosnih dnevnika. Logstash

Ako ga kopirate izgledat će ovako:

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="[email protected]" 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,

Gledajući ove poruke, shvatamo da dnevnici izgledaju ovako: polje = vrijednost ili ključ = vrijednost, što znači da je filter nazvan kv prikladan. Kako biste odabrali pravi filter za svaki konkretan slučaj, bilo bi dobro da se s njima upoznate u tehničkoj dokumentaciji ili pitate prijatelja.

Postavljanje filtera

U posljednjoj fazi smo odabrali kv, konfiguracija ovog filtera je prikazana u nastavku:

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

Odabiremo simbol kojim ćemo podijeliti polje i vrijednost - “=”. Ako imamo identične unose u logu, spremamo samo jednu instancu u bazu podataka, inače ćete na kraju dobiti niz identičnih vrijednosti, odnosno ako imamo poruku “foo = some foo=some” pišemo samo foo = neki.

Postavljanje ispravnog izlaza u ElasticSearch-u

Nakon što je Filter konfiguriran, možete učitati zapise u bazu podataka elastična pretraga:

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

Ako je dokument potpisan tipom kontrolne tačke, događaj spremamo u bazu podataka elasticsearch, koja podrazumevano prihvata veze 10.10.1.200 na portu 9200. Svaki dokument se čuva u određenom indeksu, u ovom slučaju čuvamo u indeksu “checkpoint-” + trenutni datum u vremenu. Svaki indeks može imati određeni skup polja ili se kreira automatski kada se u poruci pojavi novo polje; postavke polja i njihov tip mogu se vidjeti u mapiranju.

Ako ste konfigurisali autentifikaciju (pogledaćemo je kasnije), akreditivi za pisanje u određeni indeks moraju biti specificirani, u ovom primeru je to “tssolution” sa lozinkom “cool”. Možete razlikovati korisnička prava za pisanje dnevnika samo na određeni indeks i ništa više.

Pokrenite Logstash.

Logstash konfiguracijski fajl:

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"
  	}
}
}

Provjeravamo ispravnost konfiguracijske datoteke:
/usr/share/logstash/bin//logstash -f checkpoint.conf
2. Elastični stek: analiza sigurnosnih dnevnika. Logstash

Pokrenite Logstash proces:
sudo systemctl start logstash

Provjeravamo da li je proces započeo:
sudo systemctl status logstash

2. Elastični stek: analiza sigurnosnih dnevnika. Logstash

Provjerimo da li je utičnica podignuta:
netstat -nat |grep 5555

2. Elastični stek: analiza sigurnosnih dnevnika. Logstash

Provjeravam dnevnike u Kibani.

Nakon što se sve pokrene, idite na Kibana - Discover, uvjerite se da je sve ispravno konfigurirano, sliku se može kliknuti!

2. Elastični stek: analiza sigurnosnih dnevnika. Logstash

Svi dnevnici su na svom mjestu i možemo vidjeti sva polja i njihove vrijednosti!

zaključak

Pogledali smo kako napisati logstash konfiguracijsku datoteku i kao rezultat dobili smo parser svih polja i vrijednosti. Sada možemo raditi s pretraživanjem i crtanjem određenih polja. Sljedeće u tečaju ćemo pogledati vizualizaciju u Kibani i kreirati jednostavnu kontrolnu ploču. Vrijedi napomenuti da je konfiguracijski fajl Logstash potrebno stalno ažurirati u određenim situacijama, na primjer, kada želimo zamijeniti vrijednost polja iz broja u riječ. U narednim člancima to ćemo stalno raditi.

Zato ostanite sa nama (telegram, Facebook, VK, TS Solution Blog), Yandex Zen.

izvor: www.habr.com

Dodajte komentar