Inhaltsverzeichnis
Einleitung
Ich nutze als interne und externe Firewall mehrere PFSense-Systeme. Diese sollen ebenfalls an mein Elastic SIEM angebunden werden. Ich habe mit dieser Anbindung einige Versuche vor dem Schreiben dieser Anleitung durchgespielt, da mir bis gestern nicht klar war, die die Logdaten der PFSense übermittelt werden sollen. Diese Zeit möchte ich euch sparen und zeigen, wie euch die Integration direkt gelingt.
Der Artikel gehört zu meiner Serie „Bereitstellung eines Elastic SIEM„.
Suche nach einer PFSense-Integration
Ich suche zuerst nach einer Integration, welche das Log-Parsing übernimmt. Mit der Suche unter Management/Integrations ist das einfach:
Die Anleitung sieht verständlich aus, ist aber leider (für meinen Geschmack) nicht ganz vollständig. Daher breche ich sie hier ab:
Bis hier war mir nicht klar, wie der Log-Transfer funktionieren soll. Die Daten können nicht direkt in ElasticSearch übertragen werden, denn Elastic bietet selber keine Schnittstelle für syslog-Daten an. Daher benötigt man einen Agent, welcher die syslog-Daten der PFSense entgegen nimmt. Der Agent konvertiert sie dann in ein für ElasticSearch verständliches json-Format mithilfe der Integration. Und diese zu installierende Integration muss mit einer Agent Policy auf den Agent übertragen werden.
Ich möchte keinen dedizierten Agent bereitstellen. Also installiere ich die Integration in eine bestehende Agent Policy und erweitere damit den Funktionsumfang eines Elastic Agents. In größeren Umgebungen sollte dies ein separater Server sein, der als Empfänger von syslog-Events und als Proxy zum Elastic arbeitet. Meine Umgebung ist klein, daher erweitere ich den Agent auf meinem Elastic Server. Dieser arbeitet bereits als Fleet Agent Server und verwendet eine eigene Agent Policy.
Bereitstellung der PFSense-Integration
Ich suche mir also unter Management/Fleet die Agent Policies und öffne die Fleet Policy:
Die Policy enthält bereits 2 Einträge. Mit „add integration“ füge ich nun die PFSense-Erweiterung dazu:
Hier suche ich die Erweiterung:
Ich klicke auf „add pfsense“:
Nun ändere ich die Bindung an den syslog-Host 0.0.0.0 und damit an alle IPs meines SIEM-Servers. Den Syslog-Port belasse ich auf dem vorgeschlagenen Wert 9001, da ich den Service nicht als Root laufen lassen möchte:
Dann speichere ich die Eingaben. Dabei wird angezeigt, dass gleich ein Agent erweitert wird. Es dauert einen Moment, bis die Integration installiert ist:
Die Agent Policy ist nun um ein Item erweitert:
Auf der Seite Fleet/Agents sehe ich nun, dass die Policy in der Version 2 aktiv ist und der Agent mit dieser Policy aktualisiert wurde (es steht kein update pending daneben):
Nun sollte also der UDP-Port 9001 auf meinem Elastic-Server auf eingehende Verbindungen lauschen. Ich kontrolliere das mit einer SSH-Verbindung. In dieser habe ich vor der Installation und danach geprüft. Der UDP-Listener ist aktiv 🙂 Hier das Bild vorher:
Und hier nach dem Setup:
Der ElasticSearch-Server kann nun also syslog-Events von meinen PFSense-Servern empfangen.
Konfiguration der PFSense
Dafür müssen meine PFSense-Systeme aber wissen, dass sie ihre Logs an den Elastic Agent senden sollen. Diese Konfiguration wurde in der Intregration-Übersicht erläutert. Ich verbinde mich mit meiner Haupt-PFSense. Unter dem Menü Status gibt es den Punkt System Logs. Hier gelange ich zu den Settings:
Ich stelle das Log Message Format auf syslog ein:
Sehr weit unten finde ich den Punkt „Remote Syslog Servers“. Hier steht auch mein aktueller syslog-Server im ersten Feld drin. Im zweiten trage ich nun die IP und den Port meines Agents ein und bestätige mit save:
Kontrolle der Logs
Da ich am Anfang nicht weiß, wie die Events reinkommen, suche ich unter Management/Fleet den Agent und öffne die Option „view agent“:
Hier kann ich auch den Zustand des Listeners kontrollieren:
Ich wechsle auf die Logs und klicke auf „open in Logs Explorer“. Das bringt mich mit einem Filter in die Log-Anzeige:
Im Filter entferne ich den String „and (data_stream.dataset:elastic_agent)“ und aktualisiere die Anzeige. Hier sehe ich bereits tausende Logs meiner PFSense 🙂
Nun suche ich in einem dieser Logs nach einem eindeutigen Marker. Den finde ich unter „event_dataset“:
Dann wechlse ich in Analytics/Discover und erstelle mir damit eine eigene Search. Ich ändere die Data view auf logs-* und gebe „event_dataset: pfsense.log“ als Filter ein. Nun habe ich meine PFSense-Logs in der Anzeige:
Wie ich eine Search aufbaue, habe ich in diesem Artikel bereits beschrieben. Das ist mein Ergebnis:
Das Dashboard
Die Integration bringt aber auch ein eigenes Dashboard mit. Dieses ist unter Analytics/Dashboards zu finden:
Das Dashboard liefert grafisch viele interessante Informationen:
Viele der Items sind aktiv nutzbar, um z.B. Filter zu erstellen:
Einbindung der HAProxy-Logfiles
Auf meiner PFSense arbeitet ein HAProxy als Reverse-Proxy. Dessen Logfiles werden aktuell ebenfalls an einen anderen syslog-Server gesendet. Nun möchte ich seine Logs aber im Elastic haben. Dafür ändere ich das Remote-Logging in der HAProxy-Konfiguration in der PFSense:
Ich ändere den Remote syslog host auf die Logdatei, welche meine PFSense an mein Elasti streamt:
Nun suche ich in den Logs meiner PFSense und finde ein Event vom HAProxy. Leider erlaubt die Option mit „/var/run/log“ keine detaillierten Logs. Daher breche ich die Einbindung ab. Hier benötige ich nun einen Logstash. Dessen Bereitstellung zeige ich in einem anderen Artikel.
Einbindung der Snort-Logfiles
Auf meiner PFSense läuft auch ein Snort mit. Dessen Logfiles werden ebenfalls übertragen auch hier erstelle ich mir eine neue Search. Als Filter nutze ich den event.privider:snort. Leider versteht die Integration aktuell keine Snort-Logs. Das wird in der error.message in den Details angezeigt:
Daher suche ich nach einer passenden Integration. Es gibt eine für Snort-Logs 🙂
Diese füge ich ebenfalls meiner Fleet Agent Policy hinzu:
Hier muss ich aufpassen. Ich kann nicht direkt auf das Logfile zugreifen. Das wäre möglich, wenn ich den Agent auf meiner PFSense installieren würde. Also deaktiviere ich diese Option. Dafür ändere ich die Standardeinstellungen für den udp-Input so, dass der gleiche Port auf allen IPs genutzt wird, auf dem auch die PFSense-Firewall-Logs reinkommen:
Die restlichen Einstellungen belasse ich im Standar und klicke „save and continue“:
Es kommt wieder der Hinweis, dass nun ein Agent aktualisiert wird:
Nun habe ich 4 Items in der Policy:
Leider funktioniert aber auch diese Integration nicht richtig. Auch hier werde ich nicht um einen Logstash herum kommen. 🙁 Die Bereitstellung vom Snort entferne ich wieder aus der Policy:
Abschluss
Meine erste PFSense ist angeschlossen. Ich binde nun die anderen 2 noch an und kann diese Aufgabe als erledigt abhaken. Leider kann ich aktuell die Logs meiner HAProxy und vom Snort IPS nicht parsen. Das würde hier den Rahmen sprengen, daher lagere ich deren Anbindung aus.
Weitere Artikel findet ihr in meiner Serie „Bereitstellung eines Elastic SIEM„.
Stay tuned