Logwatch/fail2ban

Aus Foxwiki

Einführung

Logwatch
  • Logwatch ist ein Tool, das logfiles ausliest und zusammenfasst
  • Der so generierte Report kann zB per E-Mail versand werden
  • Dadurch kann man die Aktivitäten auf einem Server durch Überfliegen des Reports bewerten und Probleme ggf. frühzeitig erkennen
Fail2ban
  • fail2ban ist ein Tool, um wiederholte scheiternde Loginversuche automatisch zu erkennen und danach die Quell-IP-Adresse für einen bestimmten Zeitraum zu sperren
  • Wird eine IP-Adresse gesperrt, nennt sich das Ban (to ban - engl. für sperren)
  • Wird eine IP-Adresse nach der Sperrfrist wieder entsperrt, so nennt sich das Unban
  • Damit können zB brute force Attacken nach wenigen Versuchen unterbunden werden

Vorgehensweise

Ziele

  • Die fail2ban Logfiles können von logwatch bereits von Haus aus ausgewertet werden
  • Allerdings entspricht der Report nicht meinen Wünschen, denn man erhält eine Liste aller erkannten Login-Versuche und der Bans und Unbans - und das können recht viele sein
  • Mein Wunsch: ich will nur Bans und Unbans sehen und eine Summe der Bans und Unbans

Einrichtung von logwatch

Logfile-Gruppe definieren

Dazu folgende Datei anlegen/bearbeiten: /etc/logwatch/conf/logfiles/fail2ban.conf

# /etc/logwatch/conf/logfiles/fail2ban.conf


# The LogFile path is relative to /var/log by default.
# You can change the default by setting LogDir.
LogFile = fail2ban.log

# This enables searching through zipped archives as well.
Archive = fail2ban.log.*.gz

# Expand the repeats (actually just removes them now).
*ExpandRepeats

Service definieren

Dazu folgende Datei anlegen/bearbeiten: /etc/logwatch/conf/services/fail2ban.conf

# /etc/logwatch//services/fail2ban.conf

# title shown in the report
Title = fail2ban-messages

# logfile group
LogFile = fail2ban

Parse-File

Skript zum Auslesen und Zusammenfassen der Logfiles im gewünschten Umfang

Dazu folgende Datei anlegen/bearbeiten: /etc/logwatch/scripts/services/fail2ban

#!/usr/bin/env bash
# /etc/logwatch/scripts/services/fail2ban

# Change the line separator to split by new lines.
OLD_IFS=$IFS
IFS=$'\n'

# set vars to 0
BANS=0
UNBANS=0

# The contents of the log file are given in stdin.
for LINE in $( cat /dev/stdin ); do
 # Only lines matching this regexp will be included.
 if echo $LINE|egrep 'NOTICE' &> /dev/null; then
 # Every line we echo here will be included in the logwatch report.
 echo $LINE
 fi

 if echo $LINE|egrep 'NOTICE.*Ban' &> /dev/null; then
 BAN=$[$BAN + 1]
 fi
 if echo $LINE|egrep 'NOTICE.*Unban' &> /dev/null; then
 UNBAN=$[$UNBAN + 1]
 fi
done

echo "$BAN Bans, $UNBAN Unbans"
Hinweise
  • Bei fail2ban werden die Bans und Unbans mit dem Tag NOTICE markiert
  • Daher gibt dieses Skript nur Zeilen aus, die „NOTICE“ enthalten
  • Für die Berechnung der Anzahl von Bans und Unbans prüft es die Zeilen mit „NOTICE“ ferner auf „Ban“ oder „Unban“ und zählt entsprechend die Variablen hoch

Test

Ein Test kann mit folgendem Kommando durchgeführt werden

logwatch --detail high --service fail2ban

# Ausgabe: IP-Adressen wurden anonymisiert, Ausgabe gekürzt

################### Logwatch 7.4.0 (05/29/13) ####################
 Processing Initiated: Wed Feb 20 08:54:32 2019
 Date Range Processed: yesterday
 ( 2019-Feb-19 )
 Period is day.
 Detail Level of Output: 10
 Type of Output/Format: stdout / text
 Logfiles for Host: host.host.tld
 ##################################################################

--------------------- fail2ban-messages Begin (detail=1) ------------------------

2019-02-19 00:03:59,539 fail2ban.actions [5355]: NOTICE [plesk-saslauth] Unban 190.220.147.x
 2019-02-19 00:44:26,540 fail2ban.actions [5355]: NOTICE [plesk-postfix] Ban 190.220.147.x
[...]
 2019-02-19 23:37:27,514 fail2ban.actions [5355]: NOTICE [plesk-saslauth] Unban 119.28.66.x
 20 Bans, 24 Unbans

Quellen