2. Elastic Stack: Analyse der Sicherheitsprotokolle. Logstash

2. Elastic Stack: Analyse der Sicherheitsprotokolle. Logstash

Im letzten Artikel Wir haben uns mit dem ELK-Stack, dessen Softwareprodukte er umfasst, vertraut gemacht. Die erste Aufgabe, vor der ein Ingenieur beim Arbeiten mit dem ELK-Stack steht, besteht darin, Protokolle zur Speicherung in Elasticsearch zur späteren Analyse zu senden. Das klingt zwar einfach, aber Elasticsearch speichert Protokolle in Form von Dokumenten mit bestimmten Feldern und Werten. Daher muss der Ingenieur mit verschiedenen Werkzeugen die Nachrichten parsen, die von den Endsystemen gesendet werden. Dies kann auf verschiedene Weise erfolgen – entweder indem man ein eigenes Programm schreibt, das über die API Dokumente zur Datenbank hinzufügt, oder indem man bereits vorhandene Lösungen nutzt. In diesem Kurs werden wir die Lösung Logstashbetrachten, die Teil des ELK-Stacks ist. Wir werden untersuchen, wie Protokolle von Endsystemen an Logstash gesendet werden können, und anschließend die Konfigurationsdatei für das Parsing und die Weiterleitung an die Elasticsearch-Datenbank einrichten. Hierfür verwenden wir Protokolle von der Firewall Check Point als Eingabesystem.

Im Rahmen des Kurses wird die Installation des ELK-Stapels nicht behandelt, da es dafür bereits zahlreiche Artikel gibt. Wir konzentrieren uns auf die Konfigurationsaspekte.

Lassen Sie uns einen Aktionsplan für die Konfiguration von Logstash erstellen:

  1. Überprüfung, dass Elasticsearch Protokolle annehmen wird (Überprüfung der Funktionsfähigkeit und Erreichbarkeit des Ports).
  2. Wir betrachten, wie wir Ereignisse an Logstash senden können, wählen eine Methode aus und setzen sie um.
  3. Wir konfigurieren den Input in der Konfigurationsdatei von Logstash.
  4. Wir konfigurieren den Output in der Konfigurationsdatei von Logstash im Debug-Modus, um zu verstehen, wie die Protokollnachricht aussieht.
  5. Wir konfigurieren den Filter.
  6. Wir konfigurieren den korrekten Output in Elasticsearch.
  7. Wir starten Logstash.
  8. Wir überprüfen die Protokolle in Kibana.

Wir betrachten jeden Punkt im Detail:

Überprüfung, dass Elasticsearch Protokolle annehmen wird.

Dazu kann der Befehl curl verwendet werden, um den Zugriff auf Elasticsearch aus dem System zu überprüfen, auf dem Logstash ausgeführt wird. Wenn Sie eine Authentifizierung eingerichtet haben, übergeben Sie auch Benutzer/Passwort über curl und geben den Port 9200 an, falls Sie ihn nicht geändert haben. Wenn eine Antwort wie die unten angegebene eintrifft, ist alles in Ordnung.

[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" : "Sie wissen schon, für die Suche"
}
[elastic@elasticsearch ~]$

Wenn die Antwort nicht kommt, kann es mehrere Arten von Fehlern geben: Der Elasticsearch-Prozess funktioniert nicht, der falsche Port wurde angegeben oder der Port wird durch die Firewall auf dem Server, auf dem Elasticsearch installiert ist, blockiert.

Wir betrachten, wie wir Protokolle durch die Firewall Check Point an Logstash senden können.

Mit dem Check Point Management-Server können Protokolle über Syslog an Logstash gesendet werden, indem das Dienstprogramm log_exporter verwendet wird. Detaillierte Informationen dazu finden Sie hier. Artikel, hier lassen wir nur den Befehl, der den Stream erstellt, übrig:

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

<> — der Server, auf dem Logstash läuft. target-port 5555 — der Port, an den wir die Protokolle senden werden. Das Senden von Protokollen über TCP kann den Server belasten, deshalb ist es in einigen Fällen sinnvoller, UDP zu verwenden.

Wir konfigurieren den INPUT im Logstash-Konfigurationsfile

2. Elastic Stack: Analyse der Sicherheitsprotokolle. Logstash

Standardmäßig befindet sich die Konfigurationsdatei im Verzeichnis /etc/logstash/conf.d/. Die Konfigurationsdatei besteht aus drei sinnvollen Teilen: INPUT, FILTER, OUTPUT. In INPUT geben wir an, wo das System die Protokolle hernehmen soll; in FILTER parsen wir das Protokoll – wir konfigurieren, wie die Nachricht in Felder und Werte aufgeteilt wird; in OUTPUT konfigurieren wir den ausgehenden Stream – wohin die geparsten Protokolle gesendet werden.

Zuerst konfigurieren wir INPUT und betrachten einige Typen, die nützlich sein könnten – file, tcp und exe.

Tcp:

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

mode => «server»
Dieses bedeutet, dass Logstash Verbindungen akzeptiert.

port => 5555
host => "10.10.1.205"
Wir akzeptieren Verbindungen über die IP-Adresse 10.10.1.205 (Logstash), Port 5555 – der Port muss durch die Firewall-Richtlinien freigegeben sein.

type => «checkpoint»
Wir kennzeichnen das Dokument, was besonders praktisch ist, wenn Sie mehrere eingehende Verbindungen haben. Für jede Verbindung können Sie später einen eigenen Filter mithilfe einer logischen Bedingung erstellen.

Datei:

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

Beschreibung der Einstellungen:
path => "/var/log/openvas_report/*"
Geben Sie das Verzeichnis an, aus dem die Dateien gelesen werden sollen.

type => "openvas"
Art des Ereignisses.

start_position => "beginning"
Beim Ändern der Datei wird die gesamte Datei gelesen. Wenn Sie "end" einstellen, wartet das System auf neue Einträge am Ende der Datei.

Exec:

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

Über diesen Input wird (nur!) ein Shell-Befehl ausgeführt, und dessen Ausgabe wird in eine Lognachricht eingebettet.

command => "ls -alh"
Der Befehl, dessen Ausgabe für uns von Interesse ist.

interval => 30
Intervall für die Ausführung des Befehls in Sekunden.

Um Protokolle von der Firewall zu empfangen, geben wir einen Filter an tcp oder udp, je nachdem, wie die Protokolle an Logstash gesendet werden.

Wir konfigurieren den Output in der Konfigurationsdatei von Logstash im Debug-Modus, um zu verstehen, wie die Lognachricht aussieht.

Nachdem wir den INPUT konfiguriert haben, müssen wir verstehen, wie die Protokollnachricht aussehen wird und welche Methoden zur Konfiguration des Log-Filters (Parsers) erforderlich sind.

Dafür verwenden wir einen Filter, der das Ergebnis in stdout ausgibt, um die ursprüngliche Nachricht anzusehen. Die vollständige Konfigurationsdatei sieht derzeit wie folgt aus:

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

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

Wir führen den Befehl zur Überprüfung aus:
sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/checkpoint.conf
Wir sehen das Ergebnis, das Bild ist anklickbar:

2. Elastic Stack: Analyse der Sicherheitsprotokolle. Logstash

Wenn Sie dies kopieren, sieht es so aus:

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

Anhand der vorliegenden Nachrichten erkennen wir, dass die Protokolle im Format: Feld = Wert oder Schlüssel = Wert vorliegen, was bedeutet, dass der Filter namens kv geeignet ist. Um den Filter für jeden spezifischen Fall richtig auszuwählen, wäre es empfehlenswert, sich in der technischen Dokumentation einzulesen oder einen Kollegen zu fragen.

Filter einrichten

Im vorherigen Schritt haben wir kv ausgewählt. Hier ist die Konfiguration dieses Filters:

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

Wählen Sie das Zeichen, nach dem wir das Feld und den Wert teilen werden – „=“. Wenn in den Logs identische Einträge vorhanden sind, speichern wir nur ein Exemplar in der Datenbank, andernfalls erhalten Sie ein Array aus gleichen Werten. Das heißt, wenn wir die Nachricht „foo = some foo=some“ haben, speichern wir nur foo = some.

Richten Sie die korrekte Ausgabe in ElasticSearch ein.

Nachdem der Filter eingerichtet ist, können die Logs in die Datenbank exportiert werden. elasticsearch:

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

Wenn das Dokument als Typ checkpoint signiert ist, speichern wir das Ereignis in die ElasticSearch-Datenbank, die standardmäßig Verbindungen auf 10.10.1.200 über Port 9200 akzeptiert. Jedes Dokument wird in einen bestimmten Index gespeichert, in diesem Fall wird es im Index „checkpoint-” + aktuelles Datum gespeichert. Jeder Index kann eine bestimmte Menge von Feldern haben oder wird automatisch erstellt, wenn ein neues Feld in der Nachricht erscheint. Die Einstellungen der Felder und deren Typen können in den Mappings eingesehen werden.

Wenn Sie die Authentifizierung eingerichtet haben (darauf werden wir später eingehen), müssen die Zugangsdaten für das Schreiben in einen bestimmten Index angegeben werden, in diesem Beispiel "tssolution" mit dem Passwort "cool". Benutzerrechte können so festgelegt werden, dass Logs nur in einen bestimmten Index geschrieben werden und nicht in andere.

Wir starten Logstash.

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

Überprüfen Sie die Konfigurationsdatei auf Richtigkeit:
/usr/share/logstash/bin//logstash -f checkpoint.conf
2. Elastic Stack: Analyse der Sicherheitsprotokolle. Logstash

Wir starten den Logstash-Prozess:
sudo systemctl start logstash

Überprüfen Sie, ob der Prozess gestartet ist:
sudo systemctl status logstash

2. Elastic Stack: Analyse der Sicherheitsprotokolle. Logstash

Überprüfen Sie, ob der Socket hochgefahren wurde:
netstat -nat | grep 5555

2. Elastic Stack: Analyse der Sicherheitsprotokolle. Logstash

Wir überprüfen die Protokolle in Kibana.

Nachdem alles gestartet ist, gehen wir zu Kibana — Discover und stellen sicher, dass alles richtig konfiguriert ist, das Bild ist klickbar!

2. Elastic Stack: Analyse der Sicherheitsprotokolle. Logstash

Alle Logs sind vorhanden und wir können alle Felder und deren Werte sehen!

Fazit

Wir haben betrachtet, wie man eine Logstash-Konfigurationsdatei erstellt, und dabei einen Parser für alle Felder und Werte erhalten. Jetzt können wir mit der Suche und der Erstellung von Grafiken für bestimmte Felder arbeiten. Im weiteren Verlauf des Kurses werden wir die Visualisierung in Kibana behandeln und ein einfaches Dashboard erstellen. Es sei erwähnt, dass die Logstash-Konfigurationsdatei in bestimmten Situationen ständig angepasst werden muss, zum Beispiel, wenn wir den Wert eines Feldes von einer Zahl in ein Wort ändern möchten. In den kommenden Artikeln werden wir dies regelmäßig tun.

Also bleiben Sie dran für Updates (Telegram, Facebook, VK, TS Solution Blog), Yandex.Zen.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster