2. Elastic stack: analys av sÀkerhetsloggar. Logstash

2. Elastic stack: analys av sÀkerhetsloggar. Logstash

Tidigare artikeln Vi har blivit bekanta med ELK-stacken, vilken programvara den bestĂ„r av. Den första uppgiften en ingenjör stĂ€lls inför nĂ€r man arbetar med ELK-stacken Ă€r att skicka loggar för lagring i Elasticsearch för efterföljande analys. Men det Ă€r bara teori; Elasticsearch lagrar loggar som dokument med specifika fĂ€lt och vĂ€rden, vilket innebĂ€r att ingenjören mĂ„ste anvĂ€nda olika verktyg för att bearbeta meddelandet som skickas frĂ„n de slutliga systemen. Detta kan göras pĂ„ flera sĂ€tt – antingen skriva ett program sjĂ€lv som via API lĂ€gger till dokument i databasen eller anvĂ€nda redan befintliga lösningar. Inom ramen för denna kurs kommer vi att titta pĂ„ en lösning Logstash, som Ă€r en del av ELK-stacken. Vi kommer att se hur vi kan skicka loggar frĂ„n de slutliga systemen till Logstash och sedan konfigurera konfigurationsfilen för att analysera och omdirigera till Elasticsearch-databasen. För detta tar vi loggar frĂ„n Check Point-brandvĂ€ggen som vĂ„r ingĂ„ngssystem.

I kursen kommer vi inte att titta pÄ installationen av ELK-stacken, eftersom det finns ett stort antal artiklar om detta Àmne; vi kommer att fokusera pÄ konfigurationsaspekten.

Vi ska upprÀtta en handlingsplan för Logstash-konfigurationen:

  1. Kontrollera att Elasticsearch kommer att ta emot loggar (testa funktionaliteten och öppenheten av porten).
  2. Vi undersöker hur vi kan skicka hÀndelser till Logstash, vÀljer en metod och implementerar den.
  3. Vi konfigurerar Input i Logstash-konfigurationsfilen.
  4. Vi konfigurerar Output i Logstash-konfigurationsfilen i debug-lÀge för att förstÄ hur loggmeddelandet ser ut.
  5. Vi konfigurerar Filter.
  6. Vi konfigurerar korrekt Output i Elasticsearch.
  7. Vi startar Logstash.
  8. Vi kontrollerar loggarna i Kibana.

Vi kommer att gÄ igenom varje punkt mer detaljerat:

Kontrollera att Elasticsearch kommer att ta emot loggar

För detta kan du kontrollera tillgÄngen till Elasticsearch frÄn systemet dÀr Logstash Àr installerat med kommandot curl. Om du har autentisering konfigurerad, överför Àven anvÀndarnamn/lösenord via curl och ange port 9200 om du inte har Àndrat den. Om svaret ser ut som nedan, sÄ Àr allt i sin ordning.

[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" : "Du vet, för sökning"
}
[elastic@elasticsearch ~]$

Om inget svar kom, kan det finnas flera typer av fel: elasticsearch-processen fungerar inte, fel port anges, eller porten blockeras av brandvÀggen pÄ servern dÀr elasticsearch Àr installerad.

Vi undersöker hur man kan skicka loggar till Logstash genom brandvÀggen Check Point.

Med Check Point management server kan loggar skickas till Logstash via syslog, med hjÀlp av verktyget log_exporter, mer information om detta kan hittas i den hÀr artikeln, hÀr lÀmnar vi bara kommandot som skapar en ström:

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

<> — adressen till servern dĂ€r Logstash körs, target-port 5555 — porten som vi kommer att skicka loggar till, att skicka loggar via tcp kan belasta servern, sĂ„ i vissa fall Ă€r det mer korrekt att anvĂ€nda udp.

Vi konfigurerar INPUT i Logstash-konfigurationsfilen.

2. Elastic stack: analys av sÀkerhetsloggar. Logstash

Som standard ligger konfigurationsfilen i katalogen /etc/logstash/conf.d/. Konfigurationsfilen bestĂ„r av 3 meningsfulla delar: INPUT, FILTER, OUTPUT. I INPUT angiver vi frĂ„n vilket kĂ€llsystem loggarna ska hĂ€mtas, i FILTER vi parser loggen — stĂ€ller in hur meddelandet ska delas upp i fĂ€lt och vĂ€rden, i OUTPUT konfigurerar vi utströmmen — vart de parsade loggarna ska skickas.

Först konfigurerar vi INPUT, vi tittar pĂ„ nĂ„gra typer som kan finnas — file, tcp och exe.

Tcp:

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

mode => "server"
Visar att Logstash accepterar anslutningar.

port => 5555
host => "10.10.1.205"
Accepterar anslutningar till IP-adressen 10.10.1.205 (Logstash), port 5555 — porten mĂ„ste vara tillĂ„ten av brandvĂ€ggens policy.

type => "checkpoint"
Markerar dokumentet, vilket Àr mycket praktiskt om du har flera inkommande anslutningar. DÀrefter kan en egen filterkonfiguration skrivas för varje anslutning med hjÀlp av en logisk if-konstruktion.

File:

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

Beskrivning av instÀllningarna:
path => "/var/log/openvas_report/*"
Ange katalogen vars filer behöver lÀsas.

type => "openvas"
HĂ€ndelsetyp.

start_position => "beginning"
Vid filÀndring lÀses hela filen, om "end" anges kommer systemet att vÀnta pÄ att nya poster dyker upp i slutet av filen.

Exec:

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

Med denna input körs (endast!) shell-kommandot och dess utdata omvandlas till loggmeddelande.

command => "ls -alh"
Kommandot vars utdata intresserar oss.

interval => 30
Intervallet för att anropa kommandot i sekunder.

För att ta emot loggar frÄn brandvÀggen anger vi en filter tcp eller udp, beroende pÄ hur loggarna skickas till Logstash.

Vi konfigurerar Output i Logstash-konfigurationsfilen i debuglÀge för att förstÄ hur loggmeddelandet ser ut.

NÀr vi har konfigurerat INPUT mÄste vi förstÄ hur loggmeddelandet kommer att se ut och vilka metoder som behöver anvÀndas för att konfigurera filtret (parsern) för loggar.

För detta kommer vi att anvÀnda ett filter som ger resultat i stdout för att se det ursprungliga meddelandet, hela konfigurationsfilen ser för tillfÀllet ut sÄ hÀr:

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

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

Vi kör kommandot för att kontrollera:
sudo /usr/share/logstash/bin//logstash -f /etc/logstash/conf.d/checkpoint.conf
Vi ser resultatet, bilden Àr klickbar:

2. Elastic stack: analys av sÀkerhetsloggar. Logstash

Om vi kopierar detta skulle det se ut sÄ hÀr:

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,

Genom att titta pÄ dessa meddelanden förstÄr vi att loggarna har formen: fÀlt = vÀrde eller key = value, vilket innebÀr att filtret som kallas kv passar. För att korrekt vÀlja ett filter för varje specifikt fall skulle det vara bra att bekanta sig med dem i den tekniska dokumentationen, eller att frÄga en vÀn.

InstÀllning av Filter

I föregÄende steg valde vi kv, hÀr presenteras konfigurationen för detta filter:

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

Vi vĂ€ljer symbolen som vi ska dela fĂ€ltet och vĂ€rdet med — “=”. Om vi har identiska poster i loggen, sparar vi endast ett exemplar i databasen, annars fĂ„r du en matris av identiska vĂ€rden, det vill sĂ€ga om vi har meddelandet “foo = some foo=some” sparar vi endast foo = some.

StÀller in korrekt Output i ElasticSearch

NÀr filtret Àr instÀllt kan loggarna exporteras till databasen , dÀr serveradressen och mönstret för indexnamnet anges för att skicka det formaterade dokumentet::

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

Om dokumentet Àr signerat med typen checkpoint, sparar vi hÀndelsen i elasticsearch-databasen, som tar emot anslutningar pÄ 10.10.1.200 pÄ port 9200 som standard. Varje dokument sparas i ett specifikt index, i detta fall sparar vi i indexet "checkpoint-" + nuvarande tidsdatum. Varje index kan ha en viss uppsÀttning fÀlt, eller skapas automatiskt nÀr ett nytt fÀlt dyker upp i meddelandet; instÀllningarna för fÀlten och deras typ kan ses i mappings.

Om du har aktiverat autentisering (vi kommer att diskutera detta senare), mÄste du se till att ange kredentialer för att skriva in ett specifikt index, i detta exempel Àr det "tssolution" med lösenordet "cool". Du kan avgrÀnsa anvÀndarrÀttigheter för att skriva loggar endast till ett visst index och inte till nÄgot annat.

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

Kontrollerar konfigurationsfilen för korrekt sammansÀttning:
/usr/share/logstash/bin//logstash -f checkpoint.conf
2. Elastic stack: analys av sÀkerhetsloggar. Logstash

Startar Logstash-processen:
sudo systemctl start logstash

Kontrollerar att processen har startat:
sudo systemctl status logstash

2. Elastic stack: analys av sÀkerhetsloggar. Logstash

Kontrollerar att socketen Àr uppe:
netstat -nat |grep 5555

2. Elastic stack: analys av sÀkerhetsloggar. Logstash

Vi kontrollerar loggarna i Kibana.

NĂ€r allt har startat gĂ„r vi in i Kibana – Discover, och kontrollerar att allt Ă€r korrekt instĂ€llt, bilden Ă€r klickbar!

2. Elastic stack: analys av sÀkerhetsloggar. Logstash

Alla loggar Àr pÄ plats och vi kan se alla fÀlt och deras vÀrden!

Slutsats

Vi har gÄtt igenom hur man skriver en Logstash-konfigurationsfil, vilket resulterade i en parser för alla fÀlt och vÀrden. Nu kan vi arbeta med sökningar och skapa diagram baserat pÄ specifika fÀlt. I den hÀr kursen kommer vi att titta pÄ visualisering i Kibana och skapa en enkel instrumentpanel. Det Àr vÀrt att nÀmna att Logstash-konfigurationsfilen behöver stÀndigt uppdateras i vissa situationer, till exempel nÀr vi vill byta ett fÀlts vÀrde frÄn siffra till ord. I kommande artiklar kommer vi stÀndigt att göra detta.

SÄ hÄll utkik efter uppdateringar (Telegram, Facebook, VK, TS Solution Blog), Yandex.Dzen.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster