Inhaltsverzeichnis
Einleitung
Der Artikel gehört zu meiner Serie „Bereitstellung eines Elastic SIEM„.
Standardszenarien kann man mit den Elastic Agents und deren Integrations gut und einfach abbilden. Wenn die Log-Source aber unbekannte Logs liefert, dann kann der Agent damit nichts anfangen und zeigt nur Parsing-Fehler an:
Ein Logstash kann als Vermittler zwischen der Log-Source und ElasticSearch dienen. Er nimmt auf seinen Listener-Ports Verbindungen und deren Roh-Logs entgegen und konvertiert sie in das für ElasticSearch verständliche json-Format. Das Parsing der Logs kann dabei gut angepasst werden.
Da ich bereits 2 Log-Sources in meiner Infrastruktur identifiziert habe (HAProxy und Snort), wird es nun Zeit, mein ElasticSearch und Kibana mit einem Logstash zu einem ELK-Stack zu verbinden.
Installation eines Logstash
In größeren Umgebungen lohnt sich die Installation auf separaten Servern. Meine Infrastruktur ist klein, daher installiere ich Logstash auf meinem Server zusammen mit ElasticSearch und Kibana.
Logstash benötigt Java und steht selber als Paket im Repository von Elastic zur Verfügung. Ich melde mich also mit SSH auf meinem SIEM-Server an und führe folgende Befehle aus:
java -version
sudo apt install openjdk-21-jre-headless
java -version
sudo apt install logstash
sudo systemctl stop logstash
Konfiguration von Logstash
Logstash muss wissen, welche IP und welchen Port ElasticSearch verwendet, damit er selber seine fertigen Logs übertragen kann. In meinem Basissetup hat das Setup für ElasticSearch ein Zertifikat erstellt. Diesem muss Logstash vertrauen. Im Browser kann man das gut sehen:
‚Den verwendeten PublicKey erhalte ich mit openssl. Den markierten Text kopiere ich im SSH in die Zwischenablage:
echo -n | openssl s_client -connect localhost:9200 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
sudo nano /etc/ssl/cert/siem9200.crt
Nun benötige ich noch einen API-Key, damit Logstash sich am ElasticSearch anmelden kann. Den Key bekomme ich im Kibana unter Stack-Management/Security/API keys:
Ich vergebe einen passenden Namen und klicke auf „create api key“:
Achtung: Der Key kann nur einmal angezeigt werden. Hier benötige ich das richtige Format für den Logstash:
Die Konfiguration des Services kommt in das Verzeichnis /etc/logstash/conf.d. Hier erstelle ich mit nano eine erste Datei:
sudo nano /etc/logstash/conf.d/logstash.conf
Der Inhalt der Datei wird nun angepasst. Die Datei besteht aus mehreren Sektionen. Unter „Input“ wird der Listener definiert. Ich erstelle für meine HAProxy-Syslogs einen UDP-Listener auf der IP-Adresse meines ELK-Servers. Dieser soll aber auf einem höheren Port laufen, damit Logstash nicht als root betrieben werden muss. Die Filter lasse ich aktuell leer. In der Sektion „output“ wird nun definiert, wie der ElasticSearch-Service erreicht werden soll. Hier gehört neben der URL auch der absolute Pfad zur PublicKey-Datei des ElasticSearch und der API-Key rein:
input {
udp {
host => "192.168.100.32"
port => 10001
}
}
filter { }
output {
elasticsearch {
hosts => ["https://ws-siem.ws.its:9200"]
api_key => "CdmV0MVGbchb8hi6_cma:4AgXAtG4RdqCDkS9-FG9Bg"
data_stream => true
ssl => true
cacert => "/etc/ssl/cert/siem9200.crt"
}
}
Nun erstelle ich für diesen Port noch eine Firewall-Ausnahme:
sudo ufw allow 10001/udp
Das sollte alles gewesen sein.
Testlauf
Es wird Zeit für einen Check und einen Testlauf. Logstash kann mit 2 zusätzlichen Optionen gestartet werden:
- Konfigurationstest
- Start mit Debug-Option
Ich beginne mit dem Test der Konfiguration:
clear && sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf -t
Das sieht soweit gut aus. Am Ende wird die Konfiguration als valide bestätigt. Weiter geht es mit dem Lauf im Debug-Mode:
clear && sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf
Auch das schaut soweit fein aus. In einer anderen Session prüfe ich den Listener und übertrage ein Demo-Syslog-Event:
sudo ss -ulpe
echo "<14>Test UDP syslog message" >> /dev/udp/192.168.100.32/10001
Das Event sollte ich nun im Elastic finden. Der Suchfilter ist dabei sehr hilfreich:
Logstash ist damit einsatzbereit. 🙂 Ich beende den Debug-Mode mit STRG+C und starte den Service:
sudo systemctl start logstash
sudo systemctl status logstash
Zusammenfassung
Das Fundament ist fertig. Im nächsten Schritt werde ich mich nun um das Parsing meiner HAProxy-Logs kümmern.
Weitere Artikel findet ihr in meiner Serie „Bereitstellung eines Elastic SIEM„.
Stay tuned