Entweder über /etc/daily.local oder direkt in /etc/daily lassen sich einige zusätzliche Zeilen einfügen.
z.B. die letzten Anmeldungen:
last -cT
Oder Netzwerkstatistiken:
Speicherverwaltung:
netstat -m
Protokolle:
netstat -ss
Schnittstellen:
netstat -intd
Sehr interssant wird es bei einer Geschichte, wo ich in pf Tabellen verwende.
Gerade Angriffe auf SSH sind sehr gemein. Ich habe festgelegt, dass maximal 2 Verbindungsversuche in einer Minute "normal" sind, alles darüber hinnaus möchte ich gerne als Angriff identifiziert haben. Die entsprechende Zeile in der pf.conf sieht folgendermaßen aus:
pass in on $ext inet proto tcp from any to ($ext) port 22 keep state (max-src-conn-rate 2/60, overload <blocked> flush global)
Bis "keep state" ist nichts ungewöhnliches zu finden. Dann kommen die Optionen: max-src-conn-rate legt fest, wie viele Verbindung von einer Quelle aus pro ein Zeitraum erlaubt sind. Wird diese Grenze überschritten wird zunächst nur die Quelladresse in die Tabelle "blocked" eingetragen. Zudem werden alle States von und zu dieser Quelle entfernt ("flush global")
Relativ weit oben in meiner pf.conf ist noch der selbsterklärende Eintrag
block drop quick from <blocked>
zu finden.Nun gehen die Angriffe meist von privaten Internetanschlüssen aus, also wo täglich sich die IP-Adresse ändert. Einträge in der Tabelle "blocked" sollten also regelmäßig entfernt werden. Das lässt sich mit /etc/daily und dem Befehl
pfctl -t blocked -T expire 172800
gut realisieren.
Ich hab die Geschichte aber noch etwas erweitert, sodass ich zunächst eine Statistik aller Tabellen erhalte:
pfctl -vvsT
Dann die Tabellen reihenweise durchgehe und mit einer Art Sicherungskopie ermitteln kann, welche Adressen hinzugekommen sind und welche wieder manuell entfernt oder regulär abgelaufen sind. Zum Schluss wird dann noch der aktuelle Stand der Tabelle angezeigt.
Das ganze Snippet sieht dann so aus:
echo "pf tables statistics:" pfctl -vvsT echo "" for pftable in `pfctl -s Tables`; do pfctl -t $pftable -T show > $TMP LAST="/var/log/pftable-$pftable" touch $LAST if ! cmp -s "$TMP" "$LAST"; then echo "new(+) and removed(-) addresses in table $pftable:" diff $LAST $TMP | grep '^[<>]' | sed 'y/<>/-+/' echo "" fi pfctl -t $pftable -T expire 172800 2>&1 | grep -v "^0/0" pfctl -t $pftable -T show > $LAST if ! cmp -s "$TMP" "$LAST"; then echo "expired addresses in table $pftable:" diff $TMP $LAST | grep '^<' | sed 's/</-/' echo "" fi if [ -s "$LAST" ]; then echo "current index of table $pftable:" pfctl -t $pftable -vvT show echo "" fi echo "" doneMit folgenden Kopfdaten:
TMP=`mktemp /tmp/_daily.XXXXXXXXXX` || exit 1