Files
pingu-infra/scripts/ssh-analyzer.sh
T
2026-04-26 18:13:10 +00:00

113 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
#############################################
# 🔐 CONFIG
#############################################
# Telegram Bot Token (⚠️ später besser auslagern!)
TOKEN="8101319618:AAHboFVVgmLPccJB0MDr_R2g0K90hkGqkRw"
CHAT_ID="581059353"
# Alle überwachten Hosts
PIS=("192.168.178.2" "192.168.178.3" "192.168.178.5" "localhost")
# Datei zur Speicherung des letzten Checks
STATE_FILE="/home/kai/.ssh-monitor-lastcheck"
#############################################
# 🧠 INITIALISIERUNG
#############################################
# Falls keine State-Datei existiert → jetzt erstellen
if [ ! -f "$STATE_FILE" ]; then
date --iso-8601=seconds > "$STATE_FILE"
fi
LAST_CHECK=$(cat "$STATE_FILE")
NOW=$(date --iso-8601=seconds)
#############################################
# 🔧 SSH WRAPPER (WICHTIG FÜR CRON)
#############################################
SSH_OPTS="-o ConnectTimeout=5 \
-o StrictHostKeyChecking=accept-new \
-o BatchMode=yes \
-o UserKnownHostsFile=/home/kai/.ssh/known_hosts"
#############################################
# 🔁 HAUPTSCHLEIFE ÜBER ALLE HOSTS
#############################################
for PI in "${PIS[@]}"
do
#########################################
# 🏠 LOKALER HOST (kein SSH nötig)
#########################################
if [ "$PI" == "localhost" ]; then
LOG=$(journalctl -u ssh --since "$LAST_CHECK" --no-pager 2>/dev/null || true)
HOST=$(hostname)
else
#########################################
# 🌐 REMOTE HOST VIA SSH
#########################################
LOG=$(ssh $SSH_OPTS kai@$PI \
"journalctl -u ssh --since \"$LAST_CHECK\" --no-pager" 2>/dev/null || true)
HOST=$(ssh $SSH_OPTS kai@$PI hostname 2>/dev/null || echo "$PI")
fi
#############################################
# 🚨 ANALYSE: FAILED LOGINS
#############################################
if [ -n "$LOG" ]; then
FAILS=$(echo "$LOG" | grep "Failed password" | wc -l)
else
FAILS=0
fi
#############################################
# 📊 DETAILS ZU ANGREIFERN
#############################################
if [ "$FAILS" -gt 0 ]; then
IPS=$(echo "$LOG" | grep "Failed password" \
| awk '{print $(NF-3)}' \
| sort | uniq -c | sort -nr)
#########################################
# 📡 TELEGRAM ALERT
#########################################
MESSAGE="🚨 SSH Angriff erkannt!
Host: $HOST ($PI)
Fehlversuche: $FAILS
Top Angreifer:
$IPS"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE" >/dev/null
fi
done
#############################################
# 💾 STATE UPDATE
#############################################
echo "$NOW" > "$STATE_FILE"