Logs sind das Gedächtnis jeder IT-Infrastruktur. Ob Firewall, Webserver oder Proxy – ohne Logauswertung bleibt die Fehlersuche oft reines Rätseln. Python eignet sich bestens, um Logdateien zu analysieren, zu filtern und aufzubereiten.
In diesem Artikel schauen wir uns zwei Beispiele an:
- Grundlagen der Logauswertung mit Python und Regex
- Gezieltes Filtern von Check Point VPN Logs
Warum Python für Logauswertung?
Python bringt von Grund auf alles mit, was man für Loganalyse braucht:
- einfache Dateiverarbeitung
- Regex matching (re)
- effiziente Datenstrukturen (deque, collections)
- einfache Lesbarkeit
Gerade im Security-Umfeld ist das ein grosser Vorteil, da Skripte schnell angepasst und erweitert werden können.
Beispiel 1: Einfache Logauswertung mit Regex
Beispielhafte Logdatei (access.log)
Wir starten mit einem einfachen Access-Log, wie man es z. B. von Proxies oder Webservern kennt:
192.168.20.10 10.10.10.10 443 [23.01.2026 08:05:56] accept [accepted by policy] 192.168.20.10 10.10.10.15 443 [23.01.2026 08:05:59] accept [accepted by policy] 192.168.20.10 10.10.10.20 443 [23.01.2026 08:06:01] accept [accepted by policy] 192.168.20.20 10.10.10.10 8443 [23.01.2026 08:07:45] drop [drop by cleanup]
Jede Zeile enthält:
- Source IP
- Destination IP
- Port
- Zeitstempel
- Aktion (accept / drop)
- Grund der Entscheidung
Python-Script zur Auswertung
import re
# Define the path of the log file
logfile = "access.log"
# Regex matching pattern
pattern = re.compile(
r'(?P<src_ip>\S+) '
r'(?P<dst_ip>\S+) '
r'(?P<port>\S+) '
r'\[(?P<datetime>[^\]]+)\] '
r'(?P<action>\S+) '
r'\[(?P<reason>[^\]]+)\]'
)
with open(logfile, 'r') as file:
for line in file:
match = pattern.match(line)
if match:
src_ip = match.group('src_ip')
dst_ip = match.group('dst_ip')
port = match.group('port')
datetime = match.group('datetime')
action = match.group('action')
reason = match.group('reason')
print(
f"Source IP: {src_ip}, "
f"Destination IP: {dst_ip}, "
f"Port: {port}, "
f"Datetime: {datetime}, "
f"Action: {action}, "
f"Reason: {reason}"
)
Was passiert hier genau?
- Regex mit Named Groups
Durch (?P<name>…) bekommen die einzelnen Logfelder sprechende Namen. - Zeilenweise Verarbeitung
Die Logdatei wird speicherschonend Zeile für Zeile gelesen. - Strukturierte Ausgabe
Statt unübersichtlichem Text erhalten wir klar benannte Felder.
Dieses Prinzip ist die Basis für:
- Statistiken (z. B. Drops pro IP)
- CSV-Export
- Alerting bei bestimmten Aktionen
Beispiel 2: Check Point VPN Logs gezielt filtern
Während einfache Access-Logs übersichtlich sind, sehen reale Firewall-Logs deutlich komplexer aus. Besonders iked und vpnd Logs bei Check Point VPN-Problemen können schnell mehrere tausend Zeilen umfassen.
Hier hilft ein Skript, das:
- nach einem bestimmten Peer sucht
- Kontextzeilen anzeigt
- optional nur Fehler oder Fehlschläge filtert
Ziel des Skripts
- Suche nach Peer-IP oder Namen
- Anzeige von Kontextzeilen vor und nach dem Treffer
- Filteroptionen:
- –error → nur Error/Fatal
- –failed → nur fehlgeschlagene Aushandlungen
Python-Script zur iked / vpnd Analyse
# +----------------------------------------------------------+
# | Script Name: analyse_vpn_logs.py |
# | Copyright: Copyright (c) https://www.avantec.ch |
# | Last revision: 06.02.2026 |
# +----------------------------------------------------------+
import sys
import os
import argparse
from collections import deque
# Argument parsing
parser = argparse.ArgumentParser(description="Checkpoint VPN peer log viewer")
parser.add_argument("peer", help="Peer IP or name")
parser.add_argument(
"--context",
type=int,
default=5,
help="Number of context lines before and after a match"
)
parser.add_argument(
"--error",
action="store_true",
help="Show only error-level entries"
)
parser.add_argument(
"--failed",
action="store_true",
help="Show only failure-related entries"
)
args = parser.parse_args()
# Get peer / context from args
PEER = args.peer
CONTEXT = args.context
# Environment / log paths
fwdir = os.environ.get("FWDIR") # Standard path for vpnd and iked log files in $FWDIR
if not fwdir:
sys.exit("ERROR: FWDIR environment variable is not set")
# Define log files location
LOG_FILES = [
os.path.join(fwdir, "log", "test_iked1.elg"),
os.path.join(fwdir, "log", "test_vpnd.elg")
]
# Filter definitions
ERROR_KEYWORDS = ["error", "fatal"]
FAILED_KEYWORDS = [
"failed",
"failure",
"doomed",
"no proposal",
"authentication"
]
def line_matches_filters(line):
text = line.lower()
if args.error and not any(k in text for k in ERROR_KEYWORDS):
return False
if args.failed and not any(k in text for k in FAILED_KEYWORDS):
return False
return True
def block_matches_filters(block_lines):
# If no filters are enabled, always show the block
if not (args.error or args.failed):
return True
return any(line_matches_filters(line) for line in block_lines)
# Main processing loop
for log_file in LOG_FILES:
print(f"\n=== {log_file} ===")
try:
with open(log_file, "r", errors="ignore") as f:
buffer = deque(maxlen=CONTEXT)
for line in f:
if PEER in line:
block = []
# Add context before
block.extend(buffer)
# Add trigger line
block.append(line)
# Add context after
for _ in range(CONTEXT):
try:
following_line = next(f)
block.append(following_line)
except StopIteration:
break
# Apply filters to the whole block
if block_matches_filters(block):
print("------ context ------")
for l in block:
print(l.rstrip())
print("---- context end ----")
buffer.append(line)
except FileNotFoundError:
print("File not found")
Module importieren
import sys import os import argparse from collections import deque
Zunächst werden die nötigen Module importiert – insbesondere argparse für Kommandozeilenparameter und deque für effizientes Kontext-Handling.
Argumente definieren
parser = argparse.ArgumentParser(description="Checkpoint VPN peer log viewer")
parser.add_argument("peer", help="Peer IP or name")
parser.add_argument("--context", type=int, default=5)
parser.add_argument("--error", action="store_true")
parser.add_argument("--failed", action="store_true")
args = parser.parse_args()
So lässt sich das Skript flexibel nutzen, z. B.:
python3 vpnlog.py 1.2.3.4 --context 10 --failed
Logpfade aus der Umgebung
fwdir = os.environ.get("FWDIR")
if not fwdir:
sys.exit("ERROR: FWDIR environment variable is not set")
LOG_FILES = [
os.path.join(fwdir, "log", "test_iked1.elg"),
os.path.join(fwdir, "log", "test_vpnd.elg")
]
In Check Point Systemen zeigt $FWDIR standardmässig auf das Installationsverzeichnis – ein sauberer, portabler Ansatz.
Filterlogik
ERROR_KEYWORDS = ["error", "fatal"] FAILED_KEYWORDS = [ "failed", "failure", "doomed", "no proposal", "authentication" ]
Diese Schlüsselwörter spiegeln typische VPN-Probleme wider:
- Phase-1/2-Fehler
- Proposal-Mismatch
- Authentifizierungsprobleme
Kontextbasierte Logausgabe
buffer = deque(maxlen=CONTEXT)
Der deque speichert die letzten Zeilen vor einem Treffer. Sobald der Peer gefunden wird, werden:
- vorherige Zeilen
- die Trefferzeile
- folgende Zeilen
als zusammenhängender Block ausgegeben.
Das ist extrem hilfreich, um den Verbindungsaufbau im zeitlichen Zusammenhang zu verstehen.
Fazit
Python ist ein mächtiges Tool für Logauswertung – vom simplen Access-Log bis zur komplexen VPN-Fehleranalyse auf Check Point Firewalls.
Die wichtigsten Learnings:
- Regex bringt Struktur in unstrukturierte Logs
- Named Groups erhöhen Lesbarkeit und Wartbarkeit
- Kontextbasierte Analyse spart enorm Zeit bei der Fehlersuche
Gerade im Security- und Netzwerkumfeld lassen sich mit wenigen Zeilen Python Werkzeuge bauen, welche die Log-Analyse vereinfachen und verbessern.
Freezing Penguin
Freezing Penguin ist Security Engineer bei der AVANTEC AG. Er interessiert sich für alles rund um das Thema Netzwerksicherheit und arbeitet besonders gerne mit Firewalls. In seiner Freizeit spielt er gerne Videospiele und treibt Sport.
