2. Elastic Stack: analyse af sikkerhedslogs. Logstash

2. Elastic Stack: analyse af sikkerhedslogs. Logstash

I den forrige artikel introducerede vi ELK-stacken, hvilke softwareprodukter den bestÄr af. Den fÞrste opgave, som en ingeniÞr stÄr overfor, nÄr man arbejder med ELK-stacken, er at sende logs til opbevaring i Elasticsearch til efterfÞlgende analyse. Men det er nemt kun at sige, Elasticsearch opbevarer logs som dokumenter med bestemte felter og vÊrdier, hvilket betyder, at ingeniÞren skal bruge forskellige vÊrktÞjer til at parse meddelelsen, der sendes fra de endelige systemer. Dette kan gÞres pÄ flere mÄder - enten ved selv at skrive et program, der via API'et tilfÞjer dokumenter til databasen, eller ved at bruge allerede eksisterende lÞsninger. I lÞbet af dette kursus vil vi se pÄ lÞsningen Logstash, som er en del af ELK-stacken. Vi vil se, hvordan man kan sende logs fra de endelige systemer til Logstash, og derefter vil vi konfigurere konfigurationsfilen til parsing og omdirigering til Elasticsearch-databasen. Til dette formÄl tager vi logs fra Check Point firewall som indgangssystem.

Kurset omhandler ikke installationen af ELK-stacken, da der findes et vÊld af artikler om emnet. Vi vil fokusere pÄ konfigurationselementet.

Vi laver en handlingsplan for konfiguration af Logstash:

  1. Kontroller, at Elasticsearch vil modtage logs (tjek funktionalitet og portens Äbenhed).
  2. Vi overvejer, hvordan vi kan sende begivenheder til Logstash, vĂŠlger metode og implementerer den.
  3. Vi konfigurerer input i Logstash-konfigurationsfilen.
  4. Vi konfigurerer output i Logstash-konfigurationsfilen i debug-tilstand for at forstÄ, hvordan logmeddelelsen ser ud.
  5. Vi konfigurerer filteret.
  6. Vi konfigurerer korrekt output til Elasticsearch.
  7. Vi starter Logstash.
  8. Vi tjekker logs i Kibana.

Vi ser nÊrmere pÄ hvert punkt:

Kontroller, at Elasticsearch vil modtage logs.

For dette kan du kontrollere adgang til Elasticsearch fra systemet, hvor Logstash er installeret, ved hjÊlp af curl-kommandoen. Hvis du har indstillet godkendelse, sender du ogsÄ brugernavn/adgangskode via curl og angiver port 9200, hvis du ikke har Êndret den. Hvis du fÄr et svar, der ligner det angivne nedenfor, sÄ er alt i orden.

[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 ~]$

Hvis svaret ikke kom, kan der vÊre flere typer fejl: elasticsearch-processen fungerer ikke, porten er forkert, eller porten er blokeret af firewall pÄ serveren, hvor elasticsearch er installeret.

Lad os se pÄ, hvordan man kan sende logfiler til Logstash via en firewall fra Check Point.

Fra Check Point management server kan logfiler sendes til Logstash via syslog ved at bruge vĂŠrktĂžjet log_exporter, som du kan lĂŠse mere om her. artikel, her efterlader vi kun kommandoen, der opretter strĂžmmen:

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

<> — adressen pĂ„ serveren, hvor Logstash kĂžrer, target-port 5555 — den port, hvor vi vil sende logfilerne, at sende logfiler via tcp kan belaste serveren, derfor er det i nogle tilfĂŠlde mere korrekt at anvende udp.

Vi konfigurerer INPUT i Logstash konfigurationsfilen.

2. Elastic Stack: analyse af sikkerhedslogs. Logstash

Som standard ligger konfigurationsfilen i mappen /etc/logstash/conf.d/. Konfigurationsfilen bestĂ„r af 3 meningsfulde dele: INPUT, FILTER, OUTPUT. INPUT her angiver vi, hvor systemet skal hente logfiler fra, i FILTER parser vi loggen — vi indstiller, hvordan meddelelsen opdeles i felter og vĂŠrdier, i OUTPUT konfigurerer vi den udgĂ„ende strĂžm — hvor de parsede logfiler skal sendes.

Lad os fĂžrst konfigurere INPUT; lad os se pĂ„ nogle typer, der kan vĂŠre — file, tcp og exe.

Tcp:

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

mode => "server"
angiver, at Logstash accepterer forbindelser.

port => 5555
host => "10.10.1.205"
Vi modtager forbindelser pĂ„ IP-adressen 10.10.1.205 (Logstash), port 5555 — porten skal vĂŠre tilladt af firewall-politikken.

type => "checkpoint"
Vi mÊrker dokumentet, hvilket er meget praktisk, hvis du har flere indgÄende forbindelser. Senere kan man skrive sin egen filterkonstruktion for hver forbindelse ved hjÊlp af en logisk if-konstruktion.

File:

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

Beskrivelse af indstillinger:
path => "/var/log/openvas_report/*"
Angiv den mappe, hvor filerne skal lĂŠses fra.

type => "openvas"
Begivenhedstype.

start_position => "beginning"
NÄr filen Êndres, lÊser den filen i sin helhed; hvis "end" er valgt, venter systemet pÄ, at der kommer nye indlÊg til slutningen af filen.

Exec:

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

Med denne input kĂžres (kun!) shell-kommandoen, og dens output indkapsles i et logbesked.

command => "ls -alh"
Den kommando, hvis output interessérer os.

interval => 30
Intervallet for at kalde kommandoen i sekunder.

For at modtage logs fra firewall'en definerer vi filteret tcp eller udp, afhĂŠngig af hvordan logs sendes til Logstash.

Indstil Output i Logstash-konfigurationsfilen i debug-tilstand for at forstÄ, hvordan logbeskeden ser ud.

NÄr vi har konfigureret INPUT, skal vi forstÄ, hvordan logbeskeden vil se ud, og hvilke metoder vi skal bruge til at indstille filtre (parserne) til logs.

Til dette vil vi bruge et filter, der giver et resultat i stdout, sÄ vi kan se den oprindelige besked; den komplette konfigurationsfil vil pÄ nuvÊrende tidspunkt se sÄdan ud:

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

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

KĂžr kommandoen for at kontrollere:
sudo /usr/share/logstash/bin//logstash -f /etc/logstash/conf.d/checkpoint.conf
Vi ser resultatet, billedet er klikbart:

2. Elastic Stack: analyse af sikkerhedslogs. Logstash

Hvis vi kopierer dette, vil det se sÄdan ud:

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,

NÄr vi ser pÄ disse meddelelser, forstÄr vi, at loggene har formen: felt = vÊrdi eller key = value, hvilket betyder, at filteret kaldet kv passer. For at vÊlge det rigtige filter til hver enkelt situation ville det vÊre en god idé at gÞre sig bekendt med dem i den tekniske dokumentation eller spÞrge en ven.

Konfigurerer Filter

I det forrige trin valgte vi kv, her er konfigurationen af dette filter:

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

Vi vĂŠlger det symbol, som vi vil dele felt og vĂŠrdi med — “=”. Hvis vi har ens poster i loggen, gemmer vi kun Ă©n instans i databasen, ellers ender vi med et array af ens vĂŠrdier; det vil sige, hvis vi har meddelelsen “foo = some foo=some”, gemmer vi kun foo = some.

Konfigurerer korrekt Output i ElasticSearch

NÄr Filteret er konfigureret, kan loggene eksporteres til databasen. elasticsearch:

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

Hvis dokumentet er underskrevet med typen checkpoint, gemmer vi begivenheden i elasticsearch-databasen, der modtager forbindelser pÄ 10.10.1.200 pÄ port 9200 som standard. Hvert dokument gemmes i et bestemt indeks, i dette tilfÊlde gemmer vi i indeks «checkpoint-» + den aktuelle tidsdato. Hvert indeks kan have et bestemt sÊt felter eller oprettes automatisk ved fremkomsten af et nyt felt i meddelelsen, felternes indstillinger og deres type kan ses i mappings.

Hvis du har konfigureret godkendelse (som vi ser senere), skal du nÞdvendigvis angive credentials til at skrive i et specifikt indeks, i dette eksempel er det «tssolution» med adgangskoden «cool». Det er muligt at adskille brugernes rettigheder for skrivning af logs kun i et bestemt indeks og ikke flere.

Vi starter Logstash.

Logstash konfigurationsfil:

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

Vi kontrollerer konfigurationsfilen for korrekt opbygning:
/usr/share/logstash/bin//logstash -f checkpoint.conf
2. Elastic Stack: analyse af sikkerhedslogs. Logstash

Vi starter Logstash-processen:
sudo systemctl start logstash

Vi kontrollerer, om processen er startet:
sudo systemctl status logstash

2. Elastic Stack: analyse af sikkerhedslogs. Logstash

Vi kontrollerer, om socketen er oppe:
netstat -nat |grep 5555

2. Elastic Stack: analyse af sikkerhedslogs. Logstash

Vi tjekker logs i Kibana.

NĂ„r alt er startet, gĂ„r vi ind i Kibana — Discover og sikrer os, at alt er indstillet korrekt, billedet er klikbart!

2. Elastic Stack: analyse af sikkerhedslogs. Logstash

Alle logs er pÄ plads, og vi kan se alle felter og deres vÊrdier!

Konklusion

Vi har gennemgÄet, hvordan man skriver en Logstash konfigurationsfil, og resultatet er en parser for alle felter og vÊrdier. Nu kan vi arbejde med sÞgning og oprettelse af grafer baseret pÄ specifikke felter. I de kommende kurser vil vi se pÄ visualisering i Kibana og oprette et simpelt dashboard. Det er vÊrd at nÊvne, at Logstash konfigurationsfilen skal opdateres under bestemte omstÊndigheder, for eksempel nÄr vi vil Êndre vÊrdien af et felt fra tal til ord. I de nÊste artikler vil vi konstant gÞre dette.

SĂ„ hold Ăžje med opdateringer (Telegram, Facebook, VK, TS Solution Blog), Yandex.Zen.

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster