Zeitstempel, Cron-sicheres SSH

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
This commit is contained in:
kai
2026-04-26 20:35:48 +00:00
parent 145c8b9ae7
commit 94060b1ba2
+11 -20
View File
@@ -4,14 +4,11 @@
# 🔐 CONFIG # 🔐 CONFIG
############################################# #############################################
# Telegram Bot Token (⚠️ später besser auslagern!)
TOKEN="8101319618:AAHboFVVgmLPccJB0MDr_R2g0K90hkGqkRw" TOKEN="8101319618:AAHboFVVgmLPccJB0MDr_R2g0K90hkGqkRw"
CHAT_ID="581059353" CHAT_ID="581059353"
# Alle überwachten Hosts
PIS=("192.168.178.2" "192.168.178.3" "192.168.178.5" "localhost") 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" STATE_FILE="/home/kai/.ssh-monitor-lastcheck"
@@ -19,7 +16,6 @@ STATE_FILE="/home/kai/.ssh-monitor-lastcheck"
# 🧠 INITIALISIERUNG # 🧠 INITIALISIERUNG
############################################# #############################################
# Falls keine State-Datei existiert → jetzt erstellen
if [ ! -f "$STATE_FILE" ]; then if [ ! -f "$STATE_FILE" ]; then
date --iso-8601=seconds > "$STATE_FILE" date --iso-8601=seconds > "$STATE_FILE"
fi fi
@@ -29,7 +25,7 @@ NOW=$(date --iso-8601=seconds)
############################################# #############################################
# 🔧 SSH WRAPPER (WICHTIG FÜR CRON) # 🔧 SSH SETTINGS (CRON SAFE)
############################################# #############################################
SSH_OPTS="-o ConnectTimeout=5 \ SSH_OPTS="-o ConnectTimeout=5 \
@@ -39,14 +35,14 @@ SSH_OPTS="-o ConnectTimeout=5 \
############################################# #############################################
# 🔁 HAUPTSCHLEIFE ÜBER ALLE HOSTS # 🔁 HAUPTSCHLEIFE
############################################# #############################################
for PI in "${PIS[@]}" for PI in "${PIS[@]}"
do do
######################################### #########################################
# 🏠 LOKALER HOST (kein SSH nötig) # 🏠 LOCAL HOST
######################################### #########################################
if [ "$PI" == "localhost" ]; then if [ "$PI" == "localhost" ]; then
@@ -56,7 +52,7 @@ do
else else
######################################### #########################################
# 🌐 REMOTE HOST VIA SSH # 🌐 REMOTE HOST
######################################### #########################################
LOG=$(ssh $SSH_OPTS kai@$PI \ LOG=$(ssh $SSH_OPTS kai@$PI \
@@ -67,31 +63,26 @@ do
############################################# #############################################
# 🚨 ANALYSE: FAILED LOGINS # 🚨 ANALYSE (sauber gefiltert)
############################################# #############################################
if [ -n "$LOG" ]; then FAILS=$(echo "$LOG" | grep "Failed password for" | wc -l)
FAILS=$(echo "$LOG" | grep "Failed password" | wc -l)
else
FAILS=0
fi
############################################# #############################################
# 📊 DETAILS ZU ANGREIFERN # 🚨 ALERT LOGIC
############################################# #############################################
if [ "$FAILS" -gt 0 ]; then if [ "$FAILS" -gt 0 ]; then
IPS=$(echo "$LOG" | grep "Failed password" \ EVENT_TIME=$(date '+%Y-%m-%d %H:%M:%S')
IPS=$(echo "$LOG" | grep "Failed password for" \
| awk '{print $(NF-3)}' \ | awk '{print $(NF-3)}' \
| sort | uniq -c | sort -nr) | sort | uniq -c | sort -nr)
#########################################
# 📡 TELEGRAM ALERT
#########################################
MESSAGE="🚨 SSH Angriff erkannt! MESSAGE="🚨 SSH Angriff erkannt!
Zeit: $EVENT_TIME
Host: $HOST ($PI) Host: $HOST ($PI)
Fehlversuche: $FAILS Fehlversuche: $FAILS