94060b1ba2
Zeitstempel pro Alarm vorher: kein Zeitpunkt jetzt: exakte Event-Zeit Cron-sicheres SSH BatchMode (kein Hängen) known_hosts sauber genutzt accept-new für neue Nodes
104 lines
2.5 KiB
Bash
Executable File
104 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
#############################################
|
|
# 🔐 CONFIG
|
|
#############################################
|
|
|
|
TOKEN="8101319618:AAHboFVVgmLPccJB0MDr_R2g0K90hkGqkRw"
|
|
CHAT_ID="581059353"
|
|
|
|
PIS=("192.168.178.2" "192.168.178.3" "192.168.178.5" "localhost")
|
|
|
|
STATE_FILE="/home/kai/.ssh-monitor-lastcheck"
|
|
|
|
|
|
#############################################
|
|
# 🧠 INITIALISIERUNG
|
|
#############################################
|
|
|
|
if [ ! -f "$STATE_FILE" ]; then
|
|
date --iso-8601=seconds > "$STATE_FILE"
|
|
fi
|
|
|
|
LAST_CHECK=$(cat "$STATE_FILE")
|
|
NOW=$(date --iso-8601=seconds)
|
|
|
|
|
|
#############################################
|
|
# 🔧 SSH SETTINGS (CRON SAFE)
|
|
#############################################
|
|
|
|
SSH_OPTS="-o ConnectTimeout=5 \
|
|
-o StrictHostKeyChecking=accept-new \
|
|
-o BatchMode=yes \
|
|
-o UserKnownHostsFile=/home/kai/.ssh/known_hosts"
|
|
|
|
|
|
#############################################
|
|
# 🔁 HAUPTSCHLEIFE
|
|
#############################################
|
|
|
|
for PI in "${PIS[@]}"
|
|
do
|
|
|
|
#########################################
|
|
# 🏠 LOCAL HOST
|
|
#########################################
|
|
if [ "$PI" == "localhost" ]; then
|
|
|
|
LOG=$(journalctl -u ssh --since "$LAST_CHECK" --no-pager 2>/dev/null || true)
|
|
HOST=$(hostname)
|
|
|
|
else
|
|
|
|
#########################################
|
|
# 🌐 REMOTE HOST
|
|
#########################################
|
|
|
|
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 (sauber gefiltert)
|
|
#############################################
|
|
|
|
FAILS=$(echo "$LOG" | grep "Failed password for" | wc -l)
|
|
|
|
|
|
#############################################
|
|
# 🚨 ALERT LOGIC
|
|
#############################################
|
|
|
|
if [ "$FAILS" -gt 0 ]; then
|
|
|
|
EVENT_TIME=$(date '+%Y-%m-%d %H:%M:%S')
|
|
|
|
IPS=$(echo "$LOG" | grep "Failed password for" \
|
|
| awk '{print $(NF-3)}' \
|
|
| sort | uniq -c | sort -nr)
|
|
|
|
MESSAGE="🚨 SSH Angriff erkannt!
|
|
Zeit: $EVENT_TIME
|
|
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" |