Cosa fa#
Legge /var/log/auth.log, trova tutte le righe con Failed password, estrae l'IP sorgente e il timestamp, conta i tentativi per IP e stampa i top 5 con il range temporale. Primo tool di detection scritto da zero.
Come si usa#
# Con file default /var/log/auth.log
python3 failed_logins.py
# Con file specificato
python3 failed_logins.py /percorso/altro/auth.logOutput#
Da 2026-03-24T23:56:53.354973+00:00 a 2026-03-24T23:57:08.887877+00:00
Totale tentativi falliti: 4
192.168.64.1: 4 tentativiScript completo#
#!/usr/bin/env python3
from collections import Counter
import re
import sys
def parse_auth_log(filepath="/var/log/auth.log"):
failed = []
pattern = r"Failed password for .* from (\d+\.\d+\.\d+\.\d+)"
first_ts = None
last_ts = None
with open(filepath, "r") as f:
for line in f:
match = re.search(pattern, line)
if match:
if first_ts is None:
first_ts = line.split()[0]
failed.append(match.group(1))
last_ts = line.split()[0]
return Counter(failed), first_ts, last_ts
if __name__ == "__main__":
filepath = sys.argv[1] if len(sys.argv) > 1 else "/var/log/auth.log"
counts, first_ts, last_ts = parse_auth_log(filepath)
print(f"Da {first_ts} a {last_ts}")
print(f"Totale tentativi falliti: {sum(counts.values())}")
for ip, count in counts.most_common(5):
print(f" {ip}: {count} tentativi")Come funziona — riga per riga#
pattern = r"Failed password for .* from (\d+\.\d+\.\d+\.\d+)"
# regex che matcha righe tipo:
# "Failed password for invalid user pippo from 192.168.1.1 port 22"
# il gruppo () cattura solo l'IPfirst_ts = None
last_ts = None
# traccia primo e ultimo timestamp
# first_ts viene impostato solo una volta (la prima)
# last_ts viene aggiornato ad ogni match (rimane l'ultimo)failed.append(match.group(1))
# aggiunge l'IP (gruppo 1) alla lista
# Counter poi conta quante volte compare ogni IPcounts, first_ts, last_ts = parse_auth_log(filepath)
# Python restituisce piu' valori separati da virgola
# vengono ricevuti con unpackingDove si usa in Blue Team#
Analisi rapida di auth.log per identificare brute force in corso o passato. Output utile per:
- Verificare se un IP specifico sta attaccando
- Capire la finestra temporale dell'attacco
- Decidere se bloccare un IP con
ufw deny from IP
Evoluzione futura: integrare con Claude API per analisi automatica degli IP sospetti (mese 6).
Collegato a#
- log — categoria
- system — categoria
- auth-log — file sorgente analizzato dallo script
- log-analyzer-ai — evoluzione con Claude API


